From 90e5cff5072b915aaedac9423fed944baaf860f3 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Mon, 28 Jul 2025 23:43:22 +0530 Subject: [PATCH 01/46] feat: enhance OptimumP2P documentation --- .vitepress/theme/style.css | 31 + docs/learn/overview/p2p.md | 71 +- package-lock.json | 7232 ++++++++++++++++++++++++++++ static/img/P2P_data_flow_dark.png | Bin 0 -> 275480 bytes static/img/P2P_data_flow_light.png | Bin 0 -> 360335 bytes static/img/intro.png | Bin 0 -> 114276 bytes yarn.lock | 1124 +++-- 7 files changed, 7908 insertions(+), 550 deletions(-) create mode 100644 package-lock.json create mode 100644 static/img/P2P_data_flow_dark.png create mode 100644 static/img/P2P_data_flow_light.png create mode 100644 static/img/intro.png diff --git a/.vitepress/theme/style.css b/.vitepress/theme/style.css index 654459d..45ff480 100644 --- a/.vitepress/theme/style.css +++ b/.vitepress/theme/style.css @@ -134,3 +134,34 @@ .DocSearch { --docsearch-primary-color: var(--vp-c-brand-1) !important; } + +/** + * Component: Theme-aware Images + * -------------------------------------------------------------------------- */ + +.theme-aware-image { + position: relative; +} + +.theme-aware-image img { + width: 100%; + height: auto; +} + +/* Hide dark images in light mode */ +.light-mode-only { + display: block !important; +} + +.dark-mode-only { + display: none !important; +} + +/* Show dark images in dark mode, hide light images */ +html.dark .light-mode-only { + display: none !important; +} + +html.dark .dark-mode-only { + display: block !important; +} diff --git a/docs/learn/overview/p2p.md b/docs/learn/overview/p2p.md index b84cd13..c9756b6 100644 --- a/docs/learn/overview/p2p.md +++ b/docs/learn/overview/p2p.md @@ -1,29 +1,66 @@ -# What is OptimumP2P +# OptimumP2P: High-Performance Network Coding for Decentralized Systems -OptimumP2P is a performant message-passing (gossiping) protocol for fast, bandwidth-efficient data propagation in decentralized networks. It is optimized for high speed, low latency, and low bandwidth usage. OptimumP2P leverages Random Linear Network Coding (RLNC), a network coding technique developed at MIT, to address the limitations of traditional gossip protocols. +OptimumP2P is a performant message-passing protocol designed for fast, bandwidth-efficient data propagation in decentralized networks. It leverages Random Linear Network Coding (RLNC), a network coding technique developed at MIT, to address fundamental limitations of traditional gossip protocols in blockchain and distributed systems. -## Message-Passing Systems and Motivation +## Architecture Overview -Gossip protocols are widely used to disseminate information across peer-to-peer networks, including Web3 systems. In blockchain networks, gossip is critical for propagating transactions and blocks. Slow propagation can result in missed block rewards for validators and reduced profitability for MEV optimizers. Efficient message dissemination is essential for network health and participant incentives. +OptimumP2P operates through a distributed architecture consisting of several key components that work together to enable efficient data propagation. -## Limitations of Traditional Gossip +The **Gateway Layer** provides API access and message coordination through HTTP and WebSocket interfaces. The gateway manages client connections, topic registries, and node pool coordination while handling authentication and authorization for secure access to the network. -* High latency: Peers must receive full messages before forwarding. -* Bandwidth waste: Peers may receive multiple redundant copies of the same message. +The **P2P Node Network** implements the core networking protocol using libp2p infrastructure with optimized transport layers. Each node maintains peer connections through DHT-based discovery and supports both native OptimumP2P and fallback GossipSub protocols for maximum compatibility and reliability. -## RLNC and OptimumP2P +The **Protocol Abstraction** layer provides a unified interface that allows seamless switching between different P2P protocols based on network conditions and requirements. This enables dynamic protocol selection and fallback mechanisms to ensure consistent network operation under varying conditions. -* Reduced latency: Forwarding starts with the first shard. -* Bandwidth efficiency: Redundant data is minimized. -* Fault tolerance: Any sufficient subset of shards enables decoding. +**Message Coordination** handles topic-based message routing with single-node-per-topic assignment to prevent duplicate processing and optimize bandwidth utilization across the network. -## Performance Characteristics +## Data Flow and Propagation -* **Latency**: Testnet results show 50%+ reduction in propagation latency compared to Gossipsub. -* **Bandwidth**: RLNC reduces redundant transmissions, achieving sub-linear bandwidth growth as the network scales. -* **Fault tolerance**: The protocol is resilient to packet loss and node churn; partial data is sufficient for message recovery. -* **Scalability**: Efficient for both L1 and L2 chains, and supports high throughput under load. +
+ OptimumP2P Data Flow + OptimumP2P Data Flow +
+ +The data flow diagram illustrates how OptimumP2P integrates with blockchain infrastructure to provide enhanced data propagation. The system operates through three main components: the Validator Node, the Optimum Service, and the Networks layer. + +At the **Validator Node** level, the Optimum Agent interfaces directly with the blockchain client through IPC (Inter-Process Communication). Transaction data flows from the blockchain client to the Optimum Agent, which serves as the bridge between the blockchain infrastructure and the OptimumP2P network. + +The **Optimum Service** acts as the central processing unit where the core RLNC encoding and network coordination takes place. When transaction data arrives from the Optimum Agent, the service applies Random Linear Network Coding to create redundant, encoded shards that can be efficiently propagated across the network. + +The **Networks** component demonstrates the dual-path approach for maximum reliability. The primary path uses Fast Sync through the Optimum Network for rapid propagation using RLNC-encoded data. This network injects encoded shards to global blockchain nodes and validator nodes, ensuring fast delivery of critical information. + +A fallback mechanism ensures network reliability through the standard Blockchain Network using traditional gossip protocols. This dual approach guarantees that even if the OptimumP2P network experiences issues, data can still propagate through conventional means, maintaining network integrity and consensus. + +![Network Introduction](/static/img/intro.png) + +The network topology shows the hierarchical structure where OptimumP2P nodes operate in the upper layer, connecting to gateway nodes that interface with user clients. This architecture enables efficient data distribution from the P2P network down to individual client applications while maintaining scalability and performance. + +## How OptimumP2P Works + +OptimumP2P integrates with networks at the validator level as a software component running on each validator's machine. Block data is read directly from the network client, then sharded and encoded using RLNC before being forwarded to other nodes on the network. The entire process from block data intake to full network propagation takes place in a few hundred milliseconds, maintaining this performance level as data size and frequency scales. + +The system leverages RLNC to reduce the amount of redundant data that needs to be transmitted. Unlike traditional gossip protocols that require complete message reception before forwarding, OptimumP2P allows data forwarding to begin as soon as any shards are received. This approach saves both time and computational resources while improving overall network efficiency. + +## Random Linear Network Coding Implementation + +The RLNC implementation in OptimumP2P provides the mathematical foundation for efficient data propagation. Data objects are systematically encoded into k-of-n coded elements using linear algebra over finite fields. This encoding process creates redundant information that allows complete reconstruction from any k received elements out of n transmitted elements. + +During the encoding process, original data is split into systematic chunks, and linear combinations are computed using randomly generated coefficients. This creates coded shards that contain both original data fragments and encoding vectors. Each shard carries its encoding coefficients, enabling recipients to perform Gaussian elimination for data reconstruction. + +The system includes recoding capability, where intermediate nodes can generate new coded packets by linearly combining received packets. This improves network efficiency without requiring full data reconstruction at intermediate nodes, allowing for more flexible and resilient data propagation paths. + +## Message Types and Protocol Handling + +OptimumP2P defines several message types for efficient network operation. Data messages carry encoded payload data with RLNC coefficients and metadata necessary for reconstruction. Control messages handle subscription management, peer discovery, and protocol negotiation between nodes. Trace events provide network monitoring capabilities by tracking shard propagation and performance metrics throughout the system. + +The protocol employs DHT-based peer discovery with configurable bootstrap nodes to establish and maintain network connectivity. Connection management includes adaptive connection pools that scale dynamically based on network conditions and message throughput, automated failure detection and recovery from node failures or network partitions, and capability-based selection between OptimumP2P and fallback protocols. + +## Security Model + +OptimumP2P implements a comprehensive security model to protect against various attack vectors. The system uses Boneh-Lynn-Shacham (BLS) signatures to provide authentication and non-repudiation for all network communications. Cryptographic hashing ensures data integrity throughout the network, while distributed key management with on-chain registration and verification provides secure identity management. + +The protocol includes protection against pollution attacks through coding-theoretic techniques that detect and mitigate data pollution attempts. Eclipse attacks are prevented through DHT-based discovery with multiple bootstrap nodes, preventing network isolation. Integration with blockchain identity systems provides resistance against Sybil attacks by leveraging existing trust infrastructure. ## Summary -OptimumP2P is a high-performance, developer-friendly protocol for fast, reliable, and bandwidth-efficient data propagation in decentralized networks. By leveraging RLNC, it addresses the limitations of traditional gossip, providing measurable improvements in latency, bandwidth usage, and fault tolerance. The protocol is designed for easy integration, broad compatibility, and robust security, making it suitable for validators, chains, and applications seeking to optimize network performance. +OptimumP2P is a high-performance, developer-friendly protocol for fast, reliable, and bandwidth-efficient data propagation in decentralized networks. By leveraging RLNC, it addresses the limitations of traditional gossip protocols, providing measurable improvements in latency, bandwidth usage, and fault tolerance. The protocol is designed for easy integration, broad compatibility, and robust security, making it suitable for validators, chains, and applications seeking to optimize network performance. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e798920 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,7232 @@ +{ + "name": "docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "markdown-it-mathjax3": "^4.3.2", + "v-tooltip": "^2.1.3", + "vue-clipboard2": "^0.3.3" + }, + "devDependencies": { + "@eslint/js": "^9.22.0", + "@typescript-eslint/eslint-plugin": "^8.26.1", + "@typescript-eslint/parser": "^8.26.1", + "eslint": "^9.22.0", + "eslint-plugin-vue": "^10.0.0", + "globals": "^16.0.0", + "lint-staged": "^15.4.3", + "markdown-it-mathjax3": "^4.3.2", + "markdownlint-cli": "^0.44.0", + "prettier": "^3.5.3", + "typescript": "^5.2.2", + "typescript-eslint": "^8.26.1", + "vitepress": "^1.6.3", + "vue-eslint-parser": "^10.1.1" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.20.4.tgz", + "integrity": "sha512-OZ3Xvvf+k7NMcwmmioIVX+76E/KKtN607NCMNsBEKe+uHqktZ+I5bmi/EVr2m5VF59Gnh9MTlJCdXtBiGjruxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting/node_modules/@algolia/client-common": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz", + "integrity": "sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting/node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz", + "integrity": "sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting/node_modules/@algolia/requester-fetch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz", + "integrity": "sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting/node_modules/@algolia/requester-node-http": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz", + "integrity": "sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.20.4.tgz", + "integrity": "sha512-8pM5zQpHonCIBxKmMyBLgQoaSKUNBE5u741VEIjn2ArujolhoKRXempRAlLwEg5hrORKl9XIlit00ff4g6LWvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz", + "integrity": "sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz", + "integrity": "sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/requester-fetch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz", + "integrity": "sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/requester-node-http": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz", + "integrity": "sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.34.1.tgz", + "integrity": "sha512-otPWALs72KvmVuP0CN0DI6sqVx1jQWKi+/DgAiP8DysVMgiNlva3GDKTtAK6XVGlT08f4h32FNuL0yQODuCfKA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.20.4.tgz", + "integrity": "sha512-MroyJStJFLf/cYeCbguCRdrA2U6miDVqbi3t9ZGovBWWTef7BZwVQG0mLyInzp4MIjBfwqu3xTrhxsiiOavX3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights/node_modules/@algolia/client-common": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz", + "integrity": "sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights/node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz", + "integrity": "sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights/node_modules/@algolia/requester-fetch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz", + "integrity": "sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights/node_modules/@algolia/requester-node-http": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz", + "integrity": "sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.20.4.tgz", + "integrity": "sha512-bVR5sxFfgCQ+G0ZegGVhBqtaDd7jCfr33m5mGuT43U+bH//xeqAHQyIS4abcmRulwqeIAHNm5Yl2J7grT3z//A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz", + "integrity": "sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization/node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz", + "integrity": "sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization/node_modules/@algolia/requester-fetch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz", + "integrity": "sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization/node_modules/@algolia/requester-node-http": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz", + "integrity": "sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.4.tgz", + "integrity": "sha512-ZHsV0vceNDR87wIVaz7VjxilwCUCkzbuy4QnqIdnQs3NnC43is7KKbEtKueuNw+YGMdx+wmD5kRI2XKip1R93A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions/node_modules/@algolia/client-common": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz", + "integrity": "sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions/node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz", + "integrity": "sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions/node_modules/@algolia/requester-fetch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz", + "integrity": "sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions/node_modules/@algolia/requester-node-http": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz", + "integrity": "sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.34.1.tgz", + "integrity": "sha512-bt5hC9vvjaKvdvsgzfXJ42Sl3qjQqoi/FD8V7HOQgtNFhwSauZOlgLwFoUiw67sM+r7ehF7QDk5WRDgY7fAkIg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.34.1", + "@algolia/requester-browser-xhr": "5.34.1", + "@algolia/requester-fetch": "5.34.1", + "@algolia/requester-node-http": "5.34.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.20.4.tgz", + "integrity": "sha512-idAe53XsTlLSSQ7pJcjscUEmc67vEM+VohYkr78Ebfb43vtfKH0ik8ux9OGQpLRNGntaHqpe/lfU5PDRi5/92w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion/node_modules/@algolia/client-common": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz", + "integrity": "sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion/node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz", + "integrity": "sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion/node_modules/@algolia/requester-fetch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz", + "integrity": "sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion/node_modules/@algolia/requester-node-http": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz", + "integrity": "sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.20.4.tgz", + "integrity": "sha512-O6HjdSWtyu5LhHR7gdU83oWbl1vVVRwoTxkENHF61Ar7l9C1Ok91VtnK7RtXB9pJL1kpIMDExwZOT5sEN2Ppfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring/node_modules/@algolia/client-common": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz", + "integrity": "sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring/node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz", + "integrity": "sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring/node_modules/@algolia/requester-fetch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz", + "integrity": "sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring/node_modules/@algolia/requester-node-http": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz", + "integrity": "sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.20.4.tgz", + "integrity": "sha512-p8M78pQjPrN6PudO2TnkWiOJbyp/IPhgCFBW8aZrLshhZpPkV9N4u0YsU/w6OoeYDKSxmXntWQrKYiU1dVRWfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/client-common": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz", + "integrity": "sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz", + "integrity": "sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-fetch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz", + "integrity": "sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-node-http": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz", + "integrity": "sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.34.1.tgz", + "integrity": "sha512-567LfFTc9VOiPtuySQohoqaWMeohYWbXK71aMSin+SLMgeKX7hz5LrVmkmMQj9udwWK6/mtHEYZGPYHSuXpLQg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.34.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.34.1.tgz", + "integrity": "sha512-YRbygPgGBEik5U593JvyjgxFjcsyZMR25eIQxNHvSQumdAzt5A4E4Idw3yXnwhrmMdjML54ZXT7EAjnTjWy8Xw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.34.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.34.1.tgz", + "integrity": "sha512-o0mqRYbS82Rt4DE02Od7RL6pNtV7oSxScPuIw8LW4aqO2V5eCF05Pry/SnUgcI/Vb2QCYC66hytBCqzyC/toZA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@algolia/client-common": "5.34.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", + "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.1.0.tgz", + "integrity": "sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz", + "integrity": "sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.22.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz", + "integrity": "sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.12.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.28", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.28.tgz", + "integrity": "sha512-KoCuXgJ2AysGjzOAMUtNPrXeOvvC3zRR+REbYhei2mx5LGTSSrrlVJdaSBv4f8LH9hgfhG7E4Us3hH3XwreP+A==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz", + "integrity": "sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz", + "integrity": "sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz", + "integrity": "sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz", + "integrity": "sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz", + "integrity": "sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz", + "integrity": "sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz", + "integrity": "sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz", + "integrity": "sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz", + "integrity": "sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz", + "integrity": "sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz", + "integrity": "sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz", + "integrity": "sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz", + "integrity": "sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz", + "integrity": "sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz", + "integrity": "sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz", + "integrity": "sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz", + "integrity": "sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz", + "integrity": "sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz", + "integrity": "sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/katex": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz", + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz", + "integrity": "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.26.1", + "@typescript-eslint/type-utils": "8.26.1", + "@typescript-eslint/utils": "8.26.1", + "@typescript-eslint/visitor-keys": "8.26.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz", + "integrity": "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.26.1", + "@typescript-eslint/types": "8.26.1", + "@typescript-eslint/typescript-estree": "8.26.1", + "@typescript-eslint/visitor-keys": "8.26.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", + "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.26.1", + "@typescript-eslint/visitor-keys": "8.26.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz", + "integrity": "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.26.1", + "@typescript-eslint/utils": "8.26.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", + "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", + "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.26.1", + "@typescript-eslint/visitor-keys": "8.26.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz", + "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.26.1", + "@typescript-eslint/types": "8.26.1", + "@typescript-eslint/typescript-estree": "8.26.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.26.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", + "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.26.1", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-core/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz", + "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.23.5", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.2.tgz", + "integrity": "sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.2" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz", + "integrity": "sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.2", + "birpc": "^0.2.19", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz", + "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vueuse/core/node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vueuse/core/node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vueuse/integrations/node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vueuse/integrations/node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vueuse/shared/node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vueuse/shared/node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/algoliasearch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.20.4.tgz", + "integrity": "sha512-wjfzqruxovJyDqga8M6Xk5XtfuVg3igrWjhjgkRya87+WwfEa1kg+IluujBLzgAiMSd6rO6jqRb7czjgeeSYgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-abtesting": "5.20.4", + "@algolia/client-analytics": "5.20.4", + "@algolia/client-common": "5.20.4", + "@algolia/client-insights": "5.20.4", + "@algolia/client-personalization": "5.20.4", + "@algolia/client-query-suggestions": "5.20.4", + "@algolia/client-search": "5.20.4", + "@algolia/ingestion": "1.20.4", + "@algolia/monitoring": "1.20.4", + "@algolia/recommend": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-common": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz", + "integrity": "sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-search": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.20.4.tgz", + "integrity": "sha512-hXM2LpwTzG5kGQSyq3feIijzzl6vkjYPP+LF3ru1relNUIh7fWJ4uYQay2NMNbWX5LWQzF8Vr9qlIA139doQXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4", + "@algolia/requester-browser-xhr": "5.20.4", + "@algolia/requester-fetch": "5.20.4", + "@algolia/requester-node-http": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz", + "integrity": "sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-fetch": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz", + "integrity": "sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { + "version": "5.20.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz", + "integrity": "sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.20.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/birpc": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "license": "MIT", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", + "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.22.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz", + "integrity": "sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.1.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.0", + "@eslint/js": "9.22.0", + "@eslint/plugin-kit": "^0.2.7", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.0.0.tgz", + "integrity": "sha512-XKckedtajqwmaX6u1VnECmZ6xJt+YvlmMzBPZd+/sI3ub2lpYZyFnsyWo7c3nMOQKJQudeyk1lw/JxdgeKT64w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "vue-eslint-parser": "^10.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true, + "license": "MIT" + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/focus-trap": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz", + "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", + "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "license": "MIT", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/juice": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-8.1.0.tgz", + "integrity": "sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cheerio": "1.0.0-rc.10", + "commander": "^6.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^6.0.1" + }, + "bin": { + "juice": "bin/juice" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/juice/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/katex": { + "version": "0.16.21", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz", + "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/lint-staged": { + "version": "15.4.3", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.3.tgz", + "integrity": "sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.4.1", + "commander": "^13.1.0", + "debug": "^4.4.0", + "execa": "^8.0.1", + "lilconfig": "^3.1.3", + "listr2": "^8.2.5", + "micromatch": "^4.0.8", + "pidtree": "^0.6.0", + "string-argv": "^0.3.2", + "yaml": "^2.7.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/listr2": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", + "integrity": "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-mathjax3": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz", + "integrity": "sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "juice": "^8.0.0", + "mathjax-full": "^3.2.0" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdownlint": { + "version": "0.37.4", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.37.4.tgz", + "integrity": "sha512-u00joA/syf3VhWh6/ybVFkib5Zpj2e5KB/cfCei8fkSRuums6nyisTWGqjTWIOFoFwuXoTBQQiqlB4qFKp8ncQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "markdown-it": "14.1.0", + "micromark": "4.0.1", + "micromark-core-commonmark": "2.0.2", + "micromark-extension-directive": "3.0.2", + "micromark-extension-gfm-autolink-literal": "2.1.0", + "micromark-extension-gfm-footnote": "2.1.0", + "micromark-extension-gfm-table": "2.1.0", + "micromark-extension-math": "3.1.0", + "micromark-util-types": "2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/DavidAnson" + } + }, + "node_modules/markdownlint-cli": { + "version": "0.44.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.44.0.tgz", + "integrity": "sha512-ZJTAONlvF9NkrIBltCdW15DxN9UTbPiKMEqAh2EU2gwIFlrCMavyCEPPO121cqfYOrLUJWW8/XKWongstmmTeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "~13.1.0", + "glob": "~10.4.5", + "ignore": "~7.0.3", + "js-yaml": "~4.1.0", + "jsonc-parser": "~3.3.1", + "jsonpointer": "~5.0.1", + "markdownlint": "~0.37.4", + "minimatch": "~9.0.5", + "run-con": "~1.3.2", + "smol-toml": "~1.3.1" + }, + "bin": { + "markdownlint": "markdownlint.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/markdownlint-cli/node_modules/ignore": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/mathjax-full": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", + "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esm": "^3.2.25", + "mhchemparser": "^4.1.0", + "mj-context-menu": "^0.6.1", + "speech-rule-engine": "^4.0.6" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mhchemparser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", + "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/micromark": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz", + "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz", + "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "dev": true, + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-math": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", + "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/katex": "^0.16.0", + "devlop": "^1.0.0", + "katex": "^0.16.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minisearch": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz", + "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mj-context-menu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", + "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", + "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/preact": { + "version": "10.26.4", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.4.tgz", + "integrity": "sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/property-information": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", + "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.35.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz", + "integrity": "sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.35.0", + "@rollup/rollup-android-arm64": "4.35.0", + "@rollup/rollup-darwin-arm64": "4.35.0", + "@rollup/rollup-darwin-x64": "4.35.0", + "@rollup/rollup-freebsd-arm64": "4.35.0", + "@rollup/rollup-freebsd-x64": "4.35.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.35.0", + "@rollup/rollup-linux-arm-musleabihf": "4.35.0", + "@rollup/rollup-linux-arm64-gnu": "4.35.0", + "@rollup/rollup-linux-arm64-musl": "4.35.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.35.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.35.0", + "@rollup/rollup-linux-riscv64-gnu": "4.35.0", + "@rollup/rollup-linux-s390x-gnu": "4.35.0", + "@rollup/rollup-linux-x64-gnu": "4.35.0", + "@rollup/rollup-linux-x64-musl": "4.35.0", + "@rollup/rollup-win32-arm64-msvc": "4.35.0", + "@rollup/rollup-win32-ia32-msvc": "4.35.0", + "@rollup/rollup-win32-x64-msvc": "4.35.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-con": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", + "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~4.1.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" + }, + "bin": { + "run-con": "cli.js" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "dev": true, + "license": "MIT (http://mootools.net/license.txt)", + "engines": { + "node": "*" + } + }, + "node_modules/smol-toml": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.1.tgz", + "integrity": "sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speech-rule-engine": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz", + "integrity": "sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "commander": "9.2.0", + "wicked-good-xpath": "1.3.0", + "xmldom-sre": "0.1.31" + }, + "bin": { + "sre": "bin/sre" + } + }, + "node_modules/speech-rule-engine/node_modules/commander": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.26.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.1.tgz", + "integrity": "sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.26.1", + "@typescript-eslint/parser": "8.26.1", + "@typescript-eslint/utils": "8.26.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/unist-util-visit/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/v-tooltip": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.1.3.tgz", + "integrity": "sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10", + "lodash": "^4.17.21", + "popper.js": "^1.16.1", + "vue-resize": "^1.0.1" + } + }, + "node_modules/valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/vfile/node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.14", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", + "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.3.tgz", + "integrity": "sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vitepress/node_modules/@vitejs/plugin-vue": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/vitepress/node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/vitepress/node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/vitepress/node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz", + "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==", + "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-sfc": "2.7.16", + "csstype": "^3.1.0" + } + }, + "node_modules/vue-clipboard2": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/vue-clipboard2/-/vue-clipboard2-0.3.3.tgz", + "integrity": "sha512-aNWXIL2DKgJyY/1OOeITwAQz1fHaCIGvUFHf9h8UcoQBG5a74MkdhS/xqoYe7DNZdQmZRL+TAdIbtUs9OyVjbw==", + "license": "MIT", + "dependencies": { + "clipboard": "^2.0.0" + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.1.1.tgz", + "integrity": "sha512-bh2Z/Au5slro9QJ3neFYLanZtb1jH+W2bKqGHXAoYD4vZgNG3KeotL7JpPv5xzY4UXUXJl7TrIsnzECH63kd3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "lodash": "^4.17.21", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-resize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz", + "integrity": "sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "vue": "^2.6.0" + } + }, + "node_modules/web-resource-inliner": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz", + "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^5.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/fb55/htmlparser2?sponsor=1" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmldom-sre": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", + "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==", + "dev": true, + "license": "(LGPL-2.0 or MIT)", + "engines": { + "node": ">=0.1" + } + }, + "node_modules/yaml": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", + "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/static/img/P2P_data_flow_dark.png b/static/img/P2P_data_flow_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3a3e247ee3f362be28fb9771f47f0f4788ca52 GIT binary patch literal 275480 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 QAr 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

J|4LynxsVqCdq-FAtplK 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

^z@HPmL_gT8y)?vO4;!n=$rRukP13FgOz?#uEAk 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

=#`A~8}D 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 E3&;=80RR91 literal 0 HcmV?d00001 diff --git a/static/img/intro.png b/static/img/intro.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebeec92e02bc513603d3205b29cecfd8a472fb6 GIT binary patch literal 114276 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 literal 0 HcmV?d00001 diff --git a/yarn.lock b/yarn.lock index b9dba6c..fc4f605 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@algolia/autocomplete-core@1.17.7": version "1.17.7" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz#2c410baa94a47c5c5f56ed712bb4a00ebe24088b" + resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz" integrity sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q== dependencies: "@algolia/autocomplete-plugin-algolia-insights" "1.17.7" @@ -12,26 +12,26 @@ "@algolia/autocomplete-plugin-algolia-insights@1.17.7": version "1.17.7" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz#7d2b105f84e7dd8f0370aa4c4ab3b704e6760d82" + resolved "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz" integrity sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A== dependencies: "@algolia/autocomplete-shared" "1.17.7" "@algolia/autocomplete-preset-algolia@1.17.7": version "1.17.7" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz#c9badc0d73d62db5bf565d839d94ec0034680ae9" + resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz" integrity sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA== dependencies: "@algolia/autocomplete-shared" "1.17.7" "@algolia/autocomplete-shared@1.17.7": version "1.17.7" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz#105e84ad9d1a31d3fb86ba20dc890eefe1a313a0" + resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz" integrity sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg== "@algolia/client-abtesting@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.20.4.tgz#eb1dfd010a61d136f26e51feb8e9e7c3a1e74d5f" + resolved "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.20.4.tgz" integrity sha512-OZ3Xvvf+k7NMcwmmioIVX+76E/KKtN607NCMNsBEKe+uHqktZ+I5bmi/EVr2m5VF59Gnh9MTlJCdXtBiGjruxw== dependencies: "@algolia/client-common" "5.20.4" @@ -41,7 +41,7 @@ "@algolia/client-analytics@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.20.4.tgz#536140dbfc8ae8aed9215f3d0cd60503f2ae2bc0" + resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.20.4.tgz" integrity sha512-8pM5zQpHonCIBxKmMyBLgQoaSKUNBE5u741VEIjn2ArujolhoKRXempRAlLwEg5hrORKl9XIlit00ff4g6LWvA== dependencies: "@algolia/client-common" "5.20.4" @@ -51,12 +51,17 @@ "@algolia/client-common@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.20.4.tgz#e7451f4f96802fcaf3043796c74748733b2fe973" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz" integrity sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA== +"@algolia/client-common@5.34.1": + version "5.34.1" + resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.34.1.tgz" + integrity sha512-otPWALs72KvmVuP0CN0DI6sqVx1jQWKi+/DgAiP8DysVMgiNlva3GDKTtAK6XVGlT08f4h32FNuL0yQODuCfKA== + "@algolia/client-insights@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.20.4.tgz#5364d5898407f239bd17da9ab693fc258e8c0cd8" + resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.20.4.tgz" integrity sha512-MroyJStJFLf/cYeCbguCRdrA2U6miDVqbi3t9ZGovBWWTef7BZwVQG0mLyInzp4MIjBfwqu3xTrhxsiiOavX3A== dependencies: "@algolia/client-common" "5.20.4" @@ -66,7 +71,7 @@ "@algolia/client-personalization@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.20.4.tgz#37eeb952f1b535475a6f25fd1e9921c9abc2356c" + resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.20.4.tgz" integrity sha512-bVR5sxFfgCQ+G0ZegGVhBqtaDd7jCfr33m5mGuT43U+bH//xeqAHQyIS4abcmRulwqeIAHNm5Yl2J7grT3z//A== dependencies: "@algolia/client-common" "5.20.4" @@ -76,7 +81,7 @@ "@algolia/client-query-suggestions@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.4.tgz#49582d82d097c2d92e5f90b6390fb63a234090c5" + resolved "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.20.4.tgz" integrity sha512-ZHsV0vceNDR87wIVaz7VjxilwCUCkzbuy4QnqIdnQs3NnC43is7KKbEtKueuNw+YGMdx+wmD5kRI2XKip1R93A== dependencies: "@algolia/client-common" "5.20.4" @@ -84,9 +89,19 @@ "@algolia/requester-fetch" "5.20.4" "@algolia/requester-node-http" "5.20.4" +"@algolia/client-search@>= 4.9.1 < 6": + version "5.34.1" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.34.1.tgz" + integrity sha512-bt5hC9vvjaKvdvsgzfXJ42Sl3qjQqoi/FD8V7HOQgtNFhwSauZOlgLwFoUiw67sM+r7ehF7QDk5WRDgY7fAkIg== + dependencies: + "@algolia/client-common" "5.34.1" + "@algolia/requester-browser-xhr" "5.34.1" + "@algolia/requester-fetch" "5.34.1" + "@algolia/requester-node-http" "5.34.1" + "@algolia/client-search@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.20.4.tgz#4310cd622c821443a7f00e3445cdef254de90f28" + resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.20.4.tgz" integrity sha512-hXM2LpwTzG5kGQSyq3feIijzzl6vkjYPP+LF3ru1relNUIh7fWJ4uYQay2NMNbWX5LWQzF8Vr9qlIA139doQXg== dependencies: "@algolia/client-common" "5.20.4" @@ -96,7 +111,7 @@ "@algolia/ingestion@1.20.4": version "1.20.4" - resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.20.4.tgz#bd7a116c9d37938d3c88e966c52d439803a5cc6c" + resolved "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.20.4.tgz" integrity sha512-idAe53XsTlLSSQ7pJcjscUEmc67vEM+VohYkr78Ebfb43vtfKH0ik8ux9OGQpLRNGntaHqpe/lfU5PDRi5/92w== dependencies: "@algolia/client-common" "5.20.4" @@ -106,7 +121,7 @@ "@algolia/monitoring@1.20.4": version "1.20.4" - resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.20.4.tgz#4a13f1bee303d2e8fd70664b476461f3f2acf08a" + resolved "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.20.4.tgz" integrity sha512-O6HjdSWtyu5LhHR7gdU83oWbl1vVVRwoTxkENHF61Ar7l9C1Ok91VtnK7RtXB9pJL1kpIMDExwZOT5sEN2Ppfw== dependencies: "@algolia/client-common" "5.20.4" @@ -116,7 +131,7 @@ "@algolia/recommend@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.20.4.tgz#5919aed5cafa9615a9f580fc6080f4c4cffadd8a" + resolved "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.20.4.tgz" integrity sha512-p8M78pQjPrN6PudO2TnkWiOJbyp/IPhgCFBW8aZrLshhZpPkV9N4u0YsU/w6OoeYDKSxmXntWQrKYiU1dVRWfg== dependencies: "@algolia/client-common" "5.20.4" @@ -126,65 +141,86 @@ "@algolia/requester-browser-xhr@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz#4ab94d44817a06fdc208fe5cf19ed6297588f62a" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.20.4.tgz" integrity sha512-Y8GThjDVdhFUurZKKDdzAML/LNKOA/BOydEcaFeb/g4Iv4Iq0qQJs6aIbtdsngUU6cu74qH/2P84kr2h16uVvQ== dependencies: "@algolia/client-common" "5.20.4" +"@algolia/requester-browser-xhr@5.34.1": + version "5.34.1" + resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.34.1.tgz" + integrity sha512-567LfFTc9VOiPtuySQohoqaWMeohYWbXK71aMSin+SLMgeKX7hz5LrVmkmMQj9udwWK6/mtHEYZGPYHSuXpLQg== + dependencies: + "@algolia/client-common" "5.34.1" + "@algolia/requester-fetch@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz#d8d640735b7a80f3497ab200f4451ee16415af6e" + resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz" integrity sha512-OrAUSrvbFi46U7AxOXkyl9QQiaW21XWpixWmcx3D2S65P/DCIGOVE6K2741ZE+WiKIqp+RSYkyDFj3BiFHzLTg== dependencies: "@algolia/client-common" "5.20.4" +"@algolia/requester-fetch@5.34.1": + version "5.34.1" + resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.34.1.tgz" + integrity sha512-YRbygPgGBEik5U593JvyjgxFjcsyZMR25eIQxNHvSQumdAzt5A4E4Idw3yXnwhrmMdjML54ZXT7EAjnTjWy8Xw== + dependencies: + "@algolia/client-common" "5.34.1" + "@algolia/requester-node-http@5.20.4": version "5.20.4" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz#fa493402a29af2a2197a62e8d2ecc37aa96f17e5" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz" integrity sha512-Jc/bofGBw4P9nBii4oCzCqqusv8DAFFORfUD2Ce1cZk3fvUPk+q/Qnu7i9JpTSHjMc0MWzqApLdq7Nwh1gelLg== dependencies: "@algolia/client-common" "5.20.4" -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== +"@algolia/requester-node-http@5.34.1": + version "5.34.1" + resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.34.1.tgz" + integrity sha512-o0mqRYbS82Rt4DE02Od7RL6pNtV7oSxScPuIw8LW4aqO2V5eCF05Pry/SnUgcI/Vb2QCYC66hytBCqzyC/toZA== + dependencies: + "@algolia/client-common" "5.34.1" -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/parser@^7.25.3": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.9.tgz#d9e78bee6dc80f9efd8f2349dcfbbcdace280fd5" - integrity sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A== +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/parser@^7.23.5", "@babel/parser@^7.25.3": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== dependencies: - "@babel/types" "^7.26.9" + "@babel/types" "^7.28.0" "@babel/runtime@^7.13.10": version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.9.tgz#aa4c6facc65b9cb3f87d75125ffd47781b475433" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz" integrity sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg== dependencies: regenerator-runtime "^0.14.0" -"@babel/types@^7.26.9": - version "7.26.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.9.tgz#08b43dec79ee8e682c2ac631c010bdcac54a21ce" - integrity sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw== +"@babel/types@^7.28.0": + version "7.28.2" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz" + integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" "@docsearch/css@3.8.2": version "3.8.2" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.8.2.tgz#7973ceb6892c30f154ba254cd05c562257a44977" + resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz" integrity sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ== "@docsearch/js@3.8.2": version "3.8.2" - resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.8.2.tgz#bdcfc9837700eb38453b88e211ab5cc5a3813cc6" + resolved "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz" integrity sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ== dependencies: "@docsearch/react" "3.8.2" @@ -192,7 +228,7 @@ "@docsearch/react@3.8.2": version "3.8.2" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.8.2.tgz#7b11d39b61c976c0aa9fbde66e6b73b30f3acd42" + resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz" integrity sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg== dependencies: "@algolia/autocomplete-core" "1.17.7" @@ -202,134 +238,134 @@ "@esbuild/aix-ppc64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== -"@esbuild/android-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" - integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== - "@esbuild/android-arm@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + "@esbuild/android-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== "@esbuild/darwin-arm64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== "@esbuild/darwin-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== "@esbuild/freebsd-arm64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== "@esbuild/freebsd-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== -"@esbuild/linux-arm64@0.21.5": - version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" - integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== - "@esbuild/linux-arm@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + "@esbuild/linux-ia32@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== "@esbuild/linux-loong64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== "@esbuild/linux-mips64el@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== "@esbuild/linux-ppc64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== "@esbuild/linux-riscv64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== "@esbuild/linux-s390x@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== "@esbuild/linux-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== "@esbuild/netbsd-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== "@esbuild/openbsd-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== "@esbuild/sunos-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== "@esbuild/win32-arm64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== "@esbuild/win32-ia32@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== "@esbuild/win32-x64@0.21.5": version "0.21.5" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.1" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz" integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== dependencies: eslint-visitor-keys "^3.4.3" "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1": version "4.12.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== "@eslint/config-array@^0.19.2": version "0.19.2" - resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.2.tgz#3060b809e111abfc97adb0bb1172778b90cb46aa" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz" integrity sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w== dependencies: "@eslint/object-schema" "^2.1.6" @@ -338,19 +374,19 @@ "@eslint/config-helpers@^0.1.0": version "0.1.0" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.1.0.tgz#62f1b7821e9d9ced1b3f512c7ea731825765d1cc" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.1.0.tgz" integrity sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA== "@eslint/core@^0.12.0": version "0.12.0" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.12.0.tgz#5f960c3d57728be9f6c65bd84aa6aa613078798e" + resolved "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz" integrity sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg== dependencies: "@types/json-schema" "^7.0.15" "@eslint/eslintrc@^3.3.0": version "3.3.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.0.tgz#96a558f45842989cca7ea1ecd785ad5491193846" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.0.tgz" integrity sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ== dependencies: ajv "^6.12.4" @@ -363,19 +399,19 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.22.0", "@eslint/js@^9.22.0": +"@eslint/js@^9.22.0", "@eslint/js@9.22.0": version "9.22.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.22.0.tgz#4ff53649ded7cbce90b444b494c234137fa1aa3d" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz" integrity sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ== "@eslint/object-schema@^2.1.6": version "2.1.6" - resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + resolved "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz" integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== "@eslint/plugin-kit@^0.2.7": version "0.2.7" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz#9901d52c136fb8f375906a73dcc382646c3b6a27" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz" integrity sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g== dependencies: "@eslint/core" "^0.12.0" @@ -383,12 +419,12 @@ "@humanfs/core@^0.19.1": version "0.19.1" - resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + resolved "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz" integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== "@humanfs/node@^0.16.6": version "0.16.6" - resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== dependencies: "@humanfs/core" "^0.19.1" @@ -396,34 +432,34 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/retry@^0.3.0": version "0.3.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz" integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== "@humanwhocodes/retry@^0.4.2": version "0.4.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" + resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz" integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== "@iconify-json/simple-icons@^1.2.21": version "1.2.28" - resolved "https://registry.yarnpkg.com/@iconify-json/simple-icons/-/simple-icons-1.2.28.tgz#37eaedb106652f57128be9f681d994bbf6e1d2ff" + resolved "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.28.tgz" integrity sha512-KoCuXgJ2AysGjzOAMUtNPrXeOvvC3zRR+REbYhei2mx5LGTSSrrlVJdaSBv4f8LH9hgfhG7E4Us3hH3XwreP+A== dependencies: "@iconify/types" "*" "@iconify/types@*": version "2.0.0" - resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" + resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz" integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -435,25 +471,25 @@ "@jridgewell/sourcemap-codec@^1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -461,107 +497,107 @@ "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@rollup/rollup-android-arm-eabi@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz#e1d7700735f7e8de561ef7d1fa0362082a180c43" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.35.0.tgz" integrity sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ== "@rollup/rollup-android-arm64@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz#fa6cdfb1fc9e2c8e227a7f35d524d8f7f90cf4db" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.35.0.tgz" integrity sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA== "@rollup/rollup-darwin-arm64@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz#6da5a1ddc4f11d4a7ae85ab443824cb6bf614e30" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.35.0.tgz" integrity sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q== "@rollup/rollup-darwin-x64@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz#25b74ce2d8d3f9ea8e119b01384d44a1c0a0d3ae" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.35.0.tgz" integrity sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q== "@rollup/rollup-freebsd-arm64@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz#be3d39e3441df5d6e187c83d158c60656c82e203" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.35.0.tgz" integrity sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ== "@rollup/rollup-freebsd-x64@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz#cd932d3ec679711efd65ca25821fb318e25b7ce4" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.35.0.tgz" integrity sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw== "@rollup/rollup-linux-arm-gnueabihf@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz#d300b74c6f805474225632f185daaeae760ac2bb" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.35.0.tgz" integrity sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg== "@rollup/rollup-linux-arm-musleabihf@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz#2caac622380f314c41934ed1e68ceaf6cc380cc3" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.35.0.tgz" integrity sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A== "@rollup/rollup-linux-arm64-gnu@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz#1ec841650b038cc15c194c26326483fd7ebff3e3" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.35.0.tgz" integrity sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A== "@rollup/rollup-linux-arm64-musl@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz#2fc70a446d986e27f6101ea74e81746987f69150" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.35.0.tgz" integrity sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg== "@rollup/rollup-linux-loongarch64-gnu@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz#561bd045cd9ce9e08c95f42e7a8688af8c93d764" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.35.0.tgz" integrity sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g== "@rollup/rollup-linux-powerpc64le-gnu@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz#45d849a0b33813f33fe5eba9f99e0ff15ab5caad" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.35.0.tgz" integrity sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA== "@rollup/rollup-linux-riscv64-gnu@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz#78dde3e6fcf5b5733a97d0a67482d768aa1e83a5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.35.0.tgz" integrity sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g== "@rollup/rollup-linux-s390x-gnu@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz#2e34835020f9e03dfb411473a5c2a0e8a9c5037b" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.35.0.tgz" integrity sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw== "@rollup/rollup-linux-x64-gnu@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz#4f9774beddc6f4274df57ac99862eb23040de461" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.35.0.tgz" integrity sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA== "@rollup/rollup-linux-x64-musl@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz#dfcff2c1aed518b3d23ccffb49afb349d74fb608" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.35.0.tgz" integrity sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg== "@rollup/rollup-win32-arm64-msvc@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz#b0b37e2d77041e3aa772f519291309abf4c03a84" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.35.0.tgz" integrity sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg== "@rollup/rollup-win32-ia32-msvc@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz#5b5a40e44a743ddc0e06b8e1b3982f856dc9ce0a" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.35.0.tgz" integrity sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw== "@rollup/rollup-win32-x64-msvc@4.35.0": version "4.35.0" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz#05f25dbc9981bee1ae6e713daab10397044a46ca" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz" integrity sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw== -"@shikijs/core@2.5.0", "@shikijs/core@^2.1.0": +"@shikijs/core@^2.1.0", "@shikijs/core@2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-2.5.0.tgz#e14d33961dfa3141393d4a76fc8923d0d1c4b62f" + resolved "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz" integrity sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg== dependencies: "@shikijs/engine-javascript" "2.5.0" @@ -573,7 +609,7 @@ "@shikijs/engine-javascript@2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz#e045c6ecfbda6c99137547b0a482e0b87f1053fc" + resolved "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz" integrity sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w== dependencies: "@shikijs/types" "2.5.0" @@ -582,7 +618,7 @@ "@shikijs/engine-oniguruma@2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz#230de5693cc1da6c9d59c7ad83593c2027274817" + resolved "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz" integrity sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw== dependencies: "@shikijs/types" "2.5.0" @@ -590,29 +626,29 @@ "@shikijs/langs@2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-2.5.0.tgz#97ab50c495922cc1ca06e192985b28dc73de5d50" + resolved "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz" integrity sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w== dependencies: "@shikijs/types" "2.5.0" "@shikijs/themes@2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-2.5.0.tgz#8c6aecf73f5455681c8bec15797cf678162896cb" + resolved "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz" integrity sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw== dependencies: "@shikijs/types" "2.5.0" "@shikijs/transformers@^2.1.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-2.5.0.tgz#190c84786ff06c417580ab79177338a947168c55" + resolved "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz" integrity sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg== dependencies: "@shikijs/core" "2.5.0" "@shikijs/types" "2.5.0" -"@shikijs/types@2.5.0", "@shikijs/types@^2.1.0": +"@shikijs/types@^2.1.0", "@shikijs/types@2.5.0": version "2.5.0" - resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-2.5.0.tgz#e949c7384802703a48b9d6425dd41673c164df69" + resolved "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz" integrity sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw== dependencies: "@shikijs/vscode-textmate" "^10.0.2" @@ -620,46 +656,46 @@ "@shikijs/vscode-textmate@^10.0.2": version "10.0.2" - resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + resolved "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz" integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== "@types/debug@^4.0.0": version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" + resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== dependencies: "@types/ms" "*" -"@types/estree@1.0.6", "@types/estree@^1.0.6": +"@types/estree@^1.0.6", "@types/estree@1.0.6": version "1.0.6" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/hast@^3.0.0", "@types/hast@^3.0.4": version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== dependencies: "@types/unist" "*" "@types/json-schema@^7.0.15": version "7.0.15" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/katex@^0.16.0": version "0.16.7" - resolved "https://registry.yarnpkg.com/@types/katex/-/katex-0.16.7.tgz#03ab680ab4fa4fbc6cb46ecf987ecad5d8019868" + resolved "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz" integrity sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ== "@types/linkify-it@^5": version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76" + resolved "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz" integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== "@types/markdown-it@^14.1.2": version "14.1.2" - resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.2.tgz#57f2532a0800067d9b934f3521429a2e8bfb4c61" + resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz" integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog== dependencies: "@types/linkify-it" "^5" @@ -667,39 +703,39 @@ "@types/mdast@^4.0.0": version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-4.0.4.tgz#7ccf72edd2f1aa7dd3437e180c64373585804dd6" + resolved "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz" integrity sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA== dependencies: "@types/unist" "*" "@types/mdurl@^2": version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd" + resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz" integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg== "@types/ms@*": version "2.1.0" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" + resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== -"@types/unist@*", "@types/unist@^3.0.0": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" - integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== - -"@types/unist@^2.0.0": +"@types/unist@*", "@types/unist@^2.0.0": version "2.0.11" - resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" + resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== +"@types/unist@^3.0.0": + version "3.0.3" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + "@types/web-bluetooth@^0.0.21": version "0.0.21" - resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz#525433c784aed9b457aaa0ee3d92aeb71f346b63" + resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz" integrity sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA== -"@typescript-eslint/eslint-plugin@8.26.1", "@typescript-eslint/eslint-plugin@^8.26.1": +"@typescript-eslint/eslint-plugin@^8.26.1", "@typescript-eslint/eslint-plugin@8.26.1": version "8.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz#3e48eb847924161843b092c87a9b65176b53782f" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz" integrity sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA== dependencies: "@eslint-community/regexpp" "^4.10.0" @@ -712,9 +748,9 @@ natural-compare "^1.4.0" ts-api-utils "^2.0.1" -"@typescript-eslint/parser@8.26.1", "@typescript-eslint/parser@^8.26.1": +"@typescript-eslint/parser@^8.0.0 || ^8.0.0-alpha.0", "@typescript-eslint/parser@^8.26.1", "@typescript-eslint/parser@8.26.1": version "8.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.26.1.tgz#0e2f915a497519fc43f52cf2ecbfa607ff56f72e" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz" integrity sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ== dependencies: "@typescript-eslint/scope-manager" "8.26.1" @@ -725,7 +761,7 @@ "@typescript-eslint/scope-manager@8.26.1": version "8.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz#5e6ad0ac258ccf79462e91c3f43a3f1f7f31a6cc" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz" integrity sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg== dependencies: "@typescript-eslint/types" "8.26.1" @@ -733,7 +769,7 @@ "@typescript-eslint/type-utils@8.26.1": version "8.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz#462f0bae09de72ac6e8e1af2ebe588c23224d7f8" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz" integrity sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg== dependencies: "@typescript-eslint/typescript-estree" "8.26.1" @@ -743,12 +779,12 @@ "@typescript-eslint/types@8.26.1": version "8.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.26.1.tgz#d5978721670cff263348d5062773389231a64132" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz" integrity sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ== "@typescript-eslint/typescript-estree@8.26.1": version "8.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz#eb0e4ce31753683d83be53441a409fd5f0b34afd" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz" integrity sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA== dependencies: "@typescript-eslint/types" "8.26.1" @@ -762,7 +798,7 @@ "@typescript-eslint/utils@8.26.1": version "8.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.26.1.tgz#54cc58469955f25577f659753b71a0e117a0539f" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz" integrity sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg== dependencies: "@eslint-community/eslint-utils" "^4.4.0" @@ -772,7 +808,7 @@ "@typescript-eslint/visitor-keys@8.26.1": version "8.26.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz#c5267fcc82795cf10280363023837deacad2647c" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz" integrity sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg== dependencies: "@typescript-eslint/types" "8.26.1" @@ -780,17 +816,17 @@ "@ungap/structured-clone@^1.0.0": version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== "@vitejs/plugin-vue@^5.2.1": version "5.2.1" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz#d1491f678ee3af899f7ae57d9c21dc52a65c7133" + resolved "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz" integrity sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ== "@vue/compiler-core@3.5.13": version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05" + resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz" integrity sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q== dependencies: "@babel/parser" "^7.25.3" @@ -801,15 +837,26 @@ "@vue/compiler-dom@3.5.13": version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58" + resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz" integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA== dependencies: "@vue/compiler-core" "3.5.13" "@vue/shared" "3.5.13" +"@vue/compiler-sfc@2.7.16": + version "2.7.16" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz" + integrity sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg== + dependencies: + "@babel/parser" "^7.23.5" + postcss "^8.4.14" + source-map "^0.6.1" + optionalDependencies: + prettier "^1.18.2 || ^2.0.0" + "@vue/compiler-sfc@3.5.13": version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz#461f8bd343b5c06fac4189c4fef8af32dea82b46" + resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz" integrity sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ== dependencies: "@babel/parser" "^7.25.3" @@ -824,7 +871,7 @@ "@vue/compiler-ssr@3.5.13": version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba" + resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz" integrity sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA== dependencies: "@vue/compiler-dom" "3.5.13" @@ -832,14 +879,14 @@ "@vue/devtools-api@^7.7.0": version "7.7.2" - resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.7.2.tgz#49837eae6f61fc43a09f5d6c2d3210f9f73a0d09" + resolved "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.2.tgz" integrity sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA== dependencies: "@vue/devtools-kit" "^7.7.2" "@vue/devtools-kit@^7.7.2": version "7.7.2" - resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz#3315bd5b144f98c7b84c2f44270b445644ec8f10" + resolved "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.2.tgz" integrity sha512-CY0I1JH3Z8PECbn6k3TqM1Bk9ASWxeMtTCvZr7vb+CHi+X/QwQm5F1/fPagraamKMAHVfuuCbdcnNg1A4CYVWQ== dependencies: "@vue/devtools-shared" "^7.7.2" @@ -852,21 +899,21 @@ "@vue/devtools-shared@^7.7.2": version "7.7.2" - resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz#b11b143820130a32d8ce5737e264d06ab6d62f40" + resolved "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz" integrity sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA== dependencies: rfdc "^1.4.1" "@vue/reactivity@3.5.13": version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.13.tgz#b41ff2bb865e093899a22219f5b25f97b6fe155f" + resolved "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz" integrity sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg== dependencies: "@vue/shared" "3.5.13" "@vue/runtime-core@3.5.13": version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.13.tgz#1fafa4bf0b97af0ebdd9dbfe98cd630da363a455" + resolved "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz" integrity sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw== dependencies: "@vue/reactivity" "3.5.13" @@ -874,7 +921,7 @@ "@vue/runtime-dom@3.5.13": version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz#610fc795de9246300e8ae8865930d534e1246215" + resolved "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz" integrity sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog== dependencies: "@vue/reactivity" "3.5.13" @@ -884,20 +931,20 @@ "@vue/server-renderer@3.5.13": version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7" + resolved "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz" integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA== dependencies: "@vue/compiler-ssr" "3.5.13" "@vue/shared" "3.5.13" -"@vue/shared@3.5.13", "@vue/shared@^3.5.13": +"@vue/shared@^3.5.13", "@vue/shared@3.5.13": version "3.5.13" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f" + resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz" integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== -"@vueuse/core@12.8.2", "@vueuse/core@^12.4.0": +"@vueuse/core@^12.4.0", "@vueuse/core@12.8.2": version "12.8.2" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-12.8.2.tgz#007c6dd29a7d1f6933e916e7a2f8ef3c3f968eaa" + resolved "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz" integrity sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ== dependencies: "@types/web-bluetooth" "^0.0.21" @@ -907,7 +954,7 @@ "@vueuse/integrations@^12.4.0": version "12.8.2" - resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-12.8.2.tgz#d04f33d86fe985c9a27c98addcfde9f30f2db1df" + resolved "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz" integrity sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g== dependencies: "@vueuse/core" "12.8.2" @@ -916,29 +963,29 @@ "@vueuse/metadata@12.8.2": version "12.8.2" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-12.8.2.tgz#6cb3a4e97cdcf528329eebc1bda73cd7f64318d3" + resolved "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz" integrity sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A== "@vueuse/shared@12.8.2": version "12.8.2" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-12.8.2.tgz#b9e4611d0603629c8e151f982459da394e22f930" + resolved "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz" integrity sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w== dependencies: vue "^3.5.13" acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.14.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0: version "8.14.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== ajv@^6.12.4: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -946,9 +993,9 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -algoliasearch@^5.14.2: +algoliasearch@^5.14.2, "algoliasearch@>= 4.9.1 < 6": version "5.20.4" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.20.4.tgz#514a74569ccd58293d9c64e9f6a0fcdf81a24612" + resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.20.4.tgz" integrity sha512-wjfzqruxovJyDqga8M6Xk5XtfuVg3igrWjhjgkRya87+WwfEa1kg+IluujBLzgAiMSd6rO6jqRb7czjgeeSYgQ== dependencies: "@algolia/client-abtesting" "5.20.4" @@ -967,61 +1014,71 @@ algoliasearch@^5.14.2: ansi-colors@^4.1.1: version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== ansi-escapes@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz" integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== dependencies: environment "^1.0.0" ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" -ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: +ansi-styles@^6.0.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansi-styles@^6.2.1: version "6.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== birpc@^0.2.19: version "0.2.19" - resolved "https://registry.yarnpkg.com/birpc/-/birpc-0.2.19.tgz#cdd183a4a70ba103127d49765b4a71349da5a0ca" + resolved "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz" integrity sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ== boolbase@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1029,31 +1086,31 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" callsites@^3.0.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== ccount@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/ccount/-/ccount-2.0.1.tgz#17a3bf82302e0870d6da43a01311a8bc02a3ecf5" + resolved "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz" integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chalk@^4.0.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -1061,32 +1118,32 @@ chalk@^4.0.0: chalk@^5.4.1: version "5.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== character-entities-html4@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-2.1.0.tgz#1f1adb940c971a4b22ba39ddca6b618dc6e56b2b" + resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz" integrity sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA== character-entities-legacy@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz#76bc83a90738901d7bc223a9e93759fdd560125b" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz" integrity sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ== character-entities@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== character-reference-invalid@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz" integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw== cheerio-select@^1.5.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-1.6.0.tgz#489f36604112c722afa147dedd0d4609c09e1696" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz" integrity sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g== dependencies: css-select "^4.3.0" @@ -1097,7 +1154,7 @@ cheerio-select@^1.5.0: cheerio@1.0.0-rc.10: version "1.0.0-rc.10" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.10.tgz#2ba3dcdfcc26e7956fc1f440e61d51c643379f3e" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz" integrity sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw== dependencies: cheerio-select "^1.5.0" @@ -1110,14 +1167,14 @@ cheerio@1.0.0-rc.10: cli-cursor@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== dependencies: restore-cursor "^5.0.0" cli-truncate@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: slice-ansi "^5.0.0" @@ -1125,7 +1182,7 @@ cli-truncate@^4.0.0: clipboard@^2.0.0: version "2.0.11" - resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" + resolved "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz" integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== dependencies: good-listener "^1.2.2" @@ -1134,61 +1191,61 @@ clipboard@^2.0.0: color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^2.0.20: version "2.0.20" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== comma-separated-tokens@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== -commander@9.2.0: - version "9.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-9.2.0.tgz#6e21014b2ed90d8b7c9647230d8b7a94a4a419a9" - integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== - commander@^13.1.0, commander@~13.1.0: version "13.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + resolved "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz" integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== commander@^6.1.0: version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + resolved "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== commander@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== +commander@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" + integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== + concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== copy-anything@^3.0.2: version "3.0.5" - resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-3.0.5.tgz#2d92dce8c498f790fa7ad16b01a1ae5a45b020a0" + resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz" integrity sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w== dependencies: is-what "^4.1.8" cross-spawn@^7.0.3, cross-spawn@^7.0.6: version "7.0.6" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" @@ -1197,7 +1254,7 @@ cross-spawn@^7.0.3, cross-spawn@^7.0.6: css-select@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== dependencies: boolbase "^1.0.0" @@ -1208,63 +1265,63 @@ css-select@^4.3.0: css-what@^6.0.1: version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.1.3: +csstype@^3.1.0, csstype@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== debug@^4.0.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.0: version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" decode-named-character-reference@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz#5d6ce68792808901210dac42a8e9853511e2b8bf" + resolved "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz" integrity sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w== dependencies: character-entities "^2.0.0" deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== delegate@^3.1.2: version "3.2.0" - resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz" integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== dequal@^2.0.0: version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== devlop@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/devlop/-/devlop-1.1.0.tgz#4db7c2ca4dc6e0e834c30be70c94bbc976dc7018" + resolved "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz" integrity sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA== dependencies: dequal "^2.0.0" dom-serializer@^1.0.1, dom-serializer@^1.3.2: version "1.4.1" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== dependencies: domelementtype "^2.0.1" @@ -1273,26 +1330,26 @@ dom-serializer@^1.0.1, dom-serializer@^1.3.2: domelementtype@^2.0.1, domelementtype@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== domhandler@^3.3.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz" integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== dependencies: domelementtype "^2.0.1" domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== dependencies: domelementtype "^2.2.0" domutils@^2.4.2, domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== dependencies: dom-serializer "^1.0.1" @@ -1301,47 +1358,52 @@ domutils@^2.4.2, domutils@^2.5.2, domutils@^2.8.0: eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== emoji-regex-xs@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz#e8af22e5d9dbd7f7f22d280af3d19d2aab5b0724" + resolved "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz" integrity sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg== emoji-regex@^10.3.0: version "10.4.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz" integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== entities@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.4.0, entities@^4.5.0: +entities@^4.4.0: version "4.5.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== environment@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== esbuild@^0.21.3: version "0.21.5" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== optionalDependencies: "@esbuild/aix-ppc64" "0.21.5" @@ -1370,17 +1432,17 @@ esbuild@^0.21.3: escape-goat@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-3.0.0.tgz#e8b5fb658553fe8a3c4959c316c6ebb8c842b19c" + resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz" integrity sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-plugin-vue@^10.0.0: version "10.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-10.0.0.tgz#42707bfb8c4490b0b1a4be6f11a416fb16c3d11c" + resolved "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.0.0.tgz" integrity sha512-XKckedtajqwmaX6u1VnECmZ6xJt+YvlmMzBPZd+/sI3ub2lpYZyFnsyWo7c3nMOQKJQudeyk1lw/JxdgeKT64w== dependencies: "@eslint-community/eslint-utils" "^4.4.0" @@ -1392,7 +1454,7 @@ eslint-plugin-vue@^10.0.0: eslint-scope@^8.2.0, eslint-scope@^8.3.0: version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz" integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== dependencies: esrecurse "^4.3.0" @@ -1400,17 +1462,17 @@ eslint-scope@^8.2.0, eslint-scope@^8.3.0: eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint-visitor-keys@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== -eslint@^9.22.0: +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9.22.0: version "9.22.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.22.0.tgz#0760043809fbf836f582140345233984d613c552" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz" integrity sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -1451,12 +1513,12 @@ eslint@^9.22.0: esm@^3.2.25: version "3.2.25" - resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + resolved "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== espree@^10.0.1, espree@^10.3.0: version "10.3.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + resolved "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz" integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== dependencies: acorn "^8.14.0" @@ -1465,41 +1527,41 @@ espree@^10.0.1, espree@^10.3.0: esquery@^1.5.0, esquery@^1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eventemitter3@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== execa@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: cross-spawn "^7.0.3" @@ -1514,12 +1576,12 @@ execa@^8.0.1: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.3.2: version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -1530,38 +1592,38 @@ fast-glob@^3.3.2: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.19.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== dependencies: reusify "^1.0.4" file-entry-cache@^8.0.0: version "8.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz" integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: flat-cache "^4.0.0" fill-range@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1569,7 +1631,7 @@ find-up@^5.0.0: flat-cache@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" @@ -1577,19 +1639,19 @@ flat-cache@^4.0.0: flatted@^3.2.9: version "3.3.3" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -focus-trap@^7.6.4: +focus-trap@^7, focus-trap@^7.6.4: version "7.6.4" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.6.4.tgz#455ec5c51fee5ae99604ca15142409ffbbf84db9" + resolved "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz" integrity sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw== dependencies: tabbable "^6.2.0" foreground-child@^3.1.0: version "3.3.1" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: cross-spawn "^7.0.6" @@ -1597,36 +1659,36 @@ foreground-child@^3.1.0: fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== get-east-asian-width@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz" integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== get-stream@^8.0.1: version "8.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" glob@~10.4.5: version "10.4.5" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" @@ -1638,34 +1700,34 @@ glob@~10.4.5: globals@^14.0.0: version "14.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== globals@^16.0.0: version "16.0.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-16.0.0.tgz#3d7684652c5c4fbd086ec82f9448214da49382d8" + resolved "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz" integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== good-listener@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + resolved "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz" integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== dependencies: delegate "^3.1.2" graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== hast-util-to-html@^9.0.4: version "9.0.5" - resolved "https://registry.yarnpkg.com/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz#ccc673a55bb8e85775b08ac28380f72d47167005" + resolved "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz" integrity sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw== dependencies: "@types/hast" "^3.0.0" @@ -1682,24 +1744,24 @@ hast-util-to-html@^9.0.4: hast-util-whitespace@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz#7778ed9d3c92dd9e8c5c8f648a49c21fc51cb621" + resolved "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz" integrity sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw== dependencies: "@types/hast" "^3.0.0" hookable@^5.5.3: version "5.5.3" - resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d" + resolved "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz" integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== html-void-elements@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-3.0.0.tgz#fc9dbd84af9e747249034d4d62602def6517f1d7" + resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz" integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== htmlparser2@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-5.0.1.tgz#7daa6fc3e35d6107ac95a4fc08781f091664f6e7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz" integrity sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ== dependencies: domelementtype "^2.0.1" @@ -1709,7 +1771,7 @@ htmlparser2@^5.0.0: htmlparser2@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: domelementtype "^2.0.1" @@ -1719,22 +1781,22 @@ htmlparser2@^6.1.0: human-signals@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== ignore@^5.2.0, ignore@^5.3.1: version "5.3.2" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== ignore@~7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.3.tgz#397ef9315dfe0595671eefe8b633fec6943ab733" + resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz" integrity sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA== import-fresh@^3.2.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: parent-module "^1.0.0" @@ -1742,22 +1804,22 @@ import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== ini@~4.1.0: version "4.1.3" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" + resolved "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz" integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== is-alphabetical@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-2.0.1.tgz#01072053ea7c1036df3c7d19a6daaec7f19e789b" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz" integrity sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ== is-alphanumerical@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz#7c03fbe96e3e931113e57f964b0a368cc2dfd875" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz" integrity sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw== dependencies: is-alphabetical "^2.0.0" @@ -1765,66 +1827,66 @@ is-alphanumerical@^2.0.0: is-decimal@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-2.0.1.tgz#9469d2dc190d0214fd87d78b78caecc0cc14eef7" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz" integrity sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A== is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-fullwidth-code-point@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== is-fullwidth-code-point@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz" integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== dependencies: get-east-asian-width "^1.0.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-hexadecimal@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== is-what@^4.1.8: version "4.1.16" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-4.1.16.tgz#1ad860a19da8b4895ad5495da3182ce2acdd7a6f" + resolved "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz" integrity sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== jackspeak@^3.1.2: version "3.4.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" @@ -1833,39 +1895,39 @@ jackspeak@^3.1.2: js-yaml@^4.1.0, js-yaml@~4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== jsonc-parser@~3.3.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz" integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ== jsonpointer@~5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== juice@^8.0.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/juice/-/juice-8.1.0.tgz#4ea23362522fe06418229943237ee3751a4fca70" + resolved "https://registry.npmjs.org/juice/-/juice-8.1.0.tgz" integrity sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA== dependencies: cheerio "1.0.0-rc.10" @@ -1876,21 +1938,21 @@ juice@^8.0.0: katex@^0.16.0: version "0.16.21" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.21.tgz#8f63c659e931b210139691f2cc7bb35166b792a3" + resolved "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz" integrity sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A== dependencies: commander "^8.3.0" keyv@^4.5.4: version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" levn@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -1898,19 +1960,19 @@ levn@^0.4.1: lilconfig@^3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== linkify-it@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz" integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== dependencies: uc.micro "^2.0.0" lint-staged@^15.4.3: version "15.4.3" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-15.4.3.tgz#e73587cc857f580c99f907abefe9ac8d8d5e74c1" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.4.3.tgz" integrity sha512-FoH1vOeouNh1pw+90S+cnuoFwRfUD9ijY2GKy5h7HS3OR7JVir2N2xrsa0+Twc1B7cW72L+88geG5cW4wIhn7g== dependencies: chalk "^5.4.1" @@ -1926,7 +1988,7 @@ lint-staged@^15.4.3: listr2@^8.2.5: version "8.2.5" - resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.2.5.tgz#5c9db996e1afeb05db0448196d3d5f64fec2593d" + resolved "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz" integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== dependencies: cli-truncate "^4.0.0" @@ -1938,24 +2000,24 @@ listr2@^8.2.5: locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== log-update@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== dependencies: ansi-escapes "^7.0.0" @@ -1966,24 +2028,24 @@ log-update@^6.1.0: lru-cache@^10.2.0: version "10.4.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== magic-string@^0.30.11: version "0.30.17" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" mark.js@8.11.1: version "8.11.1" - resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5" + resolved "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz" integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== -markdown-it-mathjax3@^4.3.2: +markdown-it-mathjax3@^4, markdown-it-mathjax3@^4.3.2: version "4.3.2" - resolved "https://registry.yarnpkg.com/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz#1e34aa86f8560b283fd283008334adc2d6b05a37" + resolved "https://registry.npmjs.org/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz" integrity sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w== dependencies: juice "^8.0.0" @@ -1991,7 +2053,7 @@ markdown-it-mathjax3@^4.3.2: markdown-it@14.1.0: version "14.1.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz" integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== dependencies: argparse "^2.0.1" @@ -2003,7 +2065,7 @@ markdown-it@14.1.0: markdownlint-cli@^0.44.0: version "0.44.0" - resolved "https://registry.yarnpkg.com/markdownlint-cli/-/markdownlint-cli-0.44.0.tgz#02b24c8a20972c50d124a6cafdeca3beb085a1ce" + resolved "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.44.0.tgz" integrity sha512-ZJTAONlvF9NkrIBltCdW15DxN9UTbPiKMEqAh2EU2gwIFlrCMavyCEPPO121cqfYOrLUJWW8/XKWongstmmTeQ== dependencies: commander "~13.1.0" @@ -2019,7 +2081,7 @@ markdownlint-cli@^0.44.0: markdownlint@~0.37.4: version "0.37.4" - resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.37.4.tgz#dd58c4a13b798d4702438e5f7fd587a219f753f6" + resolved "https://registry.npmjs.org/markdownlint/-/markdownlint-0.37.4.tgz" integrity sha512-u00joA/syf3VhWh6/ybVFkib5Zpj2e5KB/cfCei8fkSRuums6nyisTWGqjTWIOFoFwuXoTBQQiqlB4qFKp8ncQ== dependencies: markdown-it "14.1.0" @@ -2034,7 +2096,7 @@ markdownlint@~0.37.4: mathjax-full@^3.2.0: version "3.2.2" - resolved "https://registry.yarnpkg.com/mathjax-full/-/mathjax-full-3.2.2.tgz#43f02e55219db393030985d2b6537ceae82f1fa7" + resolved "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz" integrity sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w== dependencies: esm "^3.2.25" @@ -2044,7 +2106,7 @@ mathjax-full@^3.2.0: mdast-util-to-hast@^13.0.0: version "13.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" + resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz" integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== dependencies: "@types/hast" "^3.0.0" @@ -2059,32 +2121,32 @@ mdast-util-to-hast@^13.0.0: mdurl@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz" integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== mensch@^0.3.4: version "0.3.4" - resolved "https://registry.yarnpkg.com/mensch/-/mensch-0.3.4.tgz#770f91b46cb16ea5b204ee735768c3f0c491fecd" + resolved "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz" integrity sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== mhchemparser@^4.1.0: version "4.2.1" - resolved "https://registry.yarnpkg.com/mhchemparser/-/mhchemparser-4.2.1.tgz#d73982e66bc06170a85b1985600ee9dabe157cb0" + resolved "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz" integrity sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ== -micromark-core-commonmark@2.0.2: +micromark-core-commonmark@^2.0.0, micromark-core-commonmark@2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz#6a45bbb139e126b3f8b361a10711ccc7c6e15e93" + resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz" integrity sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== dependencies: decode-named-character-reference "^1.0.0" @@ -2104,31 +2166,9 @@ micromark-core-commonmark@2.0.2: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" -micromark-core-commonmark@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz#c691630e485021a68cf28dbc2b2ca27ebf678cd4" - integrity sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg== - dependencies: - decode-named-character-reference "^1.0.0" - devlop "^1.0.0" - micromark-factory-destination "^2.0.0" - micromark-factory-label "^2.0.0" - micromark-factory-space "^2.0.0" - micromark-factory-title "^2.0.0" - micromark-factory-whitespace "^2.0.0" - micromark-util-character "^2.0.0" - micromark-util-chunked "^2.0.0" - micromark-util-classify-character "^2.0.0" - micromark-util-html-tag-name "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" - micromark-util-resolve-all "^2.0.0" - micromark-util-subtokenize "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" - micromark-extension-directive@3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz#2eb61985d1995a7c1ff7621676a4f32af29409e8" + resolved "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz" integrity sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA== dependencies: devlop "^1.0.0" @@ -2141,7 +2181,7 @@ micromark-extension-directive@3.0.2: micromark-extension-gfm-autolink-literal@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz#6286aee9686c4462c1e3552a9d505feddceeb935" + resolved "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz" integrity sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw== dependencies: micromark-util-character "^2.0.0" @@ -2151,7 +2191,7 @@ micromark-extension-gfm-autolink-literal@2.1.0: micromark-extension-gfm-footnote@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz#4dab56d4e398b9853f6fe4efac4fc9361f3e0750" + resolved "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz" integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== dependencies: devlop "^1.0.0" @@ -2165,7 +2205,7 @@ micromark-extension-gfm-footnote@2.1.0: micromark-extension-gfm-table@2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz#5cadedfbb29fca7abf752447967003dc3b6583c9" + resolved "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz" integrity sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g== dependencies: devlop "^1.0.0" @@ -2176,7 +2216,7 @@ micromark-extension-gfm-table@2.1.0: micromark-extension-math@3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz#c42ee3b1dd5a9a03584e83dd8f08e3de510212c1" + resolved "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz" integrity sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg== dependencies: "@types/katex" "^0.16.0" @@ -2189,7 +2229,7 @@ micromark-extension-math@3.1.0: micromark-factory-destination@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz#8fef8e0f7081f0474fbdd92deb50c990a0264639" + resolved "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz" integrity sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA== dependencies: micromark-util-character "^2.0.0" @@ -2198,7 +2238,7 @@ micromark-factory-destination@^2.0.0: micromark-factory-label@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz#5267efa97f1e5254efc7f20b459a38cb21058ba1" + resolved "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz" integrity sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg== dependencies: devlop "^1.0.0" @@ -2208,7 +2248,7 @@ micromark-factory-label@^2.0.0: micromark-factory-space@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz#36d0212e962b2b3121f8525fc7a3c7c029f334fc" + resolved "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz" integrity sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg== dependencies: micromark-util-character "^2.0.0" @@ -2216,7 +2256,7 @@ micromark-factory-space@^2.0.0: micromark-factory-title@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz#237e4aa5d58a95863f01032d9ee9b090f1de6e94" + resolved "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz" integrity sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw== dependencies: micromark-factory-space "^2.0.0" @@ -2226,7 +2266,7 @@ micromark-factory-title@^2.0.0: micromark-factory-whitespace@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz#06b26b2983c4d27bfcc657b33e25134d4868b0b1" + resolved "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz" integrity sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ== dependencies: micromark-factory-space "^2.0.0" @@ -2236,7 +2276,7 @@ micromark-factory-whitespace@^2.0.0: micromark-util-character@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/micromark-util-character/-/micromark-util-character-2.1.1.tgz#2f987831a40d4c510ac261e89852c4e9703ccda6" + resolved "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz" integrity sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q== dependencies: micromark-util-symbol "^2.0.0" @@ -2244,14 +2284,14 @@ micromark-util-character@^2.0.0: micromark-util-chunked@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz#47fbcd93471a3fccab86cff03847fc3552db1051" + resolved "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz" integrity sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA== dependencies: micromark-util-symbol "^2.0.0" micromark-util-classify-character@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz#d399faf9c45ca14c8b4be98b1ea481bced87b629" + resolved "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz" integrity sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q== dependencies: micromark-util-character "^2.0.0" @@ -2260,7 +2300,7 @@ micromark-util-classify-character@^2.0.0: micromark-util-combine-extensions@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz#2a0f490ab08bff5cc2fd5eec6dd0ca04f89b30a9" + resolved "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz" integrity sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg== dependencies: micromark-util-chunked "^2.0.0" @@ -2268,38 +2308,38 @@ micromark-util-combine-extensions@^2.0.0: micromark-util-decode-numeric-character-reference@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz#fcf15b660979388e6f118cdb6bf7d79d73d26fe5" + resolved "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz" integrity sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw== dependencies: micromark-util-symbol "^2.0.0" micromark-util-encode@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz#0d51d1c095551cfaac368326963cf55f15f540b8" + resolved "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz" integrity sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw== micromark-util-html-tag-name@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz#e40403096481986b41c106627f98f72d4d10b825" + resolved "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz" integrity sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA== micromark-util-normalize-identifier@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz#c30d77b2e832acf6526f8bf1aa47bc9c9438c16d" + resolved "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz" integrity sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q== dependencies: micromark-util-symbol "^2.0.0" micromark-util-resolve-all@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz#e1a2d62cdd237230a2ae11839027b19381e31e8b" + resolved "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz" integrity sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg== dependencies: micromark-util-types "^2.0.0" micromark-util-sanitize-uri@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz#ab89789b818a58752b73d6b55238621b7faa8fd7" + resolved "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz" integrity sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ== dependencies: micromark-util-character "^2.0.0" @@ -2308,7 +2348,7 @@ micromark-util-sanitize-uri@^2.0.0: micromark-util-subtokenize@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz#d8ade5ba0f3197a1cf6a2999fbbfe6357a1a19ee" + resolved "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz" integrity sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA== dependencies: devlop "^1.0.0" @@ -2318,22 +2358,17 @@ micromark-util-subtokenize@^2.0.0: micromark-util-symbol@^2.0.0: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz#e5da494e8eb2b071a0d08fb34f6cefec6c0a19b8" + resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz" integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== -micromark-util-types@2.0.1: +micromark-util-types@^2.0.0, micromark-util-types@2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.1.tgz#a3edfda3022c6c6b55bfb049ef5b75d70af50709" + resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz" integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== -micromark-util-types@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-2.0.2.tgz#f00225f5f5a0ebc3254f96c36b6605c4b393908e" - integrity sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA== - micromark@4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-4.0.1.tgz#294c2f12364759e5f9e925a767ae3dfde72223ff" + resolved "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz" integrity sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw== dependencies: "@types/debug" "^4.0.0" @@ -2356,7 +2391,7 @@ micromark@4.0.1: micromatch@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" @@ -2364,111 +2399,111 @@ micromatch@^4.0.8: mime@^2.4.6: version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== mimic-function@^5.0.0: version "5.0.1" - resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== minimatch@^3.1.2: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^9.0.4, minimatch@~9.0.5: version "9.0.5" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" minimist@^1.2.8: version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== minisearch@^7.1.1: version "7.1.2" - resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-7.1.2.tgz#296ee8d1906cc378f7e57a3a71f07e5205a75df5" + resolved "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz" integrity sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA== mitt@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz" integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== mj-context-menu@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" + resolved "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz" integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== ms@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== nanoid@^3.3.8: version "3.3.9" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.9.tgz#e0097d8e026b3343ff053e9ccd407360a03f503a" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz" integrity sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== node-fetch@^2.6.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" npm-run-path@^5.1.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" nth-check@^2.0.1, nth-check@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== dependencies: boolbase "^1.0.0" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" onetime@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== dependencies: mimic-function "^5.0.0" oniguruma-to-es@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz#480e4bac4d3bc9439ac0d2124f0725e7a0d76d17" + resolved "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz" integrity sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ== dependencies: emoji-regex-xs "^1.0.0" @@ -2477,7 +2512,7 @@ oniguruma-to-es@^3.1.0: optionator@^0.9.3: version "0.9.4" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: deep-is "^0.1.3" @@ -2489,33 +2524,33 @@ optionator@^0.9.3: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" package-json-from-dist@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse-entities@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-4.0.2.tgz#61d46f5ed28e4ee62e9ddc43d6b010188443f159" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz" integrity sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw== dependencies: "@types/unist" "^2.0.0" @@ -2528,34 +2563,34 @@ parse-entities@^4.0.0: parse5-htmlparser2-tree-adapter@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== dependencies: parse5 "^6.0.1" parse5@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-scurry@^1.11.1: version "1.11.1" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" @@ -2563,40 +2598,40 @@ path-scurry@^1.11.1: perfect-debounce@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a" + resolved "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz" integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA== picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pidtree@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== popper.js@^1.16.1: version "1.16.1" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" + resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== postcss-selector-parser@^6.0.15: version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss@^8.4.43, postcss@^8.4.48: +postcss@^8, postcss@^8.4.14, postcss@^8.4.43, postcss@^8.4.48: version "8.5.3" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz" integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== dependencies: nanoid "^3.3.8" @@ -2605,71 +2640,76 @@ postcss@^8.4.43, postcss@^8.4.48: preact@^10.0.0: version "10.26.4" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.26.4.tgz#b514f4249453a4247c82ff6d1267d59b7d78f9f9" + resolved "https://registry.npmjs.org/preact/-/preact-10.26.4.tgz" integrity sha512-KJhO7LBFTjP71d83trW+Ilnjbo+ySsaAgCfXOXUlmGzJ4ygYPWmysm77yg4emwfmoz3b22yvH5IsVFHbhUaH5w== prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +"prettier@^1.18.2 || ^2.0.0": + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + prettier@^3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz" integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== property-information@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.0.0.tgz#3508a6d6b0b8eb3ca6eb2c6623b164d2ed2ab112" + resolved "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz" integrity sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg== punycode.js@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + resolved "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz" integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== punycode@^2.1.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== regenerator-runtime@^0.14.0: version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regex-recursion@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/regex-recursion/-/regex-recursion-6.0.2.tgz#a0b1977a74c87f073377b938dbedfab2ea582b33" + resolved "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz" integrity sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg== dependencies: regex-utilities "^2.3.0" regex-utilities@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/regex-utilities/-/regex-utilities-2.3.0.tgz#87163512a15dce2908cf079c8960d5158ff43280" + resolved "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz" integrity sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng== regex@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/regex/-/regex-6.0.1.tgz#282fa4435d0c700b09c0eb0982b602e05ab6a34f" + resolved "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz" integrity sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA== dependencies: regex-utilities "^2.3.0" resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== restore-cursor@^5.0.0: version "5.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: onetime "^7.0.0" @@ -2677,17 +2717,17 @@ restore-cursor@^5.0.0: reusify@^1.0.4: version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== rfdc@^1.4.1: version "1.4.1" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== rollup@^4.20.0: version "4.35.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.35.0.tgz#76c95dba17a579df4c00c3955aed32aa5d4dc66d" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.35.0.tgz" integrity sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg== dependencies: "@types/estree" "1.0.6" @@ -2715,7 +2755,7 @@ rollup@^4.20.0: run-con@~1.3.2: version "1.3.2" - resolved "https://registry.yarnpkg.com/run-con/-/run-con-1.3.2.tgz#755860a10ce326a96b509485fcea50b4d03754e8" + resolved "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz" integrity sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg== dependencies: deep-extend "^0.6.0" @@ -2725,36 +2765,41 @@ run-con@~1.3.2: run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" +"search-insights@>= 1 < 3": + version "2.17.3" + resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz" + integrity sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ== + select@^1.1.2: version "1.1.2" - resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz" integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== semver@^7.6.0, semver@^7.6.3: version "7.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shiki@^2.1.0: version "2.5.0" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-2.5.0.tgz#09d01ebf3b0b06580431ce3ddc023320442cf223" + resolved "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz" integrity sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ== dependencies: "@shikijs/core" "2.5.0" @@ -2768,12 +2813,12 @@ shiki@^2.1.0: signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== slice-ansi@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: ansi-styles "^6.0.0" @@ -2781,7 +2826,7 @@ slice-ansi@^5.0.0: slice-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz" integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== dependencies: ansi-styles "^6.2.1" @@ -2789,32 +2834,37 @@ slice-ansi@^7.1.0: slick@^1.12.2: version "1.12.2" - resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7" + resolved "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz" integrity sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A== smol-toml@~1.3.1: version "1.3.1" - resolved "https://registry.yarnpkg.com/smol-toml/-/smol-toml-1.3.1.tgz#d9084a9e212142e3cab27ef4e2b8e8ba620bfe15" + resolved "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.1.tgz" integrity sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ== source-map-js@^1.2.0, source-map-js@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + space-separated-tokens@^2.0.0: version "2.0.2" - resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz#1ecd9d2350a3844572c3f4a312bceb018348859f" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" integrity sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q== speakingurl@^14.0.1: version "14.0.1" - resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53" + resolved "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz" integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ== speech-rule-engine@^4.0.6: version "4.0.7" - resolved "https://registry.yarnpkg.com/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz#b655dacbad3dae04acc0f7665e26ef258397dd09" + resolved "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz" integrity sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g== dependencies: commander "9.2.0" @@ -2823,12 +2873,12 @@ speech-rule-engine@^4.0.6: string-argv@^0.3.2: version "0.3.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -2837,7 +2887,7 @@ string-argv@^0.3.2: string-width@^4.1.0: version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -2846,7 +2896,7 @@ string-width@^4.1.0: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" @@ -2855,7 +2905,7 @@ string-width@^5.0.1, string-width@^5.1.2: string-width@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: emoji-regex "^10.3.0" @@ -2864,7 +2914,7 @@ string-width@^7.0.0: stringify-entities@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-4.0.4.tgz#b3b79ef5f277cc4ac73caeb0236c5ba939b3a4f3" + resolved "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz" integrity sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg== dependencies: character-entities-html4 "^2.0.0" @@ -2872,136 +2922,136 @@ stringify-entities@^4.0.0: "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== superjson@^2.2.1: version "2.2.2" - resolved "https://registry.yarnpkg.com/superjson/-/superjson-2.2.2.tgz#9d52bf0bf6b5751a3c3472f1292e714782ba3173" + resolved "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz" integrity sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q== dependencies: copy-anything "^3.0.2" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" tabbable@^6.2.0: version "6.2.0" - resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" + resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== tiny-emitter@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" tr46@~0.0.3: version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== trim-lines@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" + resolved "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz" integrity sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg== ts-api-utils@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz" integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w== tslib@^2.2.0: version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" typescript-eslint@^8.26.1: version "8.26.1" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.26.1.tgz#d17a638a7543bc535157b83cdf5876513c71493b" + resolved "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.1.tgz" integrity sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg== dependencies: "@typescript-eslint/eslint-plugin" "8.26.1" "@typescript-eslint/parser" "8.26.1" "@typescript-eslint/utils" "8.26.1" -typescript@^5.2.2: +typescript@*, typescript@^5.2.2, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0": version "5.8.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.2.tgz#8170b3702f74b79db2e5a96207c15e65807999e4" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz" integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== uc.micro@^2.0.0, uc.micro@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== unist-util-is@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" + resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== dependencies: "@types/unist" "^3.0.0" unist-util-position@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-5.0.0.tgz#678f20ab5ca1207a97d7ea8a388373c9cf896be4" + resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz" integrity sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA== dependencies: "@types/unist" "^3.0.0" unist-util-stringify-position@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz#449c6e21a880e0855bf5aabadeb3a740314abac2" + resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz" integrity sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ== dependencies: "@types/unist" "^3.0.0" unist-util-visit-parents@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" + resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz" integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== dependencies: "@types/unist" "^3.0.0" @@ -3009,7 +3059,7 @@ unist-util-visit-parents@^6.0.0: unist-util-visit@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" + resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz" integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== dependencies: "@types/unist" "^3.0.0" @@ -3018,19 +3068,19 @@ unist-util-visit@^5.0.0: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== v-tooltip@^2.1.3: version "2.1.3" - resolved "https://registry.yarnpkg.com/v-tooltip/-/v-tooltip-2.1.3.tgz#281c2015d1e73787f13c8956aa295b8c3a73f261" + resolved "https://registry.npmjs.org/v-tooltip/-/v-tooltip-2.1.3.tgz" integrity sha512-xXngyxLQTOx/yUEy50thb8te7Qo4XU6h4LZB6cvEfVd9mnysUxLEoYwGWDdqR+l69liKsy3IPkdYff3J1gAJ5w== dependencies: "@babel/runtime" "^7.13.10" @@ -3040,12 +3090,12 @@ v-tooltip@^2.1.3: valid-data-url@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/valid-data-url/-/valid-data-url-3.0.1.tgz#826c1744e71b5632e847dd15dbd45b9fb38aa34f" + resolved "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz" integrity sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA== vfile-message@^4.0.0: version "4.0.2" - resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-4.0.2.tgz#c883c9f677c72c166362fd635f21fc165a7d1181" + resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz" integrity sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw== dependencies: "@types/unist" "^3.0.0" @@ -3053,15 +3103,15 @@ vfile-message@^4.0.0: vfile@^6.0.0: version "6.0.3" - resolved "https://registry.yarnpkg.com/vfile/-/vfile-6.0.3.tgz#3652ab1c496531852bf55a6bac57af981ebc38ab" + resolved "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz" integrity sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q== dependencies: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -vite@^5.4.14: +"vite@^5.0.0 || ^6.0.0", vite@^5.4.14: version "5.4.14" - resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.14.tgz#ff8255edb02134df180dcfca1916c37a6abe8408" + resolved "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz" integrity sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA== dependencies: esbuild "^0.21.3" @@ -3072,7 +3122,7 @@ vite@^5.4.14: vitepress@^1.6.3: version "1.6.3" - resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.6.3.tgz#4e4662ce2ad55ef64604ecf4f96231a8da2fe9ba" + resolved "https://registry.npmjs.org/vitepress/-/vitepress-1.6.3.tgz" integrity sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw== dependencies: "@docsearch/css" "3.8.2" @@ -3096,14 +3146,14 @@ vitepress@^1.6.3: vue-clipboard2@^0.3.3: version "0.3.3" - resolved "https://registry.yarnpkg.com/vue-clipboard2/-/vue-clipboard2-0.3.3.tgz#331fec85f9d4f175eb0d4feaef4d77338562af36" + resolved "https://registry.npmjs.org/vue-clipboard2/-/vue-clipboard2-0.3.3.tgz" integrity sha512-aNWXIL2DKgJyY/1OOeITwAQz1fHaCIGvUFHf9h8UcoQBG5a74MkdhS/xqoYe7DNZdQmZRL+TAdIbtUs9OyVjbw== dependencies: clipboard "^2.0.0" -vue-eslint-parser@^10.1.1: +vue-eslint-parser@^10.0.0, vue-eslint-parser@^10.1.1: version "10.1.1" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-10.1.1.tgz#0d56d17a8e64cda088c8601dcbfc2ea51548e3d2" + resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.1.1.tgz" integrity sha512-bh2Z/Au5slro9QJ3neFYLanZtb1jH+W2bKqGHXAoYD4vZgNG3KeotL7JpPv5xzY4UXUXJl7TrIsnzECH63kd3Q== dependencies: debug "^4.4.0" @@ -3116,14 +3166,22 @@ vue-eslint-parser@^10.1.1: vue-resize@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-1.0.1.tgz#c120bed4e09938771d622614f57dbcf58a5147ee" + resolved "https://registry.npmjs.org/vue-resize/-/vue-resize-1.0.1.tgz" integrity sha512-z5M7lJs0QluJnaoMFTIeGx6dIkYxOwHThlZDeQnWZBizKblb99GSejPnK37ZbNE/rVwDcYcHY+Io+AxdpY952w== dependencies: "@babel/runtime" "^7.13.10" -vue@^3.5.13: +vue@^2.6.0: + version "2.7.16" + resolved "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz" + integrity sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw== + dependencies: + "@vue/compiler-sfc" "2.7.16" + csstype "^3.1.0" + +vue@^3.2.25, vue@^3.5.13, vue@3.5.13: version "3.5.13" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.13.tgz#9f760a1a982b09c0c04a867903fc339c9f29ec0a" + resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz" integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== dependencies: "@vue/compiler-dom" "3.5.13" @@ -3134,7 +3192,7 @@ vue@^3.5.13: web-resource-inliner@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz#df0822f0a12028805fe80719ed52ab6526886e02" + resolved "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz" integrity sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A== dependencies: ansi-colors "^4.1.1" @@ -3146,12 +3204,12 @@ web-resource-inliner@^6.0.1: webidl-conversions@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== whatwg-url@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== dependencies: tr46 "~0.0.3" @@ -3159,24 +3217,24 @@ whatwg-url@^5.0.0: which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wicked-good-xpath@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz#81b0e95e8650e49c94b22298fff8686b5553cf6c" + resolved "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz" integrity sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw== word-wrap@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -3185,7 +3243,7 @@ word-wrap@^1.2.5: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -3194,7 +3252,7 @@ wrap-ansi@^8.1.0: wrap-ansi@^9.0.0: version "9.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== dependencies: ansi-styles "^6.2.1" @@ -3203,25 +3261,25 @@ wrap-ansi@^9.0.0: xml-name-validator@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xmldom-sre@0.1.31: version "0.1.31" - resolved "https://registry.yarnpkg.com/xmldom-sre/-/xmldom-sre-0.1.31.tgz#10860d5bab2c603144597d04bf2c4980e98067f4" + resolved "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz" integrity sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw== yaml@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz" integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== zwitch@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-2.0.4.tgz#c827d4b0acb76fc3e685a4c6ec2902d51070e9d7" + resolved "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz" integrity sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A== From fbbf757ca39db8fabb48322bb5bc2b6b7b28909a Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Tue, 29 Jul 2025 17:37:23 +0530 Subject: [PATCH 02/46] fix: remove few things --- docs/learn/overview/p2p.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/learn/overview/p2p.md b/docs/learn/overview/p2p.md index c9756b6..b65d21a 100644 --- a/docs/learn/overview/p2p.md +++ b/docs/learn/overview/p2p.md @@ -23,9 +23,9 @@ The **Protocol Abstraction** layer provides a unified interface that allows seam The data flow diagram illustrates how OptimumP2P integrates with blockchain infrastructure to provide enhanced data propagation. The system operates through three main components: the Validator Node, the Optimum Service, and the Networks layer. -At the **Validator Node** level, the Optimum Agent interfaces directly with the blockchain client through IPC (Inter-Process Communication). Transaction data flows from the blockchain client to the Optimum Agent, which serves as the bridge between the blockchain infrastructure and the OptimumP2P network. +At the **Validator Node** level, OptimumP2P interfaces directly with the blockchain client to access transaction data. This integration serves as the bridge between the blockchain infrastructure and the OptimumP2P network. -The **Optimum Service** acts as the central processing unit where the core RLNC encoding and network coordination takes place. When transaction data arrives from the Optimum Agent, the service applies Random Linear Network Coding to create redundant, encoded shards that can be efficiently propagated across the network. +The **Optimum Service** acts as the central processing unit where the core RLNC encoding and network coordination takes place. When transaction data is received from the validator, the service applies Random Linear Network Coding to create redundant, encoded shards that can be efficiently propagated across the network. The **Networks** component demonstrates the dual-path approach for maximum reliability. The primary path uses Fast Sync through the Optimum Network for rapid propagation using RLNC-encoded data. This network injects encoded shards to global blockchain nodes and validator nodes, ensuring fast delivery of critical information. From ae7ca652435986393414c1e7dc7cd3be6d9b1fad Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 30 Jul 2025 00:19:11 +0530 Subject: [PATCH 03/46] fix: improve docs --- docs/learn/overview/p2p.md | 103 +++++++++++++++++++++++++------------ static/img/img_1.png | Bin 0 -> 137802 bytes static/img/img_2.png | Bin 0 -> 121906 bytes static/img/rlnc.png | Bin 0 -> 407054 bytes 4 files changed, 70 insertions(+), 33 deletions(-) create mode 100644 static/img/img_1.png create mode 100644 static/img/img_2.png create mode 100644 static/img/rlnc.png diff --git a/docs/learn/overview/p2p.md b/docs/learn/overview/p2p.md index b65d21a..c337b80 100644 --- a/docs/learn/overview/p2p.md +++ b/docs/learn/overview/p2p.md @@ -1,66 +1,103 @@ -# OptimumP2P: High-Performance Network Coding for Decentralized Systems +# OptimumP2P -OptimumP2P is a performant message-passing protocol designed for fast, bandwidth-efficient data propagation in decentralized networks. It leverages Random Linear Network Coding (RLNC), a network coding technique developed at MIT, to address fundamental limitations of traditional gossip protocols in blockchain and distributed systems. +OptimumP2P is a chain-agnostic data propagation protocol that utilizes Random Linear Network Coding (RLNC) to improve the speed, efficiency, and reliability of data dissemination in blockchain networks. It is designed as an enhanced alternative to traditional gossip protocols like GossipSub, offering faster block propagation, reduced bandwidth consumption, and improved fault tolerance. -## Architecture Overview +## The Problem: Blockchain Data Propagation Bottlenecks -OptimumP2P operates through a distributed architecture consisting of several key components that work together to enable efficient data propagation. +In modern blockchain networks, data propagation represents a critical bottleneck affecting transaction throughput, block finality, and overall network performance. When a validator proposes a new block, that block must reach a supermajority of network participants before consensus can be achieved. -The **Gateway Layer** provides API access and message coordination through HTTP and WebSocket interfaces. The gateway manages client connections, topic registries, and node pool coordination while handling authentication and authorization for secure access to the network. +Traditional gossip protocols like GossipSub introduce several challenges: +- **High Latency**: Nodes must receive a full message before they can forward it to their peers, leading to cumulative delays across multi-hop paths. +- **Bandwidth Inefficiency**: The same message is often transmitted multiple times over redundant paths, consuming excess bandwidth and increasing operational costs for node operators. +- **Scalability Limits**: As network size and message frequency increase, these protocols can struggle to maintain performance, limiting the practical bounds of block size and block time. -The **P2P Node Network** implements the core networking protocol using libp2p infrastructure with optimized transport layers. Each node maintains peer connections through DHT-based discovery and supports both native OptimumP2P and fallback GossipSub protocols for maximum compatibility and reliability. +## How OptimumP2P Works: A Network Coding Approach -The **Protocol Abstraction** layer provides a unified interface that allows seamless switching between different P2P protocols based on network conditions and requirements. This enables dynamic protocol selection and fallback mechanisms to ensure consistent network operation under varying conditions. - -**Message Coordination** handles topic-based message routing with single-node-per-topic assignment to prevent duplicate processing and optimize bandwidth utilization across the network. - -## Data Flow and Propagation +OptimumP2P addresses these limitations through RLNC, a technique that enables optimal data propagation in distributed networks. Instead of forwarding entire messages, nodes transmit smaller, coded pieces (shards) of the original data.

OptimumP2P Data Flow OptimumP2P Data Flow
-The data flow diagram illustrates how OptimumP2P integrates with blockchain infrastructure to provide enhanced data propagation. The system operates through three main components: the Validator Node, the Optimum Service, and the Networks layer. +The data flow involves three main components: +1. **Validator Node Integration**: OptimumP2P interfaces directly with a blockchain client to access data, such as newly produced blocks or transactions. +2. **The Optimum Service**: This component is responsible for RLNC encoding. When it receives data, it applies network coding to generate redundant, coded shards. +3. **Network Propagation**: The coded shards are propagated through the OptimumP2P network. A fallback mechanism to standard gossip protocols can be maintained for reliability and interoperability. + +This model operates on a publish-subscribe (pub/sub) basis. Any node can publish data, and interested nodes across the globe can subscribe to receive it. This is well-suited for common Web3 communication patterns, from transaction broadcasting to block attestation. + +![OptimumP2P Network Topology](/static/img/img_1.png) + +### Random Linear Network Coding (RLNC) Fundamentals + +RLNC is the core technology that provides OptimumP2P its performance advantages. The process transforms a single large message into a set of smaller, mathematically-related pieces. + +![RLNC Coding and Composability](/static/img/rlnc.png) + +**Key Principles:** + +- **Encoding**: Original data is divided into `k` pieces. These pieces are then used to generate a larger set of `n` coded shards by creating random linear combinations of the original pieces. The coefficients for these combinations are chosen from a finite field. Any equation generated has a high probability (`1 - 1/q`, where `q` is the field size) of being linearly independent, ensuring its utility. +- **Early Forwarding & Composability**: A key feature of RLNC is that nodes do not need to wait to receive all `k` pieces to contribute to the network. As soon as a node receives a shard, it can be combined with other received shards to create and forward a *new, unique* coded shard (a process called recoding). This continuous "mixing" of information allows data to propagate fluidly and rapidly. +- **Decoding**: A receiver only needs to collect *any* `k` linearly independent shards to reconstruct the original message by solving a system of linear equations. This makes the system highly resilient to packet loss, as the specific shards that arrive do not matter, only the total number of unique shards. -At the **Validator Node** level, OptimumP2P interfaces directly with the blockchain client to access transaction data. This integration serves as the bridge between the blockchain infrastructure and the OptimumP2P network. +This approach offers several advantages: +- **Lower Latency**: Messages are broken into coded shards, which can be forwarded to the next node before the whole message is received. +- **Loss Tolerance**: Messages can be decoded with any combination of shards, as long as a sufficient number reach the destination. +- **Bandwidth Efficiency**: Sharding and recoding reduce the amount of redundant data transmission, lowering overall bandwidth usage. -The **Optimum Service** acts as the central processing unit where the core RLNC encoding and network coordination takes place. When transaction data is received from the validator, the service applies Random Linear Network Coding to create redundant, encoded shards that can be efficiently propagated across the network. +### High-Level Architecture -The **Networks** component demonstrates the dual-path approach for maximum reliability. The primary path uses Fast Sync through the Optimum Network for rapid propagation using RLNC-encoded data. This network injects encoded shards to global blockchain nodes and validator nodes, ensuring fast delivery of critical information. +OptimumP2P is composed of several components that work together: -A fallback mechanism ensures network reliability through the standard Blockchain Network using traditional gossip protocols. This dual approach guarantees that even if the OptimumP2P network experiences issues, data can still propagate through conventional means, maintaining network integrity and consensus. +- **Gateway Layer**: Provides a standardized API for blockchain clients to interact with the network via HTTP and WebSockets. It handles client connections, topic management, and authentication. +- **P2P Node Network**: Implements the core RLNC protocol using **[libp2p](https://docs.libp2p.io/)**. It manages peer connections, discovery (via DHT), and protocol negotiation. +- **Protocol Abstraction**: A layer that allows for dynamic protocol selection, enabling interoperability with nodes that may not be running OptimumP2P by falling back to standard GossipSub. -![Network Introduction](/static/img/intro.png) +### High-Level Integration Model -The network topology shows the hierarchical structure where OptimumP2P nodes operate in the upper layer, connecting to gateway nodes that interface with user clients. This architecture enables efficient data distribution from the P2P network down to individual client applications while maintaining scalability and performance. +OptimumP2P is designed to integrate with existing blockchain clients without requiring modifications to their core code. A common integration pattern is the **sidecar relay model**. -## How OptimumP2P Works +![OptimumP2P Validator Implementation](/static/img/img_2.png) -OptimumP2P integrates with networks at the validator level as a software component running on each validator's machine. Block data is read directly from the network client, then sharded and encoded using RLNC before being forwarded to other nodes on the network. The entire process from block data intake to full network propagation takes place in a few hundred milliseconds, maintaining this performance level as data size and frequency scales. +In this model, an **Optimum Relay** process runs alongside the validator's standard Consensus Layer (CL) client. +1. The relay peers directly with the local CL client. +2. When a proposer needs to publish a new block, its relay forwards the block to the interconnected OptimumP2P network. +3. Other validators on the network subscribe to block topics. Their local relays receive the block from the OptimumP2P network and deliver it to their own CL clients for attestation. -The system leverages RLNC to reduce the amount of redundant data that needs to be transmitted. Unlike traditional gossip protocols that require complete message reception before forwarding, OptimumP2P allows data forwarding to begin as soon as any shards are received. This approach saves both time and computational resources while improving overall network efficiency. +This architecture allows validators to tap into the high-performance OptimumP2P network for data propagation while maintaining their existing, unmodified client software for all core consensus duties. -## Random Linear Network Coding Implementation +## Beyond Just Validators: Ecosystem-Wide Benefits -The RLNC implementation in OptimumP2P provides the mathematical foundation for efficient data propagation. Data objects are systematically encoded into k-of-n coded elements using linear algebra over finite fields. This encoding process creates redundant information that allows complete reconstruction from any k received elements out of n transmitted elements. +OptimumP2P is designed as a foundational, general-purpose data propagation layer. Its benefits extend across the entire blockchain ecosystem and it can serve as an enhanced networking stack for any blockchain client, such as those used in Ethereum or as a potential alternative to specialized protocols like Solana's Turbine. -During the encoding process, original data is split into systematic chunks, and linear combinations are computed using randomly generated coefficients. This creates coded shards that contain both original data fragments and encoding vectors. Each shard carries its encoding coefficients, enabling recipients to perform Gaussian elimination for data reconstruction. -The system includes recoding capability, where intermediate nodes can generate new coded packets by linearly combining received packets. This improves network efficiency without requiring full data reconstruction at intermediate nodes, allowing for more flexible and resilient data propagation paths. -## Message Types and Protocol Handling +### For L1/L2 Chains and Node Operators +An efficient propagation layer can lead to several advantages for the core network and its operators. +* **Scalability Improvements**: By addressing propagation bottlenecks, networks can explore opportunities to increase block sizes or shorten block times without negatively impacting decentralization. +* **Operational Cost Reduction**: Lower bandwidth requirements can translate to reduced operational costs for node operators, particularly for those in bandwidth-constrained environments. This helps maintain network decentralization by keeping participation accessible. -OptimumP2P defines several message types for efficient network operation. Data messages carry encoded payload data with RLNC coefficients and metadata necessary for reconstruction. Control messages handle subscription management, peer discovery, and protocol negotiation between nodes. Trace events provide network monitoring capabilities by tracking shard propagation and performance metrics throughout the system. +### For Application Developers and End Users +The performance of the base-layer network directly impacts the applications built on top of it. +* **Enablement of Low-Latency dApps**: A network that supports lower-latency interactions can enable more responsive decentralized applications, including those in gaming or high-frequency DeFi. +* **Improved User Experience**: The goal is to improve the end-user experience through the potential for faster transaction confirmations and a more stable gas fee environment resulting from eased network congestion. +* **Enhanced Reliability**: A more predictable network can simplify dApp development by reducing the need for complex retry logic to handle network instability. -The protocol employs DHT-based peer discovery with configurable bootstrap nodes to establish and maintain network connectivity. Connection management includes adaptive connection pools that scale dynamically based on network conditions and message throughput, automated failure detection and recovery from node failures or network partitions, and capability-based selection between OptimumP2P and fallback protocols. +### Security Model -## Security Model +OptimumP2P's security model is built upon the robust foundations of **[libp2p](https://docs.libp2p.io/)**. As such, it inherits a comprehensive suite of security features designed for hostile peer-to-peer environments. For a full overview of these protections, refer to the [libp2p security considerations](https://docs.libp2p.io/concepts/security/security-considerations/). -OptimumP2P implements a comprehensive security model to protect against various attack vectors. The system uses Boneh-Lynn-Shacham (BLS) signatures to provide authentication and non-repudiation for all network communications. Cryptographic hashing ensures data integrity throughout the network, while distributed key management with on-chain registration and verification provides secure identity management. +Key inherited security features include: +- **Authenticated and Encrypted Channels**: All peer-to-peer communication is secured using Noise or TLS, preventing eavesdropping and tampering. +- **Sybil and Eclipse Attack Mitigation**: The protocol uses libp2p's peer discovery and management systems, which include defenses against an attacker flooding the network with malicious nodes to gain control or isolate honest peers. -The protocol includes protection against pollution attacks through coding-theoretic techniques that detect and mitigate data pollution attempts. Eclipse attacks are prevented through DHT-based discovery with multiple bootstrap nodes, preventing network isolation. Integration with blockchain identity systems provides resistance against Sybil attacks by leveraging existing trust infrastructure. +**Network Coding-Specific Security: Pollution Attacks** -## Summary +The primary security challenge unique to network coding is the risk of **pollution attacks**. In such an attack, a malicious actor injects corrupted or invalid coded shards into the network, with the goal of preventing honest nodes from successfully decoding the original message. -OptimumP2P is a high-performance, developer-friendly protocol for fast, reliable, and bandwidth-efficient data propagation in decentralized networks. By leveraging RLNC, it addresses the limitations of traditional gossip protocols, providing measurable improvements in latency, bandwidth usage, and fault tolerance. The protocol is designed for easy integration, broad compatibility, and robust security, making it suitable for validators, chains, and applications seeking to optimize network performance. +OptimumP2P mitigates this risk through a multi-layered approach centered on **source authentication**. +- The original message data is cryptographically hashed to create a unique identifier. +- This identifier, along with the publisher's signature, is bound to the data. +- When a node decodes a message from a set of shards, it can verify the reconstructed data against the publisher's original signature and hash. +If the verification fails, the node knows that at least one of the shards it received was polluted. While identifying the exact malicious shard can be complex, the system can identify the peers who sent the invalid shards and lower their reputation scores, eventually isolating them from the network. This ensures that even though recoding happens at intermediate nodes, the integrity of the data can be verified end-to-end. diff --git a/static/img/img_1.png b/static/img/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5476197de40a3eab2b561dc10fd3296ba809efdd GIT binary patch literal 137802 zcmZ^~19)Z4vOm0IPdLHEw(U%8+qRQEu_l^K>`ZLiwr$(C`DM;~&b{}$&;74@*0X9? z*RQpzyQ_QE4w07?LxBAT3jhERB*cXk0RXUh004v^8uC+;!>cs~0Km&y2noqc2ni9$ zJKC9ASepO<;vw;BQ0huU=;>ODgy7J^0+NR^NJSvI0h6HO^gjy&NCYSt$-uvIS2zB& z!a$~>ZidZXR24wSJ}#yX{n=W4jvxSWmfj=5CIZB5e2`8pa77J1fH39mnAx6Gyen=m7te(N+P=u^cB%Bn@oh%*z#Gk z0-wCtC-$*hWEnnwC-4$OESg<`D(&Qvj2oZ)9iPNj?Y>K#`O0FmAwi>f#-3K*;Xlab zy~ju$@wsB6-%Akyze5B4?_nI793Hek95#fUuk+$I_ zY>j)PWE6rp)Gfenf>nRrxLqNgeAgz9f$Bq8N{t%(g`57M85A~xwViQo;?GBM$4~8u z!a?OF%`Mf7Jw1Q}SF;^UkS~a%P9Pf=pboYz?k21K7$swAfX?o?D4PFErQZ;wN}2=) zM*hfX5371}k?>{B?Rsmm3RS~UcNgh=bmBLn${wr-$tL16qEXkgFp6w+zHBMascUj~2nNCxJu;3(4x$&!)BYec4`j1#f-s zIS#9FnAqZIUqr=2<$^|pR)f(ANSWyqsaDXH1=W$~cctJz(mQ}^_?c|$3OEOw%VHYu zMeqeXhdtQZ^tLx;A9M_URW%J{m3*;7_N)^W`hi9cD~Tm^Rj?R_S7cDI#g?5tdbjYT z@RZCKV|Ok-aro4vXQBtaaygZ-*sw@=O7jDSJF-qc+&2(+Ai0w5v=Alov{B5T+t#&y z@w<;>=J+A+jfqM8pE&M0&N~h-<-5I5(*tUJ(R27CoIf1Q)ERw#dhp1hA@fOGkXf;@G-%h^ucxiCAhQK{#35%gA2jSUMmlL25NRMuGvP}? zPrj2b!q)qLtHi(o56^^11?TsN+eB%Ewe4A(K}h%KyZq)UfD{lg`I$jv5<$W*-tDkT zWIYn-5COwzV-kcRVUk~1G5AE6?m2ZW7MJ?QS`0EJqf-dT8P{*d3+RG%zacuESJPuZi6vvHO$f<9BElX zsX>ul$7|bbMo01|m?toiSVM`cY+;3fIL^5EINUhXVG&98JusC}OPRZ@ex;hC(4w!i z?#EcixX0A2tgOtea&?%jRm((muyt>i2eaoTZAuHO4N3>a1;x~}YK0ey{8`>gZ(qYj zYqFna6wRM%zt(ClQ!eu^Yas*$6Ku$JI-EHSymfpgd=_!9 zAQPF9j4c^j(9YDza}&O4Htj$cvihkSrtGz&(3u~9Uv;u>_qhlZ|=;{P@0-7^3RC& z5YJ$1zbAjcIlNhz`Diucoe|eS>lAj$K?V6V_1sE9Xx}*XS}$SLvX2 z#*&UxG3N?Tk7t@&iCacsNFPb48#)lZfrc`{dW2>KA;FAxLtR6QRD-t8vewh zHQw`P|7Ng(tj?_Qt#;xW#_p=Ys;R3!*U&4<9kob)?)RG56s7W+F9j>8wd4UZ6v>l3 zTXJUHW`0ibH(xQ5r7A}R6Uh=2%kRsH7HG@aS21m4R}-4+n!Ow!>=T<7S{_{0U31;6 zuN%kb4a8~^YbM-Kc))lt-0NN2ZyXS z6^tbArR=}7*(GKa;crwdU-)%2bxisce4s|qlBd)J-w<_D3ZUC_Y$7a#a%XrDA;H1J z&>&bNPJfYvE{1Q$utrbC(#BZD*hXh!-xa1HWZ`iJ9s<*mi$~v8T~ySl+1k%EZm$VRfI9 zT9~TC3DzXh^m0AuX5l7AvK)gmbcEHL`EVnk`M7(s>o^* zsybR{4b7(E^U2+;hzqisE0qy-<<4t*Cj}M!dgq$$Kro=cp^%!0u*i&PXm|;mcj;(x ztL9hvI=k4de3O)QYjoT5)$NWv?~avRt3?CmOt-<;r%aY^kv)(g^75oeFRfl`1 zd&D|!gdYiKueDOuB_(9_`_5%zHfNvf2=&P%mx#_p`YdnaJ>W4LvY!=H4`Mx@A%5}4)b)T&FjlY>c2p22f>*dkxQ@(_46ayrL@k>KJO2C7Re=s| zKCOxvFtVISlvmZ$dee35>K%0&wT+xvj?X%6-Th^DS4mBFAk~&1)q8(+qKiL+YlPF| zHFcsX;YRl$^0oUt@9O7EU=UkFeNRX8n|tG0TiaIlKwrL8dSWs+*$nldu zP7dEXUu+P!@m9SlTpwSfU#AAnw+Ctm_T;3~XZe8M%hRZUY9S>X=cfss=c6S@|twtT(FMLOD zv4}N%F?_0?)o-(}oUb=&eyx5WlzRR6uU|WTugzmYIx|`TnWSKyz6YYmXmd~Yl?27i zX9S=hFeT$r{(ZQfQlA@)1QT@$QyCcm)h7=PfB-=O zfPHcxp9BE;27ve%4**DlVE-4d2tx619Z&!u*a86lZyn9g=ie*p^ZrEt`w12k1c3Vd zh4Og^WP<)j8*Dxk>_0pR|7RNDyONNE#OG7V$kD{a*2&z?IpRaM=~Dn>FRtMP0HBlp zy+I@tNiG2Z&@~HXb!T-MX)Yr>8#)7HJ3|vXR~!4k`2cuaxjtDN6K4YgR~u_vCoWfB zqJL>{ee!?B^h5;zQgOE8B~q7>ClIo8G$CN4W1wRo;)5k1AmDK{Hsw+j7X3H;^A|6X zxwEr97d^d;iwm6#Go78I89gH>Cnr4v6Fn0X?WYEY!V`gDx`#0==C;gvLjsJ!+F)_3JPw4+h`XA80jo?x=ak8@p{_R8+TMK7CCLa3# zOZ>l4>i-SnV`O2WXZ$zpf6D(iM&tj1`JeLtjgfP-`0Pi6zt!XWPZ|GH_HTV2`o9M7 zKMdj@Yx|e<)7`(g9xr9s1S=}p>i<=u>Yr@&yi#`6UvB%Pg!MU{D1~=~Pnqug%GC?0f z2&Wke$#(#W<2Zh+4^Y0dOU(EuiQrea%QX3d?s6`bmyU;W9m2M6y%1s`|3!Y3GJf?D zcty6yF}aKO60=5R!RhIEe!MV9421PJuk3GqN6DKgyx0|Jt)yw94N7y~~R zn+3>+SM|u-_OTXLFV4>sj*l&cTIT0fk4{hH0^u-Voh_`aVugag3|;SykkZr3Ew8LV zxa+q3kWo}r992+MBx-7E3PRx_7Zwvs+4%Dc)jT&li~el*GF`ugag z(d=AgY-}v9q!gRV1(dX1Yc_e-R#c2B)oPHfuC5Mfe?6Qco{6NzwZLETuAf-C_s_4F zDM0mlN@%SZqy`GS7*x#9bi>c!AH_Z=d4tQKqM(d6tV~W4n2o1K4-ZRP*xDupJi5AF zqISs|1ibz{5)>VwmhaK^6C!Ac47ZaA1k$7McC1I@*$9&i ze}zTU`^~G6{v&!jlKh-RW#IOzyqpfq7QmOf(dwooDJ6w)2_jIg*P**Vkzwb%xm06@ z&63+v3$0;a?-|%;|M5H8CFsOK*57V| z0)yC*^!)=taRna)WeVFV;@k9-^JmBbR+zntN_-QP5S)KXQj&QRc@iZHkuO6MGo~H@ z$B)I-zkf{mp7Skh0;zPfyXD(sX#LUa(~Y94s_Am{kL4P(NMkdzlpj>|^z7eMmNV)_ zJ;bpQ`!Er6kH^VUKqqlK$G&sx!*o6b1VwF(B+`!@Wcb*&bJs=!>{(Wcz4UVK!pVzz z%#FSR^~1jVOXC}jc24^-7AgnAK-&S#XCcNY?{e%wXEC*Y$+hXYzN1xwaxRB(2D*XJ zJ{851kFj>M_rG0qe5}_JqkpT#_ibrxY~1K3ZY0aO%i4TAUsmXp^ZR2XwO>)h?Sf|i zNl7MXz9BgDNLaAYPZuESjAKGdeVhZUO-=~JJ)D~0zO}3~fsDLAPSrcGs75C?-p@9^ zMS=T!?DQk_glVA;Rdl>BCn+iZNV-YmcDV<$n*JRc%B+ta6w>+ykH_4X$<21PQK8;; z%~F7i;I-wVJ$6CYV~jy53G;mm(T9QH%NUu(#ahb(gN8W|18sm`I=fx^5os&pjSNqc zZ4whTQc{?$@S8QJ9rn^ge)omF*XV{B1-Ta_>Q0?yw+w#f8At{Z)$-D2&l!)e>qJ7hulX1H$?o7eegH#k0C8W1<;*p{eOu$d5l=>`So^fd?F z=?X%?9(|JcAL1pO^0U$;H=6WW+E*|hb0K#09&1TtnSoE3UfM?(pX&-0O`(PXw?64^x2Y}Q` zU?FIQ$v12R<`%)KPQW?;D95bJV02Ug1%J{LjEGS4n+?ed-298WA38(D6>KIjO6)Eata|yNS(qvkv4HI?s%IY?IMV?%XoB2tZ#w z?E-W~rQ)W?KySvoejsJsM83tyx7CHyw@tn6X!;E*O|wpP3nzU033e&`TpG_r{>LuF z(Z#-pi7pP&&4qL)nKcb!YeBt^o5U%fa}h_M40MQ~?7Fki`iw=6A73(QR&y#eK0u&v z4m0ZY9LEf11T)ix1QC#0MYF8H_H+K&MX|TqX5`Wb*3S$ ze9+3U{;!#%AVx5sCtF=Sm0u9f2*YTv022(@3||<~l7v8if@C$=ZLob4#zc{>1=)O! z!GIEoF$0Gyw&A2eHL0} z1&}>eS>29V8QlMM)Bgz@p7w#J#&UrGin)%RM;AbP$7aRrw9Hj3&EDa3yt!B8+gwRIGjY> zbF&yA2%s1=IHe(ECiN`tU;2O=vfp7Zy)I=40$JezcL}GzsB=sXXn(F66cAxzwqHk$DH-zV8Rrd-K;$7wz^pHOd^7hC zr*a_GiD_~(ZqhE#E_Evjg6S7&ag)qT8Xry<$6N;&gXg% zjS6x$Pjh_1=4&d(bi#2zEg_v4B1nt-HzX7-0z65+DMP4vnns6qu4ylT0aG$}UwRYA z+#2w?K(Tiv>!*Y|yfO-mVr(!%@fn6~IcMM2TxhuGP=ereHcsUy(&;dLSqI<&v};#N zP4;-D^+8a59oMraE+c^5JM=&7`QFWl({chusmJhY;$ZS)fHU)o-3crC1~*$=kAK2< zyv^7lo?pZ>HlZ#JK^WgKx(KDH*S#KegeVeFH$6aP2)$rwS^eHIajciiFCdiqbt2k*Op8}XOSR>dYC_Y(EKRm$k~B0@nqx!P~GZPxzWX*~J!{jaAY%H6E__hm~n!ZJi_ zj+L8y^ACkq?+-`;ivsU~wl{3~HcqeIs6QI4QNcB(j|H;sg8Cv{#L;vi6E~FI0T9$* z6$d-8RA<(&0~onnZHw%vfANFMKfp=q`?7HU-fr*$_4Wl-ymounzlr?~sf^I-c51M3 zlY#*Y4O22D3;H;(7}Ft@#>7r}`*c%&k?z7?S<|w;v1r=h@Pk-Z zh8-$|-wB0_`3Q5{-1rWc>;bOdX-SP6Xu0AQ}b=tq7 zo!~!n?2uViRp@otf*+oeZEcv^7SE5wTN$F+ce)!oJK1r=zfF9NX`)@)iFocA9oHMT1m|Wh8VBioIcpEarj&#zQ|A5}g z)XwBJkD;f>AB?4tQ>&IT><~UM=G5&FIougJs&X?o35~`yFEL^jm_15&38z+iz5J*_ z?WG~?DJ|aLNyj%;xzjPhg-Az$fX^rn>z40gKz{CI+S4W;d)R1Dlsg9*WjL$73K`)A zeQ-5hxLtm^U(T1|`7qF(=jUlSTE0DHe&C)Iot&FSBp7?9VxcpCYm7`lLagV&lv0+d zi~}IVzMXq=DRthPJoCJQbbhm9D-D7+ zuVX|#SiZKHX=*P&JyxDV?o#Mf&^JT_Xm9<>Za|zRvSAM^TkqkfKM>!75#PNkAEAfx zr&v!7>G4WMsk%o7go`PYJoge;_I)|Aa|`wme`O>NVkE>*ZQZo~Rm<`F_wTSAjCGT6 z#4rSZuDu=}G$#`2NX|iKp%LVwJrbMgDp|uq{Jm-*A@8sNmP9O!-)m_?7pSM!7c!V} zGf7{($)B`A3`Hh(QX@#3`_awQy4Y;iNtAOx?l7Z4X%%(v$~-;qeR&QeqW9oFB=708 zDUYJF`W@EP-9OY5JzTGx?dHTb2Dh$lH9G8r(fY*rRhtd6?Da&GLVO;#f`>}0lGShvBZ9tl`KR$drKFyv6z4%X0{jq32kM%g=o+PKW^@i+ z3i@mcfONQazaB`Mkak5gFRgmpvxAktX246i>3er;&8~KAK(PtM(Ibp?&(;Z3DgF%y zAmq!qi8Kj42rllB;Y4y-8VO;Iyy$|S2`gYSh6xDu3X(`Xvy8yyHl6;?H8f9H(RQB< zk|)jpQpRtrT$!pA1E-R+T=SEhNqf~=k=5pz%3S$caft|nK)QadZ@q$bc& zpezv)l4$PLQF2zk+V~Rfc}<{K&4eMPDjl&NDZix~Tx-DxEE_}l7EK{h)qG*s7@>m_ zH9oFtadMnMVRGEuoSa)vOkg!%me^`NS2_?RVPlp<0-;Gt!Xmm&JoU3gV6;|VfQu`o z4hJ|rk4*=|Xz7KFOTFdkQp{?1ZXUZX|28kwl3OH$n{y{B=_uIT8{jNqm%`R99NrNvz`>st$L zC$>X|QL`7ZpFqRy;p^U#bRdNs+SZr_szueht;NN36Ezaql|q#z1e=#Baznp65yJVp zTRED3WtBgwuXSyw07T&qK-=+>&o|c0mv_30=bHI02u>c7!)SbDUMxvI`>4<3M$4|v zWYlf(CuAmkCPaWHEorhb;E-5`S{n>Rg*!ksWD%AwZ_lm z9?Rk?_1ZB*ppAyN@!nr~`+BsW{M^XGic{$2I`6z*ySMKO{hQ`t7iTi$@Hi{pFOa0t zcwzvT!=#_SuL}~@>3Z7=G&vFrK>Xo!$;g)?*|}bskbnf>yMvHYJCs`%S#h}dSQRD{K!L2w-D#&bgW)<<|Z8YB@WDn#S1KJM17c9JN^9qwm<+lr|{Hs z^+6F?{VpphNVT`Rc42ZCnJ&2e%Pt zLy6$HyL{l-RwM;`tsASBco9!3F*U91Bir75sl}-=Q%X>;rRf36ME)VOq@hm0n%5EK zVz;3fBr*{Bi)X3oSK2+;ZjP-GFear&N_d7$)%)2aHd+YL%@usj*VG=#SMeuH=OGwXD zQQnfje;%D0y@B^SRmk!|Jc>etWkk4~eOU2Hw-;st4!cSrH(}L9M}Db(RkHBK)BmDx z{Q%A9v>&FiQf)GVj+zmPR7RX^0Ldayjk^dKZw)1;0`0Ii>EVup@-<;i@a@uu_|0~S zL(tEtT)8>LM@*Yi(Pri&F|u!T0in0@@(KyYzx@RxqtRC!`PN5&A>SS6#o4dB(h^bS*agJ&?aBXifWF)S_xGz!co zBM%+%q3k}CG8!qyXRTf+TF=~^x>s#zrgX7SS1`qQ?}~iwPI|iPFAvp>+%lF_5kpPQ zE!UYQA7`Xz+D;skSIvj5nskiRuP+L$6_vpe5KMM!4LM zcZc6Da_Ky?PBk8qcb)ZOgw)<;_}Zh1`-U_Waqs8yXd-Zv#w%y z8R@LR(Hn5T{6jNG%EhcMuFk9kebwIf`PHFscyr5`;o?AU0&ws?s5|sF0VR32YxYH* zpA$g`Hdfp(%axuOIL-424H!w%2dfA0ztX8!cKWKaRBd>_l+oz5udc9(vS#?Q_+sxj zm#CH+ix!P|2gVNV5?7`j58|K$0c9# zgYN?0zpSN&vd}>KqTg>sMzD-;E(PE?nQ%E@wU|%KS?h0M)OQ(*A+ucVQ5-mg8UimB8?&uO8l`L{J>SwYt0(Ll!%{mhUXq+3MMLII zo?;R;Gx_AW@|xSF4|;Tm#%Euv6jhXN`tw^H zJBoDTE!-5LBRM2`ojcuQppRnQ9AN=rjKrpZDgkJMzGcR1hAwNBaa9`iLv#z~# z_t=!YUoT#&XqWSmK#6eKVRq;2$a&V813Mq8y(t^TrFGJ@Gxl5WcpBBMXbr=umF$z0 zSW-GF2_J4!F2M!H;C@L*?Vka`R0NT~W1-V_!P<1DQDewNnzT$@j6$_bpM|~eG8Krj z_lLGqX{+7d*(jmG#z8*=TM9Ph#qCl+*Vv9!>9>G&VtX~{mnBR@4%8&S^_u>Wp z2)CkA?vC}nMM|u7GqLmKqDKfbUd6$-K(T47-GS zBb^p3Pt1(VyU2Sax59Nz_(xrrF>&?|8~}aO?+(npO`f zZq!r>bUEfjM=XLOox(R<#;fqf#Q;@9@Vj(l<=^(o7otmv4~}uvMNsW z1icRlyT>%C+?zXJvo3v~$i?7DpIbA|4cwDl0pe$5*@wdY7$!2G~oKAZJa3zB;opAnvbAq7m>Y?!RrZ#j07~w4YYq=tw0j{41 zq5Hhj^&kTPb5IKdB5SY(03H8f^+eE1-IKXt&=w9|dJ8`%8YXpHu$35D*7o-H_rNY3 zT>CKeZwHRhnx$lE?ZQ4r+o0;inNI^guVTc=>#c4zM~Uhp@Mhuq3bc8M6%slIRk`LL0b2|N>M+Klj9zQl zI*r|iLdrStCj!3|Gr**bS7MC+RKQDmS;fbxq(w0wSC&%qXssuwWLj)Fq%I~)isuRk zm(YVktZHa@7+>Igg)FLX$*@^7?V>x5OSj_7I4I>TZ5sLFmON;{gw$2c!0HQboE zwMXgkSxDohR`$KV?WSqXmoyw@C&#j+KVr^YQ=C!_WJ+f);$6B+T8$dEYfo*j=lztF zwCfZQj8vO+yhI1zP&EPC~!U-gvBn2bq!=X=sD9bu@ z4VJ~EgzinFW0>}j+*rx}&p7sXyFjxxC82~OHV@9-pOpYer9w%y z^>f2*#n{uR+;VIQt+Xdhs6ac5%46E6>(Pq6z>c!gPN&|Y)|4SAkJhgVb^mS zQ(3~H9H=0FeF>Qa&ep3=hHw=LiM}2D%<=sfb@o#D-e|ib|A_Fz=o+Gdk|cHAi+&_@ zyuFdF2hV9U+Clgj8T_)4GeV-YFmxV&rFeT-zgp5p`hf36HDEh;T#iI-Jod_NGO-Pe zNzYI4xA>qDD`EU7PnZmPQJni06+;R~$|#t~u3~_zLeY18Y3=PEX`xY#Q$mWk zkGhYg6NsioL;agwLPEO%wyI*dK#f1Pe*A}pwJXI}8B5Xi6vDf@#ND6IAFi`gq<7&B zd*8jn6LRFyP3aPMj`eR1PMD4?S|}e@x=DCl{*1~@!q}krgU!c^k1nOgy@{9Y!Ur4R z_?mv{9D<{7)fWdhH^41}81YTZc-E)g~A^2v1>i3x8CuZ=*!SVOA_Z^emA!= z1gUEit+5#!XG9i*Ml0#Y1MMcDp(tH&5@1i?y!!QpLu^w?S$WoO`h3$r?^yb6P9tqd zM~zW!AuTQk(N@y4i%uhnUrzBQt)YKpyH;-Zan5c}c?nNL9<5AE)r$_%W1VS#xy@31 zZAzsA)g#ZgWsecw50ABG-lj#fxh2kSlCr5lRaWP1V{fr-E(SjbG=2UB<<|~F&q)IcG0}yuXF2a?ulsd2P)Dg ztxq<+zS29Tj!x-4Kn>-4mI<(dI zI_*Mto$GIQ;sta%RO71p6VKMnQf_x{t?4^0JHB_1hpZ)r*p!J(F*!h1zFm)pb1Yww zNrJfJ^nUThM%@nYHW0%59Z2yPnR*az^vlezB5Iu8Rj2X% z>HPDZUMa;cW`z%s+s!ovQXne_K_h{Dw&aMV}6V|*=JZ$njKPAeRrj0;h(-|dM0;H(jBo~@FybWAUwlZ`_ddDnz>4lOIr z7llFiK$VaiV!z4};xe9U%^3QKxvMA1FZ9PSf=0{t`VrV#|K5?fcNd99AXWmFWF2y7 zJM&g95;Ge>|2=Kwbp4ipXuJ8FP7W^dpCh*z%w<~O&4YxJU1>f(J-@fXA7_cyd4546 z61jPr55((<(Af(SraRc!K)BDq)Rmw3Qp(op!dTNyRq`-9|4ewDNfdw&P@nD?v3mNq zrwJe1A4UdEBwuu|IKeLr+|W==o_3p@4#Jc+wzmy)2soS%qqfwhXMhn3@4Z~Fbw`K; zgpDpf(gd-w~V#3;}ozGk5- z1n@1Dr5k`&j6~k*ObJpxbVWG2iGD z&v6y9?DKkiZKEKllV5xU~&G~j9$P2k19x;~a zwod1~F0+=yMGTC_19NC)?nk~(CziU!goZuJsm_&ugG4iRyYwdTjw2x-pE4q-=Tu@o z@9k}>CaF@Vw;6&OkdRC+0C=8f9)wi=d5ez8u6dpid5bE@qlseKNXzXNlz<&ycvwy2 z`j3My4KfnBiD5dGE#i2+EAey{>0|9`y&kaO>r&OqOn}4J_l&pAw`}!@C_T(6|G91I z>{+xCSt5lBR|hEsXDvkGNx&2!}9Y8?=9)L2 zsvPAS%3J4jC{i#^6IlNgp~TD6gjTDK?43aE*{ZkG&}&j@D5OW`gQ#fQ%MAFOea>PQ zY&q+d)=6)!HhYiijJ#Vp+hBV=CL3maf_xl&*Oz<}C=Q>WXrB44r!TF}2K_h9Hh$i~ zwcoG1Ci`4@t`wPu6>BMwF;BbSPtka|Gf*m^v(X4HU>7Iqy+sN2WRnhKh~4_1GhNNb za`+CF($0P>cG1Iu0;c!@YT_|((mT%OYEp$%XY7-aj_rzJ^)(@L+;^DRnhsv|6=IWz27~pU!pO zbfMi$U-e&i9o$>md%ril7~O8*4E9MyL#4X;v^~D&Df^$`dk(bV;RHK>e%=3vFcBe; zP7~wel4wm7>hD2yl%8*^V_DZprOVWFHK=m?ZA4zB#gX&8JZ~GyjUK#V|g5O*Gd1 z*#IUdt{jABToxCw@*(0rqo>%JMl70-^NrTcNjDbbQ?=(hUeU#q_PDAi1ypgZXPZMc zL5I2{>UL`rD~pcgtewR3Sw$XCwg9^EzNB>{dkVs+M}i~j2f|d))&6Km!Pa^z2wLTf zV2)o84fah8eaEZf=Sv@bHs_P&qv~YCXK{GsD4^yzoVxQ%l#-LOPzoj~po_12x*?rk z^mi85*u!eloFj6AO^^~D6yhAx^@O1|@!A5_3H?s;m5XIf(J5x;nxa&g4TGNXG!=o3BZZq3*i;>%x4NxCL+G`G|+#K;8EI!lCCwALa zbMT(LJeS=re^?0_1!*MIs3>vZc#)KUGbo|umvSvSQPN}dNQdSxns;No&1uG&x^x@v za^ArEMjG{Jy`lCPgyYni-_~H$)6e3^%W?dQ>ztIDxWHq<-1&0`o%1-F=;k_Op%ku5 zWu){%3o#13ejjlmtrA;_KSWo>ZeNr{)I*aa*=rY0n2LRc#quN-rDJR%u(DE|3VRyT zRo#^DvtD0kp-|!<7Oo3Ql$Wx+r3+VlGd*bHzHvs(s7Fd?V7;MPpvKVOUwB<^`hkF? zu-Pz0{E1SoQfSk=4t#=+I2A8=ihYtJ_^CYzmV9t?Dp0n?q05i zPUE1^4^34S&)O!0J|GSqL9OiVOn&29d!OP zp#D9q;2`W3g9N;Z2qq_-;2-!Ns@U$dQkNaCtjCgB_ov%878gkh(R(a%9vj^CfIE+pk7bRL=3k{ye3 zMep2j=bB|qKSL6jia7hGw}q-l+ux8FE(r9ie``SRuW@iuP*E|xh}EF?@C^u)aD?sc zzOze+BaBKMpNtO{O~+RgxP@{ZUfnOAD~ZblHe zR)s0)ATvA1NeBwisctj(%MEZD8C!wcyU`-grFKvId8lR#@v;q684A>b+MR6cajf?A zLnA8zBf8t(!IGDiDQ;AhNd>*fuAzMF_}cOwV)hPPVJrU|nfFOabZC`ET9--eI>Q&k zM-&XWl${T3Q+Bqc7fW_4lfkc^0kHczpYCD=zk2njBVI(dcigANsm-R->V1yophwcxIHX17x2~3+(6EO<^cPyV+jGTw ze6F>-(@v7PrrhW+=hb*%!4f#XJQ%Jvg`gFb>}t)iu(0w+Rfml>(onv-6$i?XRk^GE z3L8$0X|l?DTeaJJ49}@1u_^OzO`pMqL}rdEe0c{-c~cxjeyB!h(!b7JCbMrc#6sK4}BQBmzd6WGFI>&&rIgovvZf%J@5Vu;rNF(B`7z|oE=7g z-48#7xGEMmKj1>-BSMI7>%8rNvBI*E%gK#IbvzzrU{~yZ{rXi=;YmI*4INWI{3BmX zMMW`NcS3_oEXkQBd&N;iv~nbLU_%R`VaPh>gF~Np2;6IZs45}W#+y#Nk${6Mvt|W2 z4LEwbIY89tmAL2?+Gm=xy%&!>he%0p7W^^ZLiTZxXSeHV@S95ldPYaR%sPT8Si*7{ z(yi*S^>u%k^XRu0@yUU8RBKW@NT%A@@EtS^jM~Mf7qHi~FR4Phj;rPRKL@X)Y_Qd|mPxJKGOVT ztsnFI-sa+o{WvZK*;_X(f~wuu_)ON41>p3URL_})M1m&w25PTG6Qp?b^mjfNj~W~Fb5Xg?|ilXD#TH=YW@et2>|9^IX0EYW_ng0b`)D%M*; zgfsC&Kll+oz77}U4YZp+sx2u?*Y!K&D-`qjg3FuHPco)7|9oYkN0aY9(C->!4bc{*&qx0)z|*QZv#N)JYiw$?et~?^ zOwwviPv!cG@A+oPeJ<-R|4gq@*~!@P+&*!2Kz)7Vf6)KGlM)*Z*xu1GSxxwlOYXS> zw+LE6MKdo13EYNQERBrvayf7nYrUZi-;ZWZZZ-oH3pJW$#D`=W7AI$AhuPa8ZVobp zV$aUbe7nE%d$zXztI9THfK!8?>#r$+%iq)0bdo+^Y$SA)k4n@HJ%JaCgj=A8@8XYV zQ-l!I`X(=A2X_MIq?}WaR$hKZ4{f$`Bh`AztRq=b{gxhiNTX6#Rjqin@T0x-(`Ja; z@Kl+9YEx4`#?;bnDYulGBbVFmLOnX44QiTcClHp(pBVT1x|EoeTtnz8E$;C~Y~mmW zkn473;#Y@9@WqTLhlg*Gm3B?b^tpn5*3(R*ml};#+DJZ?c&2Ha$E38LTQmv;cSGZs z`-#|8y1}mmA$a z9oH4CnCDGY0HnC+XaydpyVkdZM=RCdl>B0 zd|7iS3ymODxFlbUMWkL}2?Q;f?(~O9J`c(7% zd?tXM_LQ76o-6Ep$b8$GC!1SbWdzB$SkkTW{7Ap5h@po^%OwWSU~lNIiM1=k-kP4j zE$`cno6qG6^T{k1zOp!2SQHL62MYY*86j`$cl|}xHqvZ>m zm=t*5PI5UN&rx{ZFKR|<;2tDEknr(Ctl1?0!ob2h^=&BG*X(&o>b&ZQhw_d|rkN+b zB;p0t(B8N4Eajg}!haf22M}T~Hk2XxekFBH(>|fQxnB($1AHdDjmG%VdOmv=P@HG~ zpBhLOEXW)Ea~q3xW&J6W$9baNn$I99B_+cV&iSUyxCk#llPJtse|X$p<-cB&8GXdip?iSUMz!#bel&NFw6|y z^Q5vVbd~hx@Ht-p8MREo$+#47diaO2z|{VbuaWz*>oGewY3Mtuvpu+B`oNG_s~zx6 zs|}Pw>PLehcl)mUQ_iNjm)xMg&T_z@J-LnW(+#V?rS1M)p686Wg=MDuF4A}4LlSYCnki+Hn?|W<4U$rte1`sRdVCyB*i}R%z;SQ? z(&FRR(Tt5EU-e^dPUZQ&qbJGPJ+V)AEpN_Y$)@bER&cj|<|q1b_(+oOvV!!_bZsoG z>8#pdTJfxikT4qIrTe)&pIltg;8NL-t6Hh9n%9fxi`Sfx3Ql5|5hiu*$QcLV1`8@y z7WK8V)ralep)J<`Mce}L7OKvc4-h-4t*F2Ywn%HratHNk0b@Lq@?KB zR`g^9eAUb!JKG5Gl?~?8xTkbWChOeOCU=g#Yq5S-?{#P!EnB|UfTsK8uys#aA z|9x5U0FcUQ)a%lZG=;EG#=c(yHk>hjq}8U)Z9l$|Ycr{E(4#>E>&o;nFK*6xI$Hp^ zqHsHtCszOC-in5H?tZF#7AN`{fsp|GMML)W-lwF* zL~;;}%ZPVMklYVwwExp;M6au?AUF;JMjHwrs6CsSo6|#HxQPlHYA+C#Y+KT9DEaMC z2`I`e@3Eojd!D9yVsDpmDfmxaVS`V34@jsSuqTCl5{y|dU3=e)Dh}E$B;fEG z>;G>shxA6+VC)vctX(y-;LYQ#m( zvGA%9;Hl1jce9fHnCSp(Yzg?vVI7rT4qeAAUe__LKEx(P`c8@b8zLI%@VQMF&BsKB z1YxaYJHBwu>%MJXHJ4|#cZyLM{KS?`4-t^yD*xDPbC{r%(7K}4<3C}jC|GafJ(CD; zWD*RCcEO~_BYjW?PYy+s1aG!Emuv;|w+^L7PiJsxK3sSzb22S?<02iSR;G8qb>0MrztCE?lD2&r z-ZvN8q+4HP(eZw3Ff|SuKd=6$|1cv0Vw0V7OP|+G7-2!4{z=}exVgMIEFa2IZ z5;<$)M_d-w!o*K&%XJZuaJgK))m69j@2!=!7b%ftdy@WS$~7eIHqaD}o3g_Ja%C}K zG}Y9OI=QyA8s#Ci5|DMQAAW|keZScMQ3@am9HLTO-fCIWi#ye1l4-ptCW$LMsjt*s zv!0f6TXDb9^lLUCfUe3=_a0Zeb9(%DG-V?Lv5DSAC8pjrG$S)|d>+!+xwtAs8Mh+U z6)Ors;9w&)-;m2JB{7Et_|8ctgTUc$P0MU z5!W5#xr#3~nZ*QHF&*l65#=M1lBsBnJkwz~UH^S9Q6^70fTT8TqOGMOBI{w z2_%k!>rATT>9kX ze%NyYtz^667>%0as!ogX2(y!Ke$m3tpEvg}jJw6~(k7(Gm`)#vd%m6vaas?6TlHg? zZ+88El^Ksr@ChbqxZE{dy285)pYZ5q+cZ&i69GusJ_XpW^Y-NC7w6SZ)~}l$CR--5 zafH)-8=jcxwccR*_OLL2!{%9Iiufm*QYDg46!1M3e&>u!1-xAogSc?|xq0H{X&-tD zpuo+r&|1luf0Bf1p)!LDU4k`b%A)J-C%MSW%&yBl~HHTcsQuo@U*EOi&@gunq{YL6CUS7 zXV`FE`Zxxvy?utXdap;iA+=3_BXqgBiKe5g+rQwS42Z3Gh>10t^D!$JXYirJxbfZ< zTzsjFmM13H zWjy7C_107itRcVQWhIn^_NW) z^}8YGW)Z`2bB_ORVS2HjG`neR=8zR!kTVup!+0or351rl7Y^)fS9xrL}_VI=mj!r;4jE5vFDWA3<+_T1I~(|%E3>7Kj~%+)r?Ri&IM_l1)9&+ZJuQ(0>o9?NHzdtXj|UsMj?~rEEKwLv ze#~$Z>Qd=Q{P!t*U@;Pq-cERQbWYXF)-R{A5X7L;03|)QSh@XA9=H4qCesW!de=6I z_V2adR}{(ESxLrF5HQ}ZLw{Uc@ch@vlGB7^UNvcs*rm;sZ)$ABHbCd@7)(3|iS-Y# zl%gmWKr-ks*WgjD@UTOHlL}Ja6Kfu)J-pTXppAOlQw}r`^5^) z$z&E#QUztWeprx{{XpUUxZy5g5*54kKiiCeRVlC`c|Nzl6JG-ML8(Rd2n)Fj!fb$B z;l6f5+){#u`FJ5aJNrn_+jtN5Wd^97P_LW9js#bb72tb*elDRJlt?&_$o|QkoH~>y z(DOR6J`~p&aq_=;+oy3jU*mXwyPckFmeR!luw57AHDmIp-f5_-OS`%@f$x)<4F@l8 zd5E!MSRiAhUVTvmADh(yZ=5w=dll>2y^tq>OH4|FUH?ri407s-FhV$IBr8ZlHFpDb zKM&r!ydKA1?oY#-?64Ua{yTs{5oo(=@83o|F1ryX-)s1W^J~z!<&^4xrs2!8gzqZn zN)nys-s@#g3fGqR{22kyjqU{vIzU*A3tJ`?Y=T%wqg{B} z`rpKwfhKn3tE|sO%7xzP}=eREE%MkO?#eufPFo!0ecVdzuNx?p$De5Z2lOBDYI?=c)Iv^gMj`3 zNNO~34HCfNi0tFhrb+~G&4L0(aT>1ZN9J7!?0g&tBM&$&C}f8F(FCgftDOOf*LvgM zaPy)&meq(i#on z{3oBn57JqjK0n?A!&?b-OX%dytlOfV#6K+>kl^IyC!Ow&zBKRy47=<$c*E7G-17Rq zMA?egxX{gO{Wy&N(!PBb?HeHNX^1V$jCyJ(r+Lx6H%<~ z`zWf(jqN1id)f^Npjw+Lw2k{UaKOLb=coKM(N@;~(rGzpxb5rL<(`iwusM1n<5hT6 z*A7CPLS7W;VY7ccxHj$WT(w?%Ht$$eIN29lT>jG~`L6&}>YV4_V5?=SC6Or(4`#o4 zNkCpHuQGu{*Z3(W`PNcg#Uu}I|J=;E2-VyhjP(DX<&ZF+MNd)P2yej{_H@*^3& z)&nepu=bz1MU?uq_`mc4v>HMmuOO%PhJS32{_*xk&{iC$W==5hxlg*z{^*Bi!e+DQ zeRI&krG-Ts#T}4MVZ?zl0iC%}hKjP_t)l-%VZsV-1va}#EY+WkXSfgjaTpDSw?6UU z>3X+cM~6QrKg;`D0Z+D?-k&&XLmleYEEnH;gs#U-bQ@i8U+8L&ztHpoaD`yp{<~|% z{@)nR6B`Se(=xC~SmH=fivf5>;~-y+y@D9Q_~M}-;lH9)9I_Z3;i`9p$_dqF%r(OT zPmxw@eG{t7^v#nCTwPC{z**1WKa3#)N&6j6b_LFs2)cey{|xOWx)j;ka^OHE6AWO5 zF4@4Ed{gTAd4-~?cyo4y`whwO+f>0q7o#Y+s3vl{yYtHmQNB`iZFlRLjm%pfxO-j} z1KWPCuh?SL2gYASwRu>^m`-Oxr034AIX@DTql$q4^D9rWS`*~v2`FW(ytk; zx-K^2YnD7zjGftnss_!ICW9-xuxwR>%kX7|*)>V0`2qR1JZDq+mIaPSxUaW|iZ?T4 zlDox}N8zCvrW-f4&Fh7>c26HlQ*RRvX$kw!g1%~7WHDA=p(Qy7nx&3tyQ1>1Nt*5% zf})?K3><^Ayk#-a0*8dAxiKgf_I`X$%MY^7)lsOk=7l4#jU?0ebaF@R= zI`^KKfjZ>G?RwfVjg1XVjZ(51$tnj6Y}S&E*~|yB{qU zyZUF}WfXeo<@B&h%%O@E$&Wk!bqf1acEoB}*T%68!K5SUEXIgC*Jl{--H|)N~)5UR-?Fbu2_T zOJ8ViB7AEWLy1_<%ewAvrH4bqiLJjW8tnN!Pou2#p%7aCSF)QvhFf*`++6{C5(-br zoyVs|#-L=FRL4V+6rdbjWe(^vJ&Bay?)DpxSV1?ZeW~nxrNFf~i>3;TTVCm0I}zv z!{MW}%|lxj*vzM3a4)HznM0Y%yjU@)w{u$G&~PJTgi`IJg+$PDgr>BnN9XtW2E!&8 z{CM8>Z>LMeI(e7Q^g0ja0z~v8;BDpnyk6G5mHu=)2`x!>l2526C>R(gwKu;!RN+~9 zHuRr)pupT=LoIFf1l~douD*dKk&tx7$D)*I2m$Bv!8fa`6~cf0;@pOM*ew3dM<{&H z?uOo%sP}or(C5-Wf;v*5n`Vgp4P1yHtdyO`B67yVLanN~y0L!UV!=lL4O|V(JQ&|} z0!*HH#htc2N&<7n(rI4EKj;DJBydRS`|_H_s0?BXrO)S88fV)(F%0=telo1YXNbCT zy{~km^ywW(Q!wv_-BcQy4h8_wIP0QZ(x1uv+|UJEoc-81(WB}xpDzqKZw=1QY`WZj zSaEQ!-m9+@u!qiiEMZ%7#o+JT3%lpi$OQ>8hIY_Lg*~HMxhA@ zpx^`eGLvmQOwB!}@nd2VQ8RXx4!XxWiD}A3CMz(66DaRr_tkS}u5=&V1|k{|=I`y& zJ?mJ8niEefZAp@DCyXrrO{~=oD&$&41-rUiie0rUe+q!R*3wcF-Kducj^qym_<0B0 z=-Rmy)eIi%LMNQ>M?w2kOvEC2SQzpcl$03E3`~lfD{K7QCWJjxZAo?70ogk<77_=g zg~*|)TGRM_>=lmN!ZdDCC8?0EY2X#(;vx60%Fbvj z1GDUuYubE%es6b~W@g%WvJlowhhMz$vU%v67-;_jD~uDXxHc2*WLoMF;%hrTiwDDT zPEY_DGw%kCpU%#HQCy_F<_B@momV4BjOP^gaV&$}&D1T>`}$Y(Yb@>vQ)(!T{ZliH zcS?9!@34_RoAi)%e~sIM38+I1f06pdr3|0o1Fu@7qGO+ zvcS>LIxM-MX6s9s?~Wgr&M`Q{7ap*Y}dMzaYeru)mLnqQ zv|5P@0<=^=)?Hi)ixJ^a+|)rTzLoIC9{TSyDOcG99DbZ%!bv!CS^&S{@I+ZTBAq)dEcinKn(HA#y~~^ zMwt?AGHs+w2B@)C2Udqwvl&-@g1g$T-J%W`rH+EnyltDEj#h9FDMcu_WrwZZi|JZK z55SE63f#FFYUaMhuc83lE3{eZC2^)6qY|-RrzwRBjCC^6|73pb)~G#WF(@UK*wES>#9GvK}BR>Dr}5T%J?ZMkiq z*aj!sfDt@^BBUn&UC$)PthL5>a9^)is*%?ZSUWHQVP%C2)mU!<0p`CaA^$i|}bDQZgbhj#WbQK8I*s$kwZr9@NSgv=nFqrbNn?;BL{+(9p zZ5%|U30qb;eJ{8Mz5HNDjpfonIjpb!g375V;P9nbD#HAZ2jWg{3c?T6XHFw{l*(|s zf@a$6CCEtV8sHlUxgMm5iu;?vd2MPoKHxY{Fk$62m>EFTXL7tpDfjV|qo6ougn@_J7!(!E+tu05{g?Mtp^q3i6n8iL{btU4t}8%O%uq1ihS z`cPC@SU8RRdu0KiV!C6z_y*SN(>AUt@CGFzx3{*eIP|(OU)9kK&M|_Rva|<yz;_+c?2>bLq_u=ik@k+(ML#jf^G$#i<0S9#GgPbArcd zgx2Kp{%%~C7Mb*>-OO#|hNNTdgKj`+mu7|cqG`a&MGCO+>kS3#nsdL_Ms9JkrnnXE zu@IOl;|nh?C%|1Nf8-QT?X^hwOT)sgI|nH7E0QxXCzhu@)m^}El2=hRCg&V8dFoUd zc=80WX>)`#2k6%bmOZ0=ZMv>{KjgcVh$$49Mw%6h-b7if>G zM_Jk7KEDp^ZjmVB$Z`+i&T#*@$2*DYGu>T3#HIzntnnp^Xr8aexDBPc(R(eJOqkJ~ zLe%Gxi(*!I(%%*9y$7I&DZXC6<;ov1?_ZUS^VlaGdi3w|Abmb~{Eh!5BzVq$6v~8` zZ8;yqL!66kEdVABIIn|5v$atkj{g%Gxf_Kbra7tDKD@sExd5@kg246O=QV{bK^Un@ zi70UB)z{f0-a|up6Dby^w&6Oo%b@Z~59>jtI~W1_{fRyu4zLGhOL%_N_;s1L|dNJI|25Y~qbu zD&lG=B{Q=!QX_}fFmTcAlmXyoYFZS>Eg#|t?J>5b^n7i^59v?MQ}2AC^E!^Xv5 zBF|?S(1tHg;WpQ<(qRI?3%|na^(@XERCx_7BtS4nqVuo_ieqBlVEjO%Kgf+)sGO5C z+&l+MKMniUR`70in(<>VBZ9z8kK8bLH0seLX_RW}8wb@!wQwNp7fG?y!lv@O3=cE; zj3MO+eUrb?4KW%u!jm$dDX=ejyvaL)+fayDmmX;J)^AYk-ywi5=3>gdR_7j2T3^v% zl=2BsMsoLU)R|@Yk-BWxSZ2)EaY~AR0j<`gyq5;_m80maiD3OT2E31Rij(y@Opr9$ zep46Jl`fx}q^uR`fbIoU@T^cwJBaILOftPIaCE2u@lkR4k2>{SS#E;wo3Gs~S(KspExfbgJo}Y+jCWfaI<&E!2 z-hWK%n*R9*u1UthcH^5SoMvZ>9hos^p$Q<4bCNNB9G*g(|dPyl!kw7 zVSjXunwNlL+STOvV&*q#MIoH1iy&1uO^^Xr2DswOd88WOt8IMPXUERkR835meXuEn zyC-rUX`tIDE4Dr3mB*KEc{=ueT{B9T1EdW#uxz0^PO!UVY1jdhiu1b3#2b{g}%9K6mTQ`6N$JVV<_R!S8b_Dvg#xrLR| zpyU>=4e>e0OHlt_j-8X)5pmcSTnShA2LeE(|>6a5G>*XeNVgC@t_ zNO(n7dDZ-=xCk)%J0Lf_j%0`iE+J--kQw%T9o1YIh=wNTQ}_e#tFcXl*>VUA2?LEr zxNDwFWf-gkn-MLk8N<=^M0!`OFLEV!rN|FN;eu}fL-6=Rai9g9{RD?7K$x({{|E{L zm7Hb-^x9Fa%zgKdZ&^LLA%o9fbcCiGDoaAl2{u%cs#S^P7B7U%PWTUK}iv87M_eb{9bw>{z~{>A@O?gTUYPq zJ&BRQOIT27ma$}!1VtflCbTviH4o)|Rp=n=*IBHhP**X)E2%iM5HJp*y$8WCvek?i z?>1$t=Rqi&!ufblI#YbAw!3JV$eS{^p33qHaUYFa@DTMVwMAs3jX-lB^V!yQ7;`D~ zIK1B-ei^gPhdj2#Px7Jk=u;!Vb}aQAd1q4z^v8rTyeOS7g&1Dji()v@l3l0NNqcjR zAbk;FhMu>nJnjIsn;YW53w$!(O%y)EV`N_HeR3}CxQz&%1B94~n9|Y8wsnTtGpc!J zpJjm66Svt#5ydrI9>s7AnA6wEKJ0Y%{!kq{htI68S5VM#HPPo+D^uP<>geN+)bO`> zQztVc!_?G=g#H~;BHY9T5yeQ8F+8NLksmimyvsLhq>o#d6`R{S4?+aj!Hv{ZfzTE( zIF!7h&xa#l*s^-X@a1#(J?9KjCVF$&nV>5rEg@lSf;h0Y*EU-oTbmy}rruLivD3KR ztGx@Y!&Y;6C@4(-cKs4B@w|#tIX3*rz!l+Ye3kl@tu|l-^#!=>Aqmv#U~WTaHVAqr z_qLT{?1L~13#7!ySS&q2KBhm-006LDyXL+$_PpRjlMJ$$HNhp$p$ec;@A7C;MS*9j zp)OTWDG4a5RozL=X$vb>gY}qHuzB=T1BX!vP_TeHL}IxL>l#QzSj<1o)*#|_=+D`)@SST;Sdzz%*T-4bhiZ5;d~tD5loodKDmr%dG;+Dc~H z%LWhPr(qQ}VZbpr9+u>&D6lD*4Nj1$yg2p7Bs!9e@x4apTTvYNMba&4q!@9pO_vo| z?33i|la3qt2Mj(83#|vzJPv__d~VE+1ez^&zt1)MdW#oc=GoKp{0ZzsRh6KQ&ju6v|!8tOI zwi&*Sr6r4L!+xDM^57jdMvdD;8T5=t*bkxd@>zQY4&u1%DDn+zY{}b?T=t-9XcgbL ziEeY>^REVtc^3lN{k>Va%g}@f&YYW11LU{g>~+_6e;!Bbv~`x`z7!=Xn=#yP+%Vo_ z5)`kUh&)tHH+3>PO9rHg2Yj#;etzFu1I9F&^vs>!5~Jqp)%{;rCajCXjovN8;`VcyFY z-o@`+7lg@sii2a${Zo)C)FRm{zjiO3z@L?sb)tKo8y{XXL6jMIJ&dYV@3qqpG>RDi zr_?p^G+p2h(sf=qYG4v|*!9@Rj4^X4a3t_Xw!*-~I8KjJFrq610jJY~;4fDA;`JX? z{+5C;on8>3RK`eCVdA`<(=S#_G6;*H(tdjata9(&OP}5rKx884+AyLZmJ-Nkqo-1k zeq_ecp?<2m+QTyhux9<*4@%3(jT~ZPR3{6-^E?RdqEvJHZlhU*enYyJ1KCzy;V{He z*|vW8vB!gK#jg>cnnL-Fz3`&zAm!#BY{NMKnN7P;{&avUO&tg;c@3YC0h~F>u~G;b zw#5$Gy9bNvLmB6z>>L~;N>xy0rM(LI)VG5}fS^9I5kH(OfxkcI?F?qMkzWF=v}J!n zvxJXbQIQnMPz=Ri0*3@Lx)M|XG4bcneg2~o>mc?h@w-w!ix4jY!YZ>W5}@Nw*B1r_ zgrkf%1W!Dz-3*@v2h^A0_CuHi)?fi1b2`%vPaqQ6*NbCEPy%?FMjm@#QDTTXzGg$- z+)YjF=L%_&s971*sP8DZSz(V=+~Li5o!HAY4W2}4%Y(0q9*=}5l+9flcUciVR>p9O zLN2|a*}O30-^J|hq2F&46vg{)d`K>CMMexnWd*^_yBqD+D^%un>klst`ud@XEs{Oy zU)?Ktwt6LqfmuWup5f^wJRgrDJ?~(;rZ$e(3w8yjNh@#c91JJsgrpv+ctMF+Id8Rj&a9 z&?q|%SmjDMm$Mkqu$``PT~EU+4>$2bD9pA{(L8k{P9^_+(rc3@M&4*sH^8DcW47!@ z#BTw?jXgTdi;bLgq4bD=cormrwK*AQ!K$M@al0+mx6FC@#W#X((qHR1C< zkQo5rRj70OmN=}q{u3r1t6aK$qRt)VucwB?Ib6RsQ+DC{{c7(`;em$zDEbsr$Kt14 zfsVG(B#^02A&Dd-uSZrH0?ZOaZ7ZPQiuHQYA1{cS1HQLX|Y@#D$EEBK|Sr53(o7>C&jcLf=`<%?68%gD0ui$(0#eIzgnODuBX|icwCXo6#MNoK9 zLeI;3Szwo=y|#A70-Bl0u!0hRLpj>2C**OJ%j;LhOjBR`&h&Z1Bp=kjXBY^8_zrQn zy1H7-5|_DmaPVNQ4}vKf0rt2Au~9))Y1l`J%y7u%?U9n={M6v!Gj2u)Iwd+y68F>* zi8j7Dt0hGcsHGrscB8{}KR6TmDsP4n*#()`-__UG_jB0f)}aStjpZ@}NAAm7OiYBi z2Um9tlxh|W&Uu5KNRURNNW<3vmu@QzwB39Pz1@6)KR2HZkNSPC_?F#=(Dui|;KU-( zVwYWUM>O&IoeNc*CoC;qX66@B;VV9?tsRPZT*f(W`VU6#CJ$2&T_)|i8w~R*<9sTl z6ujY^cryXnxe&1SkDuebu;@t0^dhL_it*5{3hEkWOPXoV&zA}0P9NycJrac(Pk05Z zk?Kdo_rHHj`Bi6k@806*@oKGAr3)J5>_B4==fDySyo)Q`W>yt##4I(q`{c#A?Jgq+ zOH2rn_oDwa#yXOjpcm}1NE#g-ZyP(IG@lAFq*48-P8Git)Uc+SqQUAg9Pg?m5tNUD z)u`sUd$~c#pbx|wy_0@6v|H0GX(Q}~L#y*wMob-xYqLfEMfoHom~x!zw5goF2}`-( zt9nC6)iYL71 zkHSqB%k$$OxUGklR+bk|Z;&V2>ocKU*jBgrG~y@zIc}6%vA|nr+)YY^KQS*`y2TX5 zQJi`BDwtj8<+r{Ape2qf`HZj^;e#pJ$b|cAdDg+pp>+dB0B4c1az0P9xK4OjNmFRSBF9!m z+^8*z28g?yngBCAgId>YGMNy@cH>dw2s21>MNEPc0KBb3ZmBi=yEZmMrLyzrMHoW(Q>3O=l0$6z2)_)e>l9UQcNuZl=e+!hWR~kLzzfUq zJJcxac@xIpaB;Hj&87SZ6KAyZ)T2zY`fuyHYZj_-r#5-?PD=H)%g-z~*xB}cUK(Xo zLa!4$Js@adWAO~{9q$Ypz_QoSV(1_ZVbHu@VIy>AVzZf#5pB2RoJ z8<$53c`rLP{B#IR=LyKz#fvdmPgew047ItN6qd)*RXZw+O8FRK2A^8rx3np?smLh-BBQ~5Ee@z(r20w&LL>r40%#Lb6-n;pTCCwfu0Z&@H z?_L*+LOIxY+%ynS%f0*6n$@ z3hWU3kb1+sUOL$t>9$T&uqn@+@4O(c6(kKonz7dkYv|DCx|U`VrrPGm?vEDEKU!Q)$FxZXk((FGyH};Mh*;EiQORP$x#c(~y3jhsPrOzj z-M2n_;_UP!E5SB<$iPv)AGK9)B0y3U4!0A7^?w7R4NOda9l?arkH^IIbKA6aKNQM( zKHMWfN~wSZFR4`;Ft|hj_nih$G5Q*UjMEw=Fn4KfB-+;k)EAA7^mhXBN>do&oPUcx zh5fri{exi~pC+$r>S?z!o`S@0)}zGjowx=4k1edc6(!1v#yF}j0QHScCBLLZ9t@(n=FgyzbBc7b3A=}cO```uIwF%JMryW zuR^yKQg1AL5tmh`LN4#m?|-w1z~KHk&BGK5z7lgna^@^VV{X%jkJ`eK(*%hP$w-@R zR*fZN2wjzTej|$0E`T9bV|5G`kMWY1w4wSLALMR5~ zrat4PFC2kB^tVl}#3p*LX^&JU#&yWLXfH;LONR4F%!kf5{P+ zEQ^p{JiMal`O^vJ{TIIYt+Bw-#wA5#GLER9Zke{)b~i}BjLLm>XA@<7%5Pkte@aR5 z7+KBY-hO8`)mI2%LY{^|iyB1BPxS6mkSTXgNc;tdX38G?Ds%dqez}7~qreked>Lu( zJIb}wuQ!7nWnl*PHjBNUb%Rsvui05FDAbU}Gw@%SC-*vnDuPi`B}shtd5oAhSZ?r& zS26-2VzT@5$vk*g<}^zK!`zS5tV0~S+?G482U^y%>ezZtz&{Dy{5B`#V-f(oaEG8CM)mK($ny8ia8B)7WUO0*PyDT(4oUFpPAk8 zN31Ymdy?%#rzhVSuKvR{ALR2Cg2j98k`^!1j*q`W_>jDTuGsv97n!H!z8&osp$@XP zTkrUJf*KWD7piYrxAHQQX?q^vsn>CBG>m~fPpc`ppZ;c4p%_cQwJ;LOv4t#RF1_EQ zqqpTfDnR!+chqCUwBRXy_x2YQr63__1ng~a$}J|svjEm5er6&WN#sFS@apY#1ZA*U z|CqF8!h*k&^KuT%C#1i(rM$e`A-sj4hQ3r^Qb8WRw$GGY!jm3>G*MM%@ID*M0~W}( zD3pnOG1Q7@`w|(HexlxRTU%;X!qAfsLY;{WuL)9qedTnfuiFvN}}TV;&c0`69a2->OXFjW(}m z1IqI3iSE;{Q9WNmo!*uzSS?GW2)+_pzli7a7?@DTLOGu(ZmF%~z?w_#i%&^RM14Uu zY?lo_F2O*zE}W<}^8NBR_LW7-1QHEPyg?j(+-$00hG-hx#%Sre&-26K?84beR`Yj{ z5c06YyMs`-K69)g{!TmcE}w}T8gcpURqJ~ZAi49jmnkiCw=;-zf4&f3uwWz$`m~4x z36j?Y{fQ3CwsrzhDjWln2Uh2{_U~e&Lhp9`tNiDzNiQmdYzQsOgcfOLJRrQZ1iqxO z-8&yf59N*oMk;{;*KA{eTrHmfk^)BBIBDsz|LaSX`Y~9hSZ^c%XN#q>oEhy9!qLAL zGl7Tvbuf9m)oc(^4COH$c5b1w9^bvBqr_w3 z{5r=G<_-sP?c6+1<30QIQT-(3^yT&gyZye~*A!vf74l+`@Oqd06%vk(+1>vX!$1=2 za>NIAoE)xEoVXM@bYwG&BH)Gi&+;7v7r~r=ySzYaQ4{HVF`Vl@?Gq)Y`8Kk#tr~nu ztb03w{&&QR8l!&m8SXz3qPxvU_IkA|>ms4-B^<}e@0em=0s zcqq^#mPHg1K8<6Y823Ha!tEkr`5HH+mo}2ad~tN_D8OdJb6;$KWK-{VS8@1~G8~if zIOJ@za+O5D<20!6b{q72g+JL+3PE$U4) z16`tXs@x-M;pZr#SR)a2#&C;l)46F!v-L9fu~SXvR=f+MnnY}8CDMz5tt8S?P=4y( zNwcB}mvQ*RNyf=XIZ;@JFr+@%z}7~wQeTv~9sW$^XA%CVf-vaIo(d;bafJTFikor9 zl-R1X_{Kl!VzCmb+S56SR?d`#P2IW&TJ%wltwfNV=IA3;a-yB^RvjA77nyI(P-7>= ziq+IW9q4)V?+DhR7m+MWoyd=mwcTOEUl&x_m+@C0S0L)fNFShE(Nd@&Rm#6;31cT${}l(iv3ggFM2;w)IJRJAZ{Ikd~~bcQicC%DKb$+hI#6 zYB~^!;O2ehCNc{oS+2baJPy|1d6Z{~TmH)QbHd#Pa<`&CU%EB>`e3}uB2xvO^#1|e zKqJ3Azb--O4rQu^Gm@ zwmqjBZHAcZnI$P!C?R~F#*!`t$gP{#6$SiL%aOS@F+zHxt@d3(qhj$2zWmdl{$!-m zBBD6wP~4)x!&IE;;ofx^C9TgS#Ql`+GV{J)e|(^fHIj9-(5T~a97pqvdLEy!yu3Uo zJ>Y@34x`=Mhw=~CpO3u6uKcq5^Y|GXo9Tv~HFij;LJH(Fv3NS0oO}wk+L)JH4+g=n zW{YS>;uc0L`zODWI=PNU8;@DKD`6b@YroFY! zx`;R<;sq@eIspbz6hUrIqAi`7;o7>cOeEXHEaTDz-GSAaTUR1;usq_PVqAEHCpeFl z9xh&vDO9`AAkZiNoan=6cTcG19p*{7&ig|EIkQ+3GIZh@;NE27z>IHUzaav zvd4%nd}=zr!)6Ch)jK91hMRiScCgSjo(Y=l`Nf$ICcxvXowY8Q81ImGk9K~L-Vyi0 zUq3DSp5UhR{eu)br4no-xIm*XUA=I2prPlPz|&JiBLWiyFQ?DfYwiW3<+)Euxc=?_ zdZnwB@Sh_TDz;T_`VWjjW0C|&TlL%YVIMb@Bo?X5&^uUHtuRP zast5v6Ca5a+8KTmjLt6@2uXx7ES5==Cbb6j=?`&{D7G7H!hGQk4>I*KDk4ZCF#Vh=I+)(er&dw9m069(UGT+_ff83P5Vn596}-g zu|t#^3>$irB3BPlbmygtAe|@aGEC1#<)tR-GmJcp4<^{@GOZ>67@B3wq)4ei+aPTU zn{0PWXnEgt3vE7*rKfA)ae_hg`|ju+Uz0HDtqs+7ScDzIq(PeZnIfu~v*b?y>52>y zUJ|frP9lKv#9TD2e19GF6J7sN`R#D69x8f?bcKT-mFIgL#>w1c-jQzdvmMn6j@N9@ zE=YIGg*SP89G)}&40l7|e(v!wR^F8hoQqHr?OzZ}BuI$_(+txDlQl^+8H^{?+rg8H zKcYag%u5))7BSSA=t4&zG%tk7dMdD_z@2K-zJU3KIYp3;rW0lpjV+qu@zN?IFsGnJ zt&l4kLV5P(FbxJ{h}96nPSypQ>E}H;S2=ezm@@?uUK5a$`BQqX!On=mhY3gM9n{xM(+N!SQLvE_ zgZEyh`9wS$EDh*05bEf>tj#XTeUZ6^RpL!C_bX;*TYkn_yLoP_Em=IrSt~>Phv!se zNSz+QhwupJ&!4wXKmF8Yc*6RX5(`(N;5~Kfl(Tpxuo=7t7O^ndy-AN8h@3hdV%Ha= z9~$#Cl5}Ic4)eo^EKa0w$F-n_ ziLo0i(+xJpb&Cj4)JEvBXek^lS1>MA?-|F75B|v0a_wQw*9Q%4 z)(1dn|NIdXJY58_G9O51_N^=*sx{A_QffDR>d`Pb>k7?h2utcA4009`!d?gDw+b9b zO1Os*iB3TFd}5X8wHm8Ve?HgIoayL%e}0z7eQf6x^MQbVuPn)QDfZ$__2cu#-JYh$ ziQZssKf0Q`VQl|RstI0L%<{* zJk_AQzzxntiUz0)gNpGA%#Pbvb%E{%W-IH5Qo2F2C2JxgD2K^`mS9gsuBF&%Cg(%}1;^OjS=HzenI z(}77i`Tp3@2Mwcz77=gzSF(Lw&+fZ|4Zp21L$(PjlxkX7@gMnX8aMoSA z>kqep0ORG}AmBG}Zw&DBHO}x#A0Dr~&aBV zCb<$OD^p9V+!&Kw+#nP__>?EsCfi67-_+CNM{)Xx={10s;eDJxHd6K4U#5=RurE z=PnNAV&ps_Mog)JE6gv57IUhx`6&*W-W22f=gn1i z_8QV@uL{$^2b@&=fW=e4Hml0)1qN*+9eB(K`tca@&(I_V9zXU2)CF z|MU_9et+YLE*%#V{!G2n~r>Bl>a)KyQvz?Lf>g1(5 zXLbft{;TJ*UEmz*!_*69xwQkM)6rV-eZ-G(2y_PmevX0%@K2?X10BImygYso;63}j z1S>QGiV~C&1q6|%Co5h=iSRPC0crkzI3^!j)genoju>R<7w7^6>cb@b2G>(Cv3_Q* zGI;2Bki8-Z2t{OS@ORtp7sN3k2XIdc^E6fow;Stv{9GIYeE|WO>I=#ogjL1gte0=M zgx}s2o%UM@udb4wo+$-TlFRZ#`sCge=r8zA6u!`4DCT-nP~s6dZOW7>cJ}O9r!4lg zoi|Mn^R>}!_iSZ`?k1EuDL{yB4HLa$#R|*I&v!M@$V8jz`dc3)Q{?-MAG?MCgeL`J z6XFvhb(aDZ>{PUGqA9MEmKw9DXs04qwU2YPTNk**iBrQZdh%R}?=7nXgwxXnv~b zs|1z7#1NmWzgjDSlhz4=?GQluf~JOjh$h`x{b{=zoadtJOBc}E@Bu+nrs{*sL%mGN zvGyR&0M{u5XZcosgIIu!7D0-y7^ZIoNMkL9*B15Lje`?WW8qZ1#38^u@q6t4(mMH6 z*EkD|{COE}9{c$kht$J?0DDRBBHH@*@2l-h`)}-D&_L|h_$%WR${vGo525(h{WZ4p zsDd%+Jn>90y{?zfDv_iKOck&Pf!XVp_-w=o=>I3uaE!uqV?1lKIc2t;a z;eE*cj#W9>^4jg4REwOBb;lEbj(1J*_&W>`f32hI;kxnf9YcUMfFh|tRu ziQ?x+cpDU_$9vp2nfusKZ@BiL8d`D|u{J>n#@jv|*0!(ZsJRe^$v3&2F zDo1es>iKMErs;icK|0YysK4(~IkJ$$$kso*13?51UK5S!DGc#tX`(@zQ>C#778ewd z;rqjNE)CQuMI|0KFvYG(t6#22mM{;~N&?LrX5geDLmNkA%NYvjFkxh%p$5^C%hw0- z0C{^RAr>qndw=V@^1oeO-l4v9_HH7N7OUy_xex^W2FbCf`xtxVci(;IB2nVAgB1_i z571829vd{9^U0GZT@*@udDgFA|H!3@^ZSOU)(C!5Bdd*bR~zhtEH0*%C~7Q>w1~y| z$|p^#G&Fc1RIj1&Aa{s0@`JV5(L8nMqb@QIx1M!BbDwwt#43Pc4i{335O4>=_>$H# z=4cSjBV~3zQl{fD+9g_-q=lix8b^4&aXnt1YzVZj0fAw++@wB`0BOO*R9iST(2m5K zuTM6_9{kgH^bW%B4jg|?c$&b8_q!akG2#2%e&ime?QDDxYJxYuz#R`+Xidsha({@lFQLjuQk zk#pfm=R1lY9}Nij$qlni)M%nU`+S2}^*hkM28hAeeKelz?oqns5t-Cc_^Gur0)<;* zqN`=LRi>a|n6Hw<@U&6`V6rt|Ofjaa1f_wgF0W98OKHXMhsqQ!g?|&smYjpLCj?F< zAZ?`CAXyl4C$a8m02)bT9k-6ja~Yl7(pESAtxq68ki65UPTJ@(V{Q2G;oWMJ4Hzc* z-FM%0^;fT6?e6vNFn)t(-RgJ1Y?YsM+*XIEWg`VW7`hZE8t_gO_Sgid=M}9 z9|E1Nb>BOC6v4pIE@QPq09M?#Smd+i+YHV=ra(#WZ>hFy3FXLQLR^Lc60jj4CsqTg z{4zxwd4V9N;Os5n^se4?c#M8b{-&<(ZLJ^wa$g_-9`=k78ED{baN9a_=8VJ9bP7{9 zV#Ek{^bw-N_uZF)JpqlvJ7TqmLKdbKlkMOC{`W3D7ECKJ$J!6A@XD1dohde8@$aiE z5J5-%@WT)G{rBJ7U;M>iI3;jb_jLEV*Iv^HuFymjFD@=_XKvo1#+pSB$Ipc0AprnU zy^$z*?)_0B0=o;eC#fFD0l(h8$LnnCk$PJ@FHM0o(j5ahLdYasqKVY-wMXH*Lt+t3 z2C^lX2mwSezk&e(NtPJlk4OL5wW(7k+ix)m!&AX+h`*`yViRvZLf zAfF>?C}L>}QV9t@S6T9J=!ZEyor?%UgzyPivM^bAOP;% ztem`iPd3<#Pr+2fs67#n-Y*_9yw*_;V6q*gdy=oaw9luMXZMPHpDVRrf$Psp`%J77 ztXhce;J1m9atZkxS>`!EW}U>U26}+K04=ny=O5Z@r2X&Cj_%&*20FVTe(ixk04xlC zCeSh|U17q&;kd949z59bJfvG94>H$a0>RY;wCamI#}DKo`%x#r53_6nTtoZ7TOzWh! zjydzEKmEz3E8q5_MT;z7?$B-wx)@M;p`JO#z~J_oTtE8pk0rHF4{YH>_2OT91_6ld zJDO1GlE@&H0nWUHhf(fG(@HM7Jtyj20{3YOgoTzBCes(U`S>4?;1Og?6i%XRLImB` z2Ximd_7ItqsGL)aQf!Wd30JN++DFPCed9LfDuH$j1WdXgw9s=VrYRp|02{Pkn3RHi z9TM*16+Y^4d<0*8kB7`!JbU(>efY^2@}E=Q#DR0I@%BM099nKaeeF336(>63VyuQi z&bxQ-cKhY3RjV8#0FiXHw*C6As;aV&KmOR6jKB2KOAe{{Yq9!!80WCOpum_Ce_`9f zI=i8@G*&)=v!vxEuo!CrtBn3$y0ab;zFoPY_z5D$ugSfGe4EvZiIA=5B)9gAamo>^ zl!NR6#82SZ6N0rK6dWjcsoPP3?m~;qJ4GS<>Z`9h zP4fL(!^{uHN31b~GBEN80`8KpGI5R`J?b6^dvfv!r=WLF|`vW|g;Uz~wfy6s7$ z*Ln1q`YRmUp5V#-=GSNG$y4_J2cOuXa|5hp$ZBgz9&E`&bL`~JUH0~SU)YcJlBZ0W z)Q-9K_hLS_efxG7L6S|iJ4`hY_v=18JKLE%z4zXGZjYEdcdqm0d0217&G*Qp4WisP zxU^U^oeZBx^EF1%`uXrowX$Nl zT_t84Urf2l5Wv*ks}7Ext9Rz4C5m#6)+=8y$`Op>QAm9bp)0@?p^X9gXQhpNAnPGPkFBV6L%%_J#BCn-m9q0Sx6MIi#Vd zV6chMP23tE?A5<3?&X7m0v-#Ow zzt~Z2rI(s)yv&*x$qy1U=KfxScOQF{)zU`e7kyPelBBx0e52V`C}joa+ovx!*e03k z?LIDPg5In1f0hYYN>Ymrl@HZS`Am;eJ+#lw!q8~rx?9|I?QZ3Gy?zM+zwS<*I&HuC z-EXb5e6%Ixtgx1(LE0chIcxt&Y^k;C>$`12&T;$MkJiiNhuG7)99i2Ok$R)Ce*XFA z-KNjEo)#pvm_1#*c+uW?xBDwlGg(!r+XE=>W&m-m&JIK_O4_^k_%i!I*|gI$%oU505=!{zuUxuXBf8e z?++gW;kEJbNAu{8psRg?y!HeOC2-g!W!soom|}$mDbCEB0C6Ye4_z=!(YK|69wgz_ zAnix^Mdw5XE9?kD^iT0?FZdPz`y@dC{7h^Uw2a_v{A0nh-fb(4b3HES95@>7^;chg z<$`MAyNml4b;9>V!}5$wp0{t?Y6}-VWrc->4u5vF4x-z5(tmH;w#_luFx9}2bXeXb zAH@d#*aSS|xO~M5TeWhf16fz^=6=Dom8A(U6gj!#!{;Qu_ zS<=h4VB|s@CENP?`l|{A^|k%+%r|zq;eWB$XUw)C;`kjqt(~s9sm^4fY?&!-5!ZqT z4;bXerfTIxRWO;-AT+a1w$(j~qEm^}5p-H%5lwuF%cUfr&O*N!ceB2GOni6T#3C(hENWOfcr$mz1{Zk|J|ol!<1Y z=0r_Hv*wrCWCczl=o%4!x65x_Q`lyWPq6}-apNPIF2CtqX`(Ul_674*%vga%YZ0tE zdn=t?Yi%R`rC&pUJ@4enQv0WW`X@Vidxi}fxyqUnvs;;JeX-`mEXy3W$c~qr{qC&~ z?Wc|PHfz?bRz!+P6Mk6u3ZZ%Sh`1*Y?)O-Hi}vo_>yQJ|bH69|q^;i8_4@$YAeh7- zj@R4eTg~>|+%%i42>0F%qNDbol=aZMM}+o=Vnqw)gL{pOE-VvrG~4@6Nz-3bFW>WY zrC;iGK@s4Iv|2pppU~te0X-m&YSUY!0y0b`db0IVj`q#)G-e^1;jkPC) z&we)R-@{^FjGPSj z-&wu*wZ|6%m>_@t`RC4O8WV8hMp0tn+weKee$ifI#ruap{J{y+2~rxaLpvUyb3Ae4 zxV`oEpY7kjxNJW@dO>bwYn_JEo0>=8%l(gQ@o?$M^Z9#F@)i~rx>Q%?<>gMWfkFd8 z2QY+QLIY0TYwG#(AmQuB3Qg!3YbMswW5<+6Kq&>rjdQ8A7?`i<2idJ-WammqNVb$j zg(e?3$!3p##-$vZ-+ z4Hnpp5k;1r+$aa}R^jw=TWU#f=oRb#wBRg(WY~lcI=GTteh3W&b`sB^v3W)!`XV zDGzk67~^3IHiUoknad4!Re43DrOGU9L~f!jo|*0oIu^CI#Q{_YR&+lf1iZ0MM$t+81Gy@;kdcxX)y{Z=SD z%gUW^=WZq2zrOjYy{hP;Z1k8aH453%7LruI?t2R`%$E3&j_W~`@P5PGCrb8vo2u-B ztUsQfs{E@WYJCtx88Qih1)m2ow*J~jtUZE#ltS<`K1I^7vA-asxT6n#*%aMDpI4;S~ngblY<8ZB&Yu^EXkCNbfs$v(AEMbYgJjT{{AC-X?=y1m-8Ky?(6&eALnClm|TAk zC>Eb--W$v`G!oir-Uq(TFxFUCV|lu1^S2VrDJbd88G2V)4-BM!tk8vyu|_kU9nz5S zve~74#omn!W9wvVsJ~{HuAi{XhAd6u3g!PTv-;!$o0>Plh9sw0b>(sU{>bm`)AQGC z{K%zNGC;n_r#`i#*UwmW!e7~<9J8aPf3$Z_-LZMa&)USSD*3eSux}N~IxAzPrKDww zAg+>TDM!I823dBBG?|yT*q3{LX9t_7+LAGoEUD&*?K<&$E4y>kl4iYZh0W5YU-`t| zzj4@}9zM~Ar7LP=)qdM^<$%?sjI^=Srph0@_XW6NO22jM7JL7r@9bLAO3NNP&6-+h zwOMe{F{8wWjsJzc|MeD4l8@|#=hwQ3a=q;}Lff?>m-7nVv2}l)9Ta2z#>#-1_QWxL zXo#(Kd)sGk?u&(pX$K@r8Vio(e#WHohNRbM2`VKUd2M;R(?k=&{0Et*BHebT-7>kH zA&vBK`B)LH|JouR6eG>M zCB;{nOkGc2Y_iXH)GE)nA{EO$XNoL|@?=rt-ch7o?xXm3;rk2DK3RY7jV9?CtbjAY zu{Q0lu?>6c?6svCHc!E^p47ian^S65oruf>8W=Gz2^Yi`g*2t?;QPLN&hDJ;AfILw%U( z%aUlw=8qe94i`{Zy5=-R(9i{?YnT? zhUWdm)=XP(#hHy(lu~K`c5sIsym-RKXXPny&Q+^z$+IC@`3fd8$npmkSwq4g8#!pC zC1uRCqGNB_&4gl`RkXq;47g@L9NBHVZ)V%-g)iHh;)#|}J;jo1|1aBoZLb|Gm!E?+ z_q3E@mf9kJ=TXaT(TF^|aWUKeaA1>Nym8j<*i^Ui_x9OIQTENIZ*9YtqgIi+(lQ24 z7vb)yq~NHygVvZb*3xrR?Cae-#OZx)>(?%G%(ah-*OUHz>*Q)Ye7fGgJy>r!BI;gW zmLY;I(7+Qw&e!Wn+kH{j5sGTaBVq`8ibte-PShy?kj%lvOydhq5THB}_Yj#Yr8z4p zNOg=i=`%3po;QhrYf5vadZfO|7Gm~o2QANw%OVxh4%E4rDA}Cpm!iq);mX#Bb$G3i%0OJaJXNL zwO@yf5tj;5X0e_oD~R7f?HALtgXi+k5MMJM5?vqN-rB_mOW-$B8cr#cFjuDIwenxT zC^J}ZI^H5Y!JbDmXuJ_L5{TbNm~h{%zXXw`x-kY%M5UMwjy=sO6a{x z?hrW=*kLutkpk`?KJ*ERV(Xqb{^wys0HHNnYW#BvD%M+u77Zyh1nv1kTUh_@-1&oj z_}Ml)b7!ih4xVMQrxaJ%XiXB%Ck~u#*Q?U(i*FBT-89)6F@CfaFI__*`dv9nOE`h^ z*RS8O4PS4zjayGxRn{79Rw?%7=J!R9CEDs$0bkX14}Di7nWX4&|4fqJFm#;`MgGqz zX`^gh!E`IgNRxS7og%lL5+i-UcAOkz`I&R%mv-H*)uvjBnB?368Dclh3I>m~0n(sU zDyn#6N|DUvVi!MX zr%FWHdHEb4kY8Wf)h3%iF-0k1(%ShFcR}-Y(aXJErf)RT_!vU4TvB=~0;i3ZR+->P z=cU29sq-w2fscVWiEC4Vxvo$#d=(w6Igcmwd3nCrg*tO5P%UOmo{Zo zezIe*VYFdReA#}e&JIcNQ6kgw0-4G3Vc*NrUic*D&^~?oj2%99!p0Sil`q}+`?5xW zJ+iTL8!t4_2cK_5V#iz!1$si2FD`2j%L=nYTMBR+91ID znEavv$1EA`Hzvy4lpW-QPc|!t)I3WbG*hH3Of@S+`?~IHQ2^(J>=|~ec8Gnn;VVm$ z!g1Bg)ncyOTr|5HL;QLG0f#BIDPOyG%|89?OZ#TWS*y!hZV8za1Z`zvO8BvTvGr>S z|Gu>K>z;9Dx!-hUSTD0fH2}ORzHcb`%a@^@1Mn zjX7iCWoKu~v?;|Zs&Bfe!c7TCq#}!p0r{d%iC~`4QYGnarR5AA(i%$MSLx^o@@LF2 zmyMDV?+_98`OZ3&HVs0ZfB#Al%6@St%_v4E4!N zjf&pgtaoEJP`*@*Z|i|t!K%g8YfNsjVbWC3n=C5|MeuGlNmV`Z9L_f@Xj#t|dN|jw zzYsshA7Ty!tM8 z4TO;(SvL2Qk`m4R-mNt5gR$mQP*C8Q2BvrKT8sVgw8eVddt4SRauX?*8^yDWvMg6F z6yd)5vd`EfiJx^_S7iTU%7hth_BGDUnUJdeF2T-TZnO=%8XSXywr_$0G>#TC?tD?B z1dRB0Q+S8HoQm%L{_@AuB&ScGvOm7_XFF7S(@Mr1vY)^HoJ~^TA&ReaFJlI5z#V*A zAHk<&nE27MOegqo{pb&HeOwC9>!yqTFjw3s#=}(#f0rq)$>B2%E^X>H;cu+UhRDKY z=wO+}YAy~EGflyI>?y@Ii5C3$ey9_kmyZ)XdA4}z-w=SYh9O2v+*^$``wfanm~+g* zQBJ~GZ&Nm<-@Ws>H4Ip5DT61AsU`?>G~F*(P{p50%qX(@r048|Pv6m6NtWh%t>}oj z^+tDRkKgmJUcGAXzWa`C+Ero6d20pNLha+Y+lsH!_eOihHf;Y=vW*S);tT6!sW7Zh z@I_bSOvc~9=lbfZa*wWS_e@G0YzfUZ@{zr6x2o$L!(1or&yCtTF_SXGNEu{GYb5Pdg75M(c2iNxMhz;k^v2s(cI}*1CXKPhGnQDk-LgH0erq2d+h(V3 zSKG|NsoJQCUQSw=Dmk_d(uSXBS#^i4^u|@2lrvPO;OFh^&C5axBP>^%YlTbGJt>x= z`vO9k?OlnI1Ua-uuz2qv=0YrIoGNHWEqTmP)q?C0`-`q=8TS6bSTY1UAwI1lIkXg_&zo;|aAl|!T~zwoqU z?*zfZShMzNuQ!GJkbDzdB_ksuy{0Xeq3A z%X|J%ewld~5hQEnoD2yv6njRDqI)+2V(4}CypxA~hu@XL&%pD#-;tBI#VjMFCv7E~ z=SlMSN8^0%s2Sq|43BvCPZk8& z8_-aLWAAmp@Q|ZDwA2X0DFiYtztv)c6^J+?NwEWD>fK?{rj3&C!j(!{E7fa{fdMCT z1lG6lh0-D1A{T(sHAM%1_uaScqb*f7toRjckrFn5BbBsoH!CYp#wcsaecrzKeuLap z-nXB<{$m?7SOKi>Gn|u0jvVPEI9)wRx39BmLX|Oi_EX9 zYA)GrE3i4m@`oN;Xv1X#Kd)$^y?gu}dwa(PE6%F6{pa^s`jB0}wku`d+1LAI3O;SA6^wk!o{~m;MVL5y6w;2`!7EZ+IP>aCaXl)UAx(6neqk9)0h&(8DEkq z_u0!$PU}KIq$)Ak_+$}y46{f44e`NxVQI%cCXwmXI_UfLOsyTnzdTV8@JJR3G=VO# zwE6IpKS{`U(Nb%7+TZ`hGg_O=?~35*ksp%p!oot^vSo{lQb~Tro=U>K**Cd0X)84~ zh>6fwFM{=Y{9L{LVMDbIlu72_y*$9Jy}oKc-p;*4Ac2jvgF-sSAD z++$F3pkdv4wARkb8feaVwA{+?tNhud9qdRz*+EzR;J!1d$|NB=vT|LJJ zk6NN2rP-D-Y>?95HQWF5U;ov9{*#xKzGjBjXL_%QCD)f=k07{AmH`MdfFBtseCh1n z_&WXZ$g{bkFR`8ht@8~r(O8p#t4~M?0Nw^a&n!;1F>*nGu`X7OmIa}X9}ob~g6CnbtE#G;mYF@Kr-gfH3&wh&vVjn|l(KT=N+%e9@6(U0HfyCN z4w#~|+FaTx)Y$0NXYFaLyYjyM{a-Fu%H5Z_-4#z)_}}qkYzSOept85$eb?UKTyG;L z{WOv$6+uQAk-}Wd%0}_D((=}b0sqYEYJY3L`sIJP??K~|{^1|~;lB{L40Fc5c&Wi= z8ce3N)EQQkJHv`|iWO+A$VLsGU=#8e+k)cNwzzn%a$BcZa>@Wjp&etR2ab?VSN=K* zN;YxSN_%SD5^0-r<(o55IaDXwsEh%^eif!{4PxA8+rn`xlx}OdWhSM_q&VMl((`Ok zMvhFAMq5elIQ3O5zwRtalNx09F~R1m&xJ*^Y=lg-1#U}7mhX4Y6q}Sg+6E{h2?TXo zdXdIE(TZ~N&@cC@cw_=B^YinpsBo;^zWjroId|34vW82govEJct>NY_8`}7}z47`> z_Vm+Fi8)U0k}#lc{G9g4l=H1k)yn6c;7kHByK?)3uIqoF7Pg(}HW>%O$1aGtJASs_ zb}4<#5gkunYH~i^1VcJlTIV!lnKD(ZsA_R(XvWC2d!BNDE>tc`OuT*Zdz*)yKhH6` z@9?$w_c#Rl0s?;DV-FlTvcQJO>LsQApuP0mDqFq!87C;CA79V+>7|~Sft8h&DJS+x z8$Ukq{q)y--Oi36=|hJOxxAP!yzqhxtU~?h{yJ-;vukKAiN8Q9s8?4iErrZBohGvf zi!0VX&{?1HYkdy^-T^cjn%7c&t7XPZeSEWH z?XTS5-`*|LvPlT$;K2j-FTZ(T0`SE)c*J5+2U5q&y^Fw~sS0FTsn{&LcYH25G}(yZ zBYLGEpf4EAuXokj*24`h#T@>?;G~Y=1k)+?WEtFi4z8k|)f zLG#AsCE3KWDYkf;@hXjGDDw#_wGIw5HZkMhZeu&49AGZ%a_`nt|TI3Kd zCf#h>eh={V{4soHHn)}4F$&v*X`~1 z$AJOq?X&l{``EX!1iBz0$_1r4D$}t_g4jBxYJK(T3}?RE)%)sf?|)Fwi+SbVy?gD$ zPrtR&3TdN<&DPwFq6ajXgcd!Rh}5ixt+sx}G_9W%%4IsR!!_r}AAZKND-E_$O!bXB zEzX~slxJPR$hY&bj*OoYre=aOZGTz&mlYrsOERq6&S^eiz75li2{%E%d@DU&92m>5TR4hh2Nt4qt$k9wU46^P`)&glmHtJbE49O8D z{BCwR7+H7(cb^Gg?fG|4Sd+kfR6)MoymHvimVR$jMky!e%WJi;=ZSC+{4zUw2WXba z14)3d?+yhiwARQMdAcHg6Y%DK6yGXV@m6gg*wK<1#L8A$Lz4A zAlaGHQI80=(~8rS5(^VX-rfBeX}rxi1o|EVm|_nYkliCmGFoex=}nt9xhUbRd15GZ zgtS>Rn3A18f8M_O>MIwpZ1w8Z&P1uVPXtO~?QuMNrO`I+sa3A`Bo{Y=wd|Q}{3mZH z=D{rm6D*f0==Iypc2l1lkq^HizDZ?AK^sc2L9|-5?TRjOHP%)gsS!UsUk1^Y%)IdE^jr8nAvM=(8wc3=)4Oe8Mw2W~MoHM)x%C&VfLD*7Yp^eO)@qF= z*t!MjF8c(}-rwgmJVq0yY_c1GF>w z`T4DruP-}z(%bS2am<)8Vy4&I>=`F*%;+&zTtd*506M--ELfes*r158wNBIY!lHCZ zom1tFjsGPfs?$tg*+OO=muinQZX6v*TvKGP!DA;J@dFkqU;}Yq z-Yca*M9Lar*U+uJ(+AmX}AS}HV` z^f_Z(std>j{L61O+E=^k93hT>E=-2sQP6CUP>h7N^V41094uwN`k`8NTU`EG1Zdfr zLEiXbBFYKwl%zq#33DLZe+u)0tP6Y!rG@o{^JpfS12C2dTuMeJxxKtdKDDGuf)RL_ zg3yYJ+jgnE#!|E{S}>z@L4f=WZG94bVd6?~l&X-XSLzi&@VYG5q{YT$ypzJ(!F>s< zs_}}jzCwY@awPnH6bfq<%M&7Xv(^!e_`K(5E(JpG{6UE}eq^!@QCt%QYxs<#nU0rk zKtS4px|$1iO2KZc6hIdt1oOog80y5d;WlB|D9cQiQbZTRGn4%}A)(SvmVIM;F5R}` zajR|muzX8XOr1bQ;aiFy`w{}Yhk;oMvZQRb?FZ{DP20v;2^UA^GXIG;5zwRq1`M=$ z^XJ=#(pn!qdemvHyE_i>D8h31r2_{J*pw+#3^&?XB|AII=FFOD1F|#h-48a}-qKPl z$-84OKfm1O&tD`>b4kCm(Zw}XVZ<0jq#9OHlE5MUi64gdJ#k6jv$qM{;~ zKM@8SE%u!|cU+1N+(SU@>({Thr=EK1F7t2JI0Q6lzetfq&_7%&NLfdO=vrx=CyYsP zn#r4$P4=~zgu~K8Qp&D1+gK44GfR|fQ`$&kF^rS;a=7xwQ)ur7Deu(2+X6zAA^oDM z9wI>*8g7JaM^D!|p&G>e9n#`y95-&aDCfL6A>T7%!b?UeJA>M0FQGt?h70XdA?kFv zO8onMfPjNL?S^2_JF3nM${-R#la74g(kbJprFzGW}2nPF?6S>@8H#1d3{I56hD z$Ls8!%{8`2u1hf0KJxeddLF>vS@C0|PV^XnKLkBd-@SziLF!H^&{&i9h9xsoZIS$; zc}MIGn1ExM5G{Q7eMGn4*|?sxYXY_03+n9JrO)imeV;2}UZZ6=mqR9cpuJY0AG0CP z+5foU1sjohw*V(tFV}3#&i~tfd-$ZST=Ku!b4BA#S@Ys01OZ^(TH5{4S;4Be;KCYf zYb%7SUvQl-O#sBmO0$Be2;q5=$ zuF`Z%9r~2q+Ow_d{GYYIr`T(+yrOrU-=p^KwQ_=N)mtD2y)!orGLfPu*S&TWzrPKx zz!x8lef#zqCMD!zgTclu1%G#>U<5%z%S{wRUwVri{e83(My#CY_Z9hDeX^}uq5qrY zldixx17sd3N%(OE!uiW*vuxo2*gz-0lr%?RRg3ZFo(!3hNm$!jKqeI0>TH7vYQ_J? zA@F!YfMww4Kk2s+SmM*gTIY9$wA$$so`H-D3kz-XfY=5)6#y0P-x91lsK;SeX7+t~~E}Ai-zn&KQ zClybl7;Q|$8>Pvv6my1a$n=s_8$L8yjDL$AQXB}zGEt2D2r>8Ik-q4^r{j&+?>+>0 zr*-uKqm5toctwC7E`qc{xZv;^<$YBo&teg!2>Zk7lzb1&hihWa!3|h3Q9N$(b$WUv zYA=NE@Ba8FOCI@m(nKgPtYfZ&RhA%zC!y}5Rh;-I`6?a7!?{%!c-R>UgkHR6=+6bO72sm~^7GtEXER}TumMNoUeSp=-I0?MR z3=iU$coz@XXygxlgr7^xFkZR^0SPgyFWKoE<<=k{{>sXO_UW#7&2pbr@Y_W;mLPx% zNHuO)fu$uXqIy-iRW>F_13B0Rq@_FS9kc7UWADG%`^V48RQP|gHDik{OAL8+eS>@7 zSc5b+lg))#L6H}upnNqAa>Z=Y9ds^Eoyue)!e?`o(@az5d+iz{F@>T!xm%p^B zvPkRfnZh`|Uhm##`v{*8K`8#Umk{vqyl~-yz4Pt|_T8SVmZUgcE9MQcH-7$x6dD8E zUdWF7p!nJZ4Jud%I#kPyk(5t8^*iV#Jf6tgFunibhaYV7=FP2|EK;69Y!k5%jTWXR zL@pexd~2&#t#ZB~y_pcfo7ILETKy2eH6n;PHy{hb*X)Nwwf4KOYoz5$lw@4~SIXQq zr8vd;M$afobDFDg8@xE*HaknG`6u$7#veKk0S|%5cIq~8q}vEBu}EP}0Fs|8vp))^6cG3A9}<~u|h1o!5>wYEn-l?$YWTR2TQ zc%#x9uwMNd4ii3nr(Jh0@?D44x_s}fU^)(MNZXi|A5)HHd_2n}q$4O2W1m(eCR>bm znzW&4(0ys$LwxUQr0puT0)YaTd$a!q{iqH1@ZtCyegytVo#1;%{rLCFgSH=|Z{yKA zwmonAabvmU&H4#?w&QS(vtWYBhM^lROC`*wN&S@}-&}7pPEgAoGQk`y)!aM@VoAH` z`Vg>s3NODNDl4lTA^Xv%Us+|^8f(d(?tJLvDQ;GC!V+(OYCnH92>1ul>hJSUc5`3U8KmYwb_v08IM|AtZ8w-+pX_{|KAcgPy6s;Emjj^s_tO-U}Ff0%R zAkap@hF^R%T>U$x55Lx<`-}hX9t2?G5)&Hi=B@ASpFjRTtYz$fvX^JRV3P;nzu#bY zuJ5wX4}M^WDr?9-Y%K{HN>8@NR!>}RqcbaP+n#^6caNR3C5!)OTalk>r%$|Te>hob ztEN3`InDd+<3pu3bL!7+)%Y1U$ZGA}$=}<5JG9rvjr%)$X?%g*yu8J}IJ(Ks)hZT# zVuLj%4i{7SqAe|&VndOb_Os&VUN_e|YmT`s^yt>C3#=*O9KUfzOw-=MUc){_=9wRk z)H~dQyAx}dz37hC3TtPCV)^{_`fO)qb-kj=_DcxGT1Vi!U)d3;J6t$u?C>O8q`-Zo zjl)6(SH+5o3fr@1k8Rtw&AGxZUcA`3Zh@EKfx_0L2*#n?!Q*JTQGTJp?g(G>v)A+3 z56AEQC@~05mnq=&wk=z>Op)wnw$omB2VNezlA`OT0-&++ z92cTKalXN(%4d4z+;rQ0tlqv+kfY)}`DMwplz=8^9oX1B5g+c$6C%Ft@U{5&I0T+_ z2!LoI6krBf+qie|K}gn7iG`fgMO+k*NVKBi3>0 z+G`tAN4-awhmJ0HHAr_|ZM1dN!5!4;;8Nst*KKrue}B6g{k;BtdZwE3LccGRnep`E zRJ$t1`Ha#j9z4}xTMjCSrnEm3MNpWVY6 zKgDIsmfFBUgYC1gHrtuoqLMQvSySz4%Wl{v0(XV25*|$!m+Wa6-xq6xXT+Kc4K;Xg zflSG{-7#?z4>t-?7q`DYj(t3M)>(B>~q5w(ZC}mX`6iwo);A z(jS7)cJzD;L)Xu7<~MOUa8<(92!Rm+6Nf5zA_4PYj89#x7vtOLm|p4-bdR_oWH8|0 z%2{dl)O1-~X~LrjY7o;+dcj;-X@N%&G9zHhNSDi!1bm#M5a(yHQn?bq&&34M9yNJv zvMp9y(6#g*##gv!Em^X}G11WFMETCn&UQ>TiY^4=w{G2X7Nsb>rcRw|KmPHLEhk4l zyz$bnAmDKZ7Qa9F$xj{5&&5At?unVPA{u`7OtK49<(KaL zUZ=6z=Ny_qh#)=)7zlhw3MleuUlJ2RP(&hBLu|pUNjGmPsU-YNP_E^{mL>DZ;Q5q7 zv7yo`>T2Xmnxe?X11(D?l07YVZkJlwooX8}sMtnkWy@6aZlObM^*K9JaZ8-!a4X3f zW+@)9kAeN% zyh!0RZgjH?j0OH8kXEKFCEnUpD{G5pTRk_;`S!Qv+wM64va+&lwt@hqNhAH~SKIBt znNyaRan+uG_9UFTCP zllx7wE`ia9$VZz-{%DwfGHGOrSx6Pv;28j>8Uk*LU-!Qy+Q|R_KmbWZK~(-3d>{UI z{Mh#p0Oqa5?F&tIZ$G4E?1&Rk+Z`Xs;WVEUojUf3jocWp=GWxpnmd6Pl~+ z+{I0Htn#uoXD_j5r!2Bza$#s0Qe>0z$J?jZPT7?^mu9=CK=4Qb7aDumYS#lW64g4M^MZG zsxx#DX7WLAg)RVDvS?-2c<{mOo2yaVwEK-Y__4A^3H_37=J-@6NTc8Ax*k%{+N9np z67NH7lq*-RI7S+}o0urMxw$rd`g9vLYLv^|0bL$1{Tl*VS(y)gfR0k}NC{?-=(MDN zA^ADcYB68*%;7^H?ISnA?^uaazwsyA8xI&gJn&YBlA2Wh0ZC#Bs0kcrXgA^o6S^dn8;ohY-2%Fo>!IoNEFF$7(>%Lk;;dc1W8YlSFaINPo5e`|A(L@v9 z?FRXPe)us!bR{VOT6(JTs{3C+cUQ#I0PU$cbda!Zo=WKrQ{TUs(o+88kr zO=8Y2Zn7;G&X_Wa+x(JMHa9<48c4OlKMxT7ZqX0_6ZV7s%i%QnEnYnLiT(T0y*6#? z|7x#|8!yIPK+tu@NF&^LM;f9{$9HJMeZj^I8tRBTC+Lh^Z>&FWyNj?41;O=r$6SNhMoLp;|CND@{N+;+NElxqeD9573$k>pJ&{QMqaI@s>%wqIJVG;M&pA zxcoD9bp7s8#LwJ62uM&;TV>UawTeQWZv$m=D$$38CPQp+dW#*etCYsJUUI@@nKs|D zbJtH>qN3X8=slDEm6DKNU}JJ;+OW&tEBg3Z%dWm?H|iT@{y)oxNwIRJ=7v=!3{d*G zK_+>YO0o^k7-I0!m9>@DsC`W{Mw^&s28*wkh1-3JZUzPz!6i;PY8l~Vs+_DxSl`fkL)AR)$l*w{JWu{!6~=EBPhUpFyZL^#@F2RK|z6It}%mP!o^GPA>bDw(SI>DAp$T9*fY)@y?B2fvv7Pp zFhL=TFg_j#J~}IGAOxJ*xTnrV1Abv%;NM7U9MY+fQ<~!URFJy+%?WL8Y;w_?tgCPz z|G2UE0Y&u_8CL6UV>#sfG6XWRevb=#kf|9a9P zz!bveVz)G8pYN-)we#+d7<;cU^27m=y0;&!RnE>P`{^^;j=rL8=4NCn-)mR*bbojZ zjF~|}G$lqD8&+Dnw0CnSB-qW0YxecQ3S}T@v;$?zj&Qxs=8o4sm3hUEo!e+T&z0GY zq;X+-<`M#)K_H<{))2H6){7rMs67@L~w z^+lNthR(IMQ;Vg787|_LD>^M;HmQ#m1rvhvX_2tAQTwq++OER69$Br)Q+gKRd9B>I!VY*u&Xdb@4tBGEba1 zQFKYF(+GO}8g7sAqAmOLrfNGb7l~J8jWtVzd@Q0pd|zkZ-E-@YKY}x(@c^2#vr2b$ zS`oWzKm#R;EcW%Xso$bn%P9X-!#ol?K@(ATM`F~Szd1W&1Y@*?|8Td6K1Dri~gp z!HNd$u+poCtU2Mj)uv3f>B`HSmRzZ|qac@7u0XQ2rfKAo$JOdP>nt-lL;GDYmo!s) z^x(`dKZluP;dzGe2Sk!C4Kf8EWzz9olWQ@ZO=Hca`Y7-MWZ07u{<38E9y{+$adV>kIcrKdZkMePoY;fkv4atHj!G zV%3YEd$V8dE>$=*jQv$B%6g09N>B0KcN5A{T_r zGu3UiI{wD})W>oFGjJjjk}H?@(BUH2o{}#_zFsMC@N3DFq_CBq4RzJF^#mu`e0oy4 z^Zu#hOJ~iyYaLXGKFv5gtMB{s8>%Cyq8ss*LP!5Ry@5lhnbxn}=(4qL{LAA3fzorb z64_QKqKG`fO^&$}{n01I&u1ybY|FkH`(|&w{nffmm+H>X-9G84j~nT5J!#OnLlSKM zgd=wB#umHNFwW|0%r@-Hw$id}8<|sW=PMGW2^wnYEzQPI|U1G(Vl_DT7TT^v^ z=Hwk|hEHB>ka=?uunvFVY?&NjSwK$gf$|w9@-a+iX9RZ`n&3T8XJDF1KpKc$EVw$0 zRls=8$>rel?bT{7!T#gR1Du&DZPR=7_&ML5;_lNQf5a#B%8f?(kS9CM9c>?yF#F)C zMjMx(XeA>QqePlKa4#+q-7OuimF_kWuh-`gK#+&_89SMvB-zj*V=Q0VP`v`Hh1Z0_JR%N|r{ zg+oj1(8(QkNdDLZhyTjPWlM;sG(kg#jJM&5JFWEcAv-pFv=yb@u)XKygIzz^mJJ(W znJ##lW?c^_4AuP{hDkpq!P6xL2fHS#it`eTO&ptItLMuaN0rj0Stg412&JaVW*uuj zlNTLR?WTqr?X%ac=1!8d@dFIg+pKmL(jHa;#8{WCK)ZnTkau< z!nfY_y}RST>&EzrCk_HJ8Ec^688;>qskn$@%XiNhdP(vV2eBSLFi`~0oH=7Z`q7V+ zk|DiS65riscn|o2py|fHgD8eD)*Tf##Zl4>jLK`P!6xc9EB%SywAyO*>|1x*iLOJi z7780J8Vw(G0z!p|k66GH^n&qH*c7W|W`w!x7^OzxH>S2H6nU7alKhS?+`32_0nC61 ze1Z16;_Z zalhK`n-Rua0Rqfr<`Gem$t8X5R-@BSk?)xlMkx_Z)xAK=_rbcry!DISb@nSU)kF^V z*Y2hLhk0+K7}f-7XhsgbDig}LEpOyZn=>HYN)I2ho6^2tH=`F9r)v*IV~5s9L)Bcxe-gjqh+?bL z@q2oML$?)11H#`@lV_KZ6Da@2PRso9yka$1Nx6rd_B>v6&NoZi`2ZF>m1Kj)*Nh+D!LSyhya zi6-8~bp;H=1!0te4$dTH;xHnf>n=51qI8LTVwH=RuS;3?sqiWSUtqg#Ub!$Lcrs(4jF4Noq?%aus~*bkwVmPf@zJA*$R=X ziL6KQ^&{1u_(NoWGIHMmLx=%{5xgqo0`+w#;6F= zcew#+j~jf6+>e6B`+niOa^tpgJT@pbh?rU!VEiPhqZECPpqi>QA(=|SLSTw*2Wsu4 zqMa(hx%1Vbc^D1+b_Qf6*s}khy*K}^>dNvwx8`|55+Ei?Ok$oV1Ge#iXNMhjL`FnL zM`uN5ull7|SFiq|R{xrRL#`tp0w^ z(-D`)lk_AI2)GBH-hKC;d+xdW413;tL55X`q2;+Szxz($mxTFc#7vYv(|62}R*0r1 zzy-`W&n68Kh2Oz$b1qBT62FBr$s6StbW_1JqU%wYXXNGFzUI;eDX0v-MELg5H{Owg z{|=FG*DOl63F-@hI<_7VBc+^)M5hFnnEMfY2EwvHKBZH}%gj{LUfSWk_~xA$Q~DS* zS$7W!{PFMLPjPRs&`ww$E(917#(_CauGzgOqnl&yLJkMrK7#n;!UtXRSvE+!c zK7xIrzPpKU71kK%{F>hLV~ZV7&`pft6;83CR=Fj=+~f{UV*G(1z~} zZGj)d^5{VzGFN57pFQ7xv-aPtJAJH;?d525Y|?}m?3dC+SJjDmmP<-z`X~iuEV0p! znM|>n)Bf82%eXen%^&N`wTnSL-E!9u zW4-TGyYu&+r8!L0e)75JYA$2W9W23h%cAgCX{WfjNNevImwJl$KUkCynV-UM;t3%D zn>A~eqj~uavyBfkbTCo1z0Y#+nf{plz?Z?&%l^LbJA}Z)fPkN`eKOY3o$|;JQ!H}0 z9X@>6cJ12bB*%oTM`{(TutfZ#jCK8SJ;yuaBYpAWMQ2)1gh3DV!M-!F$JZJm2KlWi z{lV02t^+*8MRJtp_nQDJl5^v6kw>ARHQn8FfNUgC+a=f-!pprgosAFWJYQ)a~xIG{lp&!4K)QM^O~Yp!eG0i zFWv=WiTsKXNu-sb(4R@ljfe&tJOJ@UhifGTM#Dks2!hp6xVG{8W|=8=I_*xj;6^S| zBC@9lxa3tt(*dzY(X??XCU_U#ADB3JxT|;n3E&}BbpP+J6rQ>N5MY`J-si8%6jnl( zJk8Tw&GE|$T69q+b`28H6iM#bQ*Fr4Xa3<+z2|tVy`X6RbCg@&mB_Rma=RntMnqc~ z+2gDrqs5M$-eV`P-n4@^Gi+4;R4Yk4Yu(aJPoCIrg$m$v=6H!UOL<&*<-8?l9J8wp zikK_Lu3dKIjV;%$rY+Z|<&Lr9oLtM0CVa}MiI!Patu^Xccs)ru#S@Eca?vcCo{w3N z)~hM?i~Owo@hkX{t<5r`xXVh!&Zs=5=+el0jZUnDQ7?ULHuQZniD_^O7FmLbSA?|7$ zIIvgui=6MeD?BlBAt3ymBF*ynfcc;AY*MZSD|{jrb|?jImsH{QY5LqglaxBfrj8rq zPPA$RJAV0~9lp57&NV48-;8B4EysaKGsv~0*b%9Pib=pn@gcN#-P!)_b~$3+xu@$7 z^a_@NxM&Z3=Rf~>uUjMxH;N~$VtpAZo$T)qze5N-35 z@#Q?sH_RqMY}7r=6eCN4S)DUELj1EiODNmtCQW^${a)hF@BRvHrz*;MJcVcbKE+cX zW;xz|5bbio)HJ06lD1mN4B-UKH$js+#F#^TfxsyAwn79OZTtL=)gsbw$O52V5oFP* zub!PM^F@%WImYbpSxLKl5Fn=Kq@ZxHR3FJYgz$iIp!9_RBUi(}!vO(D%xGXC#&;iW zwb2rc%qmNCCU#jFDauQ$pf3c3xrYL=!`LF!+I_4|!M+qtRnd(RboCNb_t5@`xK;1h z-7TS1ay` zo+IIf2+!gIx5m1)5D{+?+$^$hsd3CgdWJ#2R8Lkz$yt`3+#{TTaSH%~Ut+oRk^i9X zb@ylx7zd8SayJAVTUw-*z=k^5s0RHrJhkq(~6cca=bj(c=?&Bhb za337mUtv8FE&PVoCcfBMGhL9d6JaPqvC#@NHbwh4h53Vd_naw_;7pOT{r|lO5cJ=0 zcy$CrAR_pVr-STsxTG{SU9tmb*V&PVEE_leHG5{#lzz;+6{>82iN$4<0YsuF?bRXC z4s2Fs66_-=O6nmHpeJ%;$K`VSTRiU&t4>h+>@6#OJ+3WQI;$BoW;mA)7?0c@CK{&u z=+UEY{VrOx$lX#^Rppoy);4XiwoxjDC4|68hXDLA0j3fB_K%7Bc#{+%FwBxcaF}l~ z@sV1cJ9p0cM6Fq~#xd4h133nz$$d2WSe|B6VS_*#4}mZgQ*aL$m~vnY@xX?2uLUNu zyd+f;(Fj=yu}&Y^gJW&vFo~W~9O&6F+dWF-JE}t1_|mi2yPxiK;F_=Fzk_u-=c@+s zO{{bNet!@3sTaI2SjX4veL(a@?(MnR6Yk>k1u(s@Yc+Pu8PcfDP+BuIkC@40Hr_6# zi{G94jg%SRL|-t^Zx+Kq9`Xh;-h4839cDdOX7p(HmsF%VW*f~*buH`!0u6n{gfq5` zXD~XZZ`*$d$HJfU@8*Ap-+e=X(PAzk93cn%E6Y=rKB~=XB`|quO}c&jU9-kGGA;v7 zx;`G`#{*x{wF*Xv3qn?p+3oGw(#Oq@$Z3(Kj_{KxPiDLmY(lnNEG{0mk}+>usRWYU z)!H|e$2vKoUE0N~@>$$yrPH3bm&%oT>t>y;+o}2AoFi6PX~)tFm1DX^ZW?uVqoL7q z(y!Zv+G{eURHR-3tg9P06%lFO2sv*9DAEV{7Yg7his+lCG&)@hbXL<;ZFL<5)?Rnb zZZOFqN$3Mrpq&q@y#wjADN@j4p$XO?}V%m51o6qt#9FgL| zeD!A@)K^>nJX<)-mrt4E&--sSV2a;_{qM-x*nfRpf0ZVJs3Q8hujlFnEBXt4e8;L9 z>s;`5f8BovuLY0Y^?@n{Z_sfsjoy0@so>w&3o7{b%x*No3pPohw(+tSfB}d3M)Qeg z^rrlFImSd0YXJ)W;On+Fx)ch$nR#CdIb=KLn)*5RO0hxxT zIVr`?RPVK;sn;yI|G{>g{8UlMr&vTO*QV`CMfvvI1V1X2wNHoE3j*HA{ub-Sx#npFvSeT>M;lm% z;lt^##kzNvw9qSNr#rt=_CX({GFDyAG1mQbrLWt<^C1LcKp--wQ&J;l#Xu*TRJmcCg@n(#BM5hZ|oZPel~jTvL1uQU*|j81f2CuO1(>$ zF4@(qk>F_leggO69x`Xn9JemJgfqA{RJuCYr|>w0z)>fKA+(;B#?H!kReg?^TA< zpkEw8B*p|sn#46eNS$E@30?r=gZU<+HQ)G3A#LW^7w(}wzmWVh{Pjoa+rtHhm^4`g zazLms*y7tkT8BjdgaeX!N`LTiTbcd{r2Q7ZK(`~sSp zYt^0hg95^#MV+GP(fDsS$@l8usa89!$hMfT*UJPF-+Ii*2*Bk{`+dKI??k_&@Z%lx z!{76yed7bqcmW#%>`fXg9}1N*iXp)I#CpK{@W%ri+Mzx20w2&=VZKMK0DnH7HXe;S zz)b<(S{wClh4N*sut|C2EK9oQw3KoQC!V(QoDBI+n7~!}h`@XLqY{yq|`({sd9_HJlZtz<0*tZw# zOK;nOHhjJC`_Y3yP&^lzg?+z+AA9Bl^Q1;rQQ&N70O*6s3X=Ntf^@5pK$qaLt{xRf z$XsD920y_!ji&YC2T<0bKtf4Jz%#Ve>+I1I66lZs!L$Safif#BAq0jS z0?bD~%uVJT>8P=wLg`6SycWM~hp#J4d?Zjz{D~7MI%XQ*3e3cjKCzgn!|$L3YxsKf z;95qS@z4MK&qhENCutibxEUS>j!osyfBv(Rh!C)a^RbAB2lr;-lSVoOn#D8|&7Ht< z5RwEm`Tkg|{dg{7GM1=wFw|KxI>{80CaU>@X{k1~C(Q=;qajDj?ls;c{hc3n|9a?| zA$5bT0ivi$ZUF1HG`Z;azkMy+nf&`}Lu&Z3x(TAP*}4+aEKO$HE+m;!;&dveuBNFg zO)YIQk8HP#*OKgl0?XAZ_1Sm@?Sb&j(^}ZAKyZKB+G79t^-No>v`n#sQ7NTTM~ihO zig8N}iM8RFLIn2w;DZnB`RAXvY15`T8UR9Numu7K1|8S5mtJ~lKn)ga$#b|pQ)aM_ z9CH1@qler^c;k};f#7_pQcA}kj#y62 z6)Rk&kUqW*tMKUlLI8#Ekt0W(n=eYvSaWU2rr_~*m4_mM@>*7ZAL?>C=$XSaXU;gy zE@`~b%KE5-gE8}96GEg1aXL~8QPgo}Cn_S^dVWI)`1kIwpTG`61EIr@KmO?M!Q6n- z-~E`0*GU_R<`Oef0+Yp4f}40e^}{+N4+3rts9R{RGsG-sq~5j&!AE}0q6}LpW}=D6 z<@(%I{&3+W7rC4iQA9NN<-BrU?oePZS|A!a8gZC!d=D`(&sT(8v_DUJ0p?XoWkU4# z$>WB`ghA}HZxN+<%YK3@) zWvcm|DVzMs<5Fd!uL!v^|Nc?w{PxRwWBbt-dtOo1G1o6p&hhuZX?EJmMamq2Wx$<# zYLc`;5euV;c1co0Skcex@R7wLYWE&6M3sPq9s zMtoXZr7a{zh71?vk1w-ZZGptjIDNU@x#keOlJ$(xl6yGDtz({qmbm4#D~05-3ljb) zhDK`Cb^)%Yy~2E~U!;N4=8Hh|x&p4Te@i!^2<1tA2!lLS?)+xjQo^Ylfy1NpmoX#F z=^pJ}M=x|Z4fU!y>~B#M=TUm8`_NbT0u)sQMI!}YWo4z)X45olpR7gfEzx|(eRy=( z#1jeuZ($Ap#{BCq*43~x)^`#sw@1W>>i1_rhG?_#%SJm3Lx~v(FMv5Y!A)RLSu_;? z?b;WnWCL=DV}xN3kp9x8OI=VmOybE2&Vu*-cP|s;57&7&K1lZW?b~NByzqi!%wtq{ zr+^HvPh{$oGWXqgQi0=?R$)|*d|8B)$-9}Y=%|JMQt+qYP9pQfp-V^>9MNy#HjY>pKLGKOb)|J&Z8# z+pxFEPF(7AY2PN2u1t7oos zx;O;quXfm{JDL^2z000ikmg)0?rKCQBG|$*Uk|?@ z4G1)8PM%ayvTd@kA%N+8<({4|;SBkw`|_cFG~Vp~^^*MqvvEGbf-;Y56!sQ^OR?X; zV_@0huLbW3k3$GVLx8!102tm4#`>9Oo^cE{uD!n8MZf66-Bh)&{eZu{hT2P=kp{q& zQaDF0JPI!X0>zY^V~{9FmB1$)!?a>r?q3!p^Dq$$gdB?=AF|Is|J*Ug49Y+Y+xH(+ za?D-k&Yf!ncIdD8_e|EVOXO$}b-j=>TFBFt9hQ6!zjqM5iP%ha>7tO1lY#{4ItZIK zAO`rbdGk9gPZk6idkTV>v4sT6i=+^%*F0)#k7!VCNxMx1a^??(T(H|j{Iy8?4M8wU zDbaGpyu)A<)N7oAv5~8r0BaQ5q<8}1QJ!a2HA)+DzQfjtIU7px@4jDVem|Vr(12$k8RG1i;N0Q+OJ@jnIkn~j$dDv?ig$K zryF&hF7+Y!G*65yDfLJl86iuO921U<4JA!`-13=ePIJw?VxME~foqe*SW}D44iwHU zo{?q?l|B#cw=ZbH(TG#aMJey`Z77g+5N*TYBM1PWqanxI=vu8ZMbsqpGS&z|&t7SF z_?-QgyxRyqiP^zBI-DNqhJS4MJpv(c<^@=-S*vgT8qgpI2sBrqBnER)7rj%_#Hw32oTo_fy~aGJ6%jL=1jbE zWyCPneke)J6`h_7rkh1TL4p7yO&!d~30?q#208O7EiE;CkdaJ**sfo%a&<|2MPVV) z1_1IOcVU?Sl$Djav;jmm#B^ox;>C`r2%5u3cj5Hu)3#;H7AGtq+8pl?&qhEbVKk9^ zK-*p#-zCFz54> zADuE1-gB_;G1BTY7HIm8OY?YGa}IY0<}dr4OJ%1$u~ovNA5OPBCgkO18P42tq`k-E z*dJo5+`4tEHxl^0yd&;X6fdxjwFFtKSlZyyQXrupn&d1oodke_K~B`RhA@%BUPKOH zEKqQL!L6phg4UW(JjLy&JxsF?LfPMa?2Q$Z?ra-Dc(a00B0Oh)-!2ix`_$zQH?MK| zA;t##GXX5i$0^Q@_Tc{C=5}l0(SwBmG%I@+-xG_IY{jfJD_8JQ=1f?I1_2apD5Y@4 z#2*{CN~~Z#V+}umg=~K`$IzY}-u0+K0RD=?TwspCua%dVyZM6!b-d+)1TTxXGt_gh zrI(8}$a1;m$q#qxC_@Rp+M-(~w>WKlK$-p8gz$g3LZ@+ay0?ZFc+clWdGe6uW zJBFgfEY-?YbCY6B;T)E`SrkvD|oKWl?l=snfyY003xLMZ2o)(+VFipz~mur z7-%F$_VvixjP#LX#*;bFSHZ_0e?y2rqL62yJ&`~M)5Z;Zn(gGJ4(n#gX_BB3f-uFe zFh|EkGADwsn?F3GXU_HYtl)X>p~k;4Tp8_fB^dyrneNowX=_rLmmbN`16Nr1u_Np zbp|^pV&N>B4ohqZ;NJB0*I(NkZ@l5~FnDjUFl3Ctp9r9#4_?9|k@nOzi_={yM((Rr_5p+o?2)|7fcRYZ1p5{J?C^K|5MVrmu&k0FJq8!J zA}|)wb1V2e{-=aBqagsF0F94zE4;({_3K^Mp0cvC=&Ft$AMBoVS0mwx5e0$1=sNhr z6DLkM`~hDEZ^=2Vss=j;Mx4glZ8X|J(B#(F*E^{JA@&JshA-BXDN}ki+Gwu%^jBVf z`DJ&XuS2`|a9_A^!I_7wUAxvXtuWPx4jppH`FTYtr4SGSQviUd7gr1;<%X!bFa~;!mqJzWCZ`!oUe*gR5JE<9FY<%b&KIVM0;D7z=Upv2Y zByOCet#}7GxCwiN-xp%e6EVq$f`4|q{KsI1YUBgfC=FzW7#`9JQI0AQ5GG14aEm11 zXn*)%>gy!`no-_7j{3oV@Y^xv9Q2gv>;8QBJ@OzBS(}l5MP|e8KDxQ3Kb}}%TnWU( zCo78I%+`E*bw#GVD91&ZZ_LW^+ddfTcKD0iNpChox z@8jG9f!hV@A5F2(|Z zIVBdJj5ed~WmW@&##;3IM`Uks&AD>}F`fRt$Q|+h<$1m3jvu{e-2rV!U-o#N3c+Wi ziBFX)PM#@F&8Udg8k+i6G1}U;oCcnIZ~^;jXOmqM^Nr~_`Hw3mB|EcnzpuI!jDZJp z*w=GuGc55zAh`cydGOs2EefvKW^b;_(3oMp6>%kC4l?h8;~U=-!dgKHu($aACCD>C zTjOR)3NH$K5pf#8_0ajT_K{$_;qjvf0Y9eDa31%7hnOGW5%@d`f)_p%KX=@ZIR1<{ zjWvBfb?TIT|NZxl`2|rv_uO-iq2=X#0XV_m!Snt&`kVSNtN;@t8b;Uyk82RpNGLEF zp}^!KRfo`qm|{V`^Ugbt35Mz3vuBUNHo%vSOD zx+ZPiP32TX%bl1gGdnTm%M@YvsoCicdBYT;DPq*f#S5boz|nVg*^h32b?&+;JTYP+ z;KtJrs(RVi{Ne?u=A!OO+kzG`U4$M4B0h&l&bGQ>d^PpmF3?nh!ZYWfg;t$0`H2b& z6fxOEphFvtGDBA;CTG4$%CL=ln(V9Z+w8@KX$t<5Vx`J8P20hO+0V9Z+njKXy?}iO zW*X@>t{bdT7=h)>m&*cXu7qUCE(-XcHaDuhWLrHK=IYKigY5^8c~@%ER|HsD84(}I zV4d*z{z4#nF80-WaE`KXV+w{4lzD*F5E(1jv%v|>2?Q+_6%}r;_SgLQ_VtYLd;|gz zu%z3<)eBq)p);7mI)yL>_hJRMNbXguSFIY52znC6$K!P18JyEW__EL9s)KvPmFf;@ zuR9dLt=lSZ5+F^%DHWV;nS8r_5JfcMPM8@bqjJyEh8ExM7wo~4eT`5rWp!?Zp!t!`P06{rC6-rYC09*uoWEa1&G%b8Q%xn(cjacKx?n%z{hda!P2acVS4(gpwAMsW zMSn*Q<;_2|TD44^FmK9L1XI3Yh+wqw+l8s{OwIt^=(msI#gPXAH=c10D%HG(JNPEa z!e_I}Qf-=|IwPpTyqkGNYO88RbFPtq2Vswvrx;sv!k%v>{fEjckd`u%!&{V~=Hw^a zm9j)RyjRXmQ=2JPA}fpTPDTDbdD=ev>{ItxVi~|tvkoya1qq|IhIq%y<;yR>l%LjR zS)MGj=8k-sT$)WOQM#u=GSv{Y-yLjqeI~LnnriU41qL4W$-U}HeUEq zkM&8!R>q}N?qTtiCt-BrnS$&&;B!7iAaCzTa||A-y~vr2;Lo?i-uwNrRx#dPHg&w* zb#xEr<5|MvB4NTZNC*Jq{U=)O(3y6@GsRg{VWAbIwFcQ_SUpY%^tZpDxyCgGSIjTI z_`>by&;(wK8RsLyY9kN=;0nh6;K75=%@(UO@HMyxK8%7=)Rzd&Ff?p2A~e4F*c zIhrA2A!@zZrGL@;_3b4QwAbGv8|?EKI2d5QDV_-9SBHcL3?Anw2oums`;rX9uXm<+ zMjpnT{?R6Nse_5oNG(WUd3Dk((M_V4;@5RqpW23QyDCX|lg!ab{YAPEf>t3BA0rcA zlodo_#q-0uUhqVPVl?1{`dN{!+KoK^nq>x%Xa<9$<1 zH*@lwOv!8O&~VB6LiML8hz}{2x?0ZLw;MjR3DTN*3lksnz;DE~%Q0F@gkHpHXlrY= z6;HonS-B8O=2oRxsmh)~s>z@Ea6NzYo`mKf4H1DkUwY{!hxdW$ zKzJG0vrZ9wAnZZ_PC(GG3=RV9x3MS+EQNqEE?_X={N8b>#dgWHCQoMOn2tO1aWU9L zt0n_Pk%FWlSP#qH5b*muRszS*x7k(+RS{OKo|kSjN);eaN`|nE90)*fW3h_h)N8E~ zq_XD(6=ox+$6-(Uf&c;Q;J3=9yrdjCa>U_s;&h=9_4Hm}_YdX#181z+tU;Ron@(f; z&7>tLSu{co)*H$T-s?R)KUjkO>kBCb>ksDGJ*fvigSqcv)Q$A@_LKYL_hEtnBe1NN zPwFi(*)ZLhKTV&MsvuQ~4#}+F-K^`1`i_aO{EQ;0LKI{|jCQV%94#atEYUvOPzfQ5 z3PR}dI1Vnu{^lBQ%iN?s(toTdwjOA)Z6ajOD^O38n4?1Sy35ot-Kwpn>N|Vw=?Nmr z7deE<9F1P{v>9CY>{XwA_L&p>z4_)FG8->&&m3sp(I@)8?>JHTTkW|8skT&UcYaBO2i?e;lfL_C9k z`lo*~G(!aRL@43m9fV(ST_WT_put$-Tg_N`YqHy|hez>3fITx}`xx1yV%-N**d$9K ztcDO?k_Vm~@G#S?jyINP*!a;{`4FoGp;IKyoo_3Ms|VV{{XLJvx8L`9mu4vzzS`C7 zXrE^m%AZ>eQz`%Ln_|9eW$v3G&WPY?1YXGzbN!s6nG!9Ux-DYLDY5*K zxK4SJkay&bpS-^ebu7e&d%~q_?Jl?Wu4C<1C@ssB5~W$nRX*Ax1x#wWWjnt6(u#6A zW%~7c+?p~V%sRy<`#=8UKkOw1KU^liYown2?ODE`r!TkLhg+I$iK2*Ol8&arUwiUK zZ)CkO%p7LLM5=!K?YCWg492v-apeuT&Ya->bsvB1ERVP!7p8&k9a#`~IK2Tzn1kcX zj%gmTM1rYsfGY$NFvj8wAqMmVSu?`b67s^)(9nfop{*e zI*Wi7t1*rzPo8YgKKrc07w}l%kZ3D1e{ZDa`};TP?^W(^lYO^_rU#Qb2vQ~{L0>Sp z;|1A)ffL=Uqc zPa>^W$@O5gf}5=t1G{2Qx-FlhI0)rw%I}_F)t3+1g|kQG7yFt+mV@!_WWPcn$hNg@ z+jh5!dmpU6_AUB}Ir@9+8*PR1eXpLM9>x|JVH1utjF=@8pbobr5HjQ0*O>b5bDcSX za3x!Q!vvYBWQWT|KSsrc(Cm%f5VF%8( z+l5OKnpeq1N4~|aosrlo1I4A_8Ew*zCrcw9FFqg4`}wsU{XLjA`m0Ny(e7_Q*rHf7 zEsD6F;?h2n`Z4(K;k@k+iVx=+b0Sy}>Je9oI2&9;D~hEp(ZfU2@F1jy=a|v(BLb6* zyD+YK2v#WwS~2m)w40bHe6oZ$xW@}*UB$qk=rImly63}T4_@Y_0wBii+qc{1&6{1W z$$9hUxk<_!4Cf2pGlYh@0sQ$eRhThjMnt00BV-un$3FDt{UQl=gjeUoYQSfABBwcS>GxlIhWPRSQ+Oun>}6OwIFg_sv1ekABxi@j+^ zZnt!Mu?Ek%K5#<)h}F+v-SBv1LBNk!rh@9sm2f6loB&TJZrrG~qsPzK^orRIS+X|` zb`OH-nlop%HuN)&*e3vCf4({hfBvws(FLhlCBM29SpYsEOFcLQBks6oyK#&gK6M1I zfvFzsoM8SSoFNMY8duE1!Eq4*OlT55(7;3d;L8a7VXR@WA(U9NFxQyqv*!2>G4-3@ z{Kk#bK$ao{JvY2QGzj>8mh}T3_Uj0K1fOh}$jQ=R*D7ub8AM>HPm8%eE)(+P)9v=^ zvJ9K5>)>TFBOnZqE}W@VP}D=G+H8h|?Gq$qrwn!9^t347M5HI%18W`)7x8@9!!h+m z$>FtI{=M9T2l?mJCHYb-cx#Jd^RARI)%#Howf}>Bd|3THLx6e1hrOy@dl42h>`}yb zV9xmYb)O&m*fuwqwM7(f7;1zYeB(C_P9ReU1)*$NS(y{Ujs$=WJ7et$RwiS4d3o>0 zpC1W8cvyX4ArgHMO$ieP=K4v73rLxdFCd^h3fFal=+EQPWb1=3S8JOoO0;rrE6q}a zK17Yq>`7tdqM4p(a}iAorR^rC@@Q$k3#A?B8)T=cc}LKdU>|t?9sTI(!yWw!e~dT? zFs78?*m2C*5_qh!q23lQm_Mi}#E}+n|AiQ1Lx(Vf=x9$)xUtFBDA?pY2}^x|w4S9K_p33-&~)K; zaQygjw_meov)&=n(RvZAin)bL!lFfs9K#*=19~c=ttXDg&L3N?RGR#kWHB{f@8wH0 zec{iC-~B_NuRZxe(ab!@KdVr4gy`X<%q7mln{U49a7VZw#W#iymQhvx_<9&aR~w|&2FJb~jvsWnz1oNA$w&qzb$|B~psyfTbF8P5|L*Ue@Y;ie0E{*JFsV0&T9^|cb8sDk7Ul(- zjE9Nfhx#rL<30~3gcHDx59zoVo4)X(zvp4}H+*K_5Qw$!5)UOqKG?#{y*I)<&zq9! zGKXA~R(tCqMa!0j84<=OiYXZ`9@AR{tBAfREcv0hobFx@cN2-rxqhc)4vHEXO;TI_hTu^=QMSmyfOElzN{R(Ywh zoXhStksq*|VTFDmFp}0fJWW|ynWG^P(lEcmGB5;!V~F4xI6_CU{t%#Y&bv^-JAy+A zLPk(a&Zj7_C55#cs|4GRb^Sq|8&<}e$+l_KBk=+wu#@7UT>;?=U%LWAL<&B(FxmNLw~A@T?}^V%rDnQOCrP=?&AFFbE($Sz ztyD!6ri+vl>ky8;lyfK@ z0}*&_2bwk3FutJuQF}d8awv}r?-^zYz`QYz1i=E)2c_YIeKf>6CZ!PQp4lF38)5w( zs}2FeGu6P7^%bt8$7gnEsX6~_tj~xzPLQwqrbyP1;|gZF_jtFhoReyEr=-}rt<8$4 z-C|d&JMGzp=`Kwn{>lRt)-s9gLx3@4k472A2mH;xfN&gUi){KYawBeypG+T+A*FVXc9)q~D!5HY|v z*J!)HK2XmURqC%^Pp$B47$5+`W4*D??sZ>cf5V3s1n(KKa9oFB&>ldO5YvpI6OQP4 zAo`&YNB%zM7(|5s{QzF!v3o@HS{llDJa#~N3||Pmh;>~BB ztyr<5*P^7a`e@Oxl)z%*lTSXeEnBwOPk;JTN8tB$59jIoPgZ8gGAZI>#yQ@@(-!;= zOMDRU`zGJj)zwb%gq0b`WEFzZB04ur8A1>kG`=bR-dIn91iPtrBDD4xrOt{7OgJCC z-^98<);TZu1Am~sh9UI9Ok>r5)X&9&ZxD9=I^S4BY8V4uR{`vU=n zo;?ZEKh_@`{k=#++3YbZ$1l$#1D+8aQ{VH*+#4FR=GzFrhYtcs#fk0;5stQbs0f_- z1@40gBc6JpxZkEvc$eDKAw7=D5{2(CZ=sdZ8iE2&OP3Nw3 zSYCFU6Le#49c%A}z9JJ14A{z*D;;ypzCY0VW(`C5zyA8`_PgKx&PDns&${2|W4#T1 z@MhoipZD_b7OVc_dX9JZV=>hCXMDh~WXypPLz_tqBE|$J8iorTj>YG;ZQC3TO)h(K zOd~Mo-ryMf-&IPJ`SB;8+J{q||nc}2ObvWDC8SJ?D`1P3H6!(6kr&Hqd(^^>JRl82i_e^0`MLhXBcMI8L>u)n=xn395*gle*EfJzjDF{ z#xS7=Kk^JOpzv)2KMkb&8Qlk8XQX})3uBF>9wre21t)Vq@kS~T9%R2Dy1itJO#y
Kvtbw%$MCp612?X9E(SWmG2TUDmibIm0G41u3qEaPiUOc@*mb2A z`R+igb?aP5m$ag?Tp25^_Oh9&GIfjO-mY)bII98Dk|c-pb`X>g=9o=dV+!KMtPF$z zlRcCI!$ceSBS7^9&U?nT&wsT-OLN;u|2 zg=To)lLP^9E``Wue?1GSIe}{%8A1;yViCSM?UVcaW(Lemo;ol|t`s4hYcs5=7gWtR# z3%`{P79Q-OFwA5U!qVVpKl_=p4ue(>GFi~l1hrzEN#l!RiU3#m;QD>ne_xls?q5Fo z(AMv2x6BE@v4fXSS=Yb6XTSXAUnxCPg=^Q>9n3iS{y+n~^UgcH!WR#N!L&7;b$Pd7 z@%;{-^T)w8;_st=tJVZ?gyw;FVVpkw^iw-_?3m+gxQ~ntFxDI|S+c}2%w8bnaiV`t zf8P#%gPl12HTVFp4GUw94gLD{>+QuCUv!N11ALzm{V2a^*|3?2FxG4UYz|0kFi#;u zcv)H5h<=Z-a}fyO-&L->+k6za#6>%WAh=$GcDq9ocLliW*%*jkzVm3Sk;}M1kxnNn zpjw*lC+aDwMl$5nO(fK44SERc`ws!6$smR6*RMNsGQTbd`y`M&gc|F$*Q~r}yrbKq zUbCdS`FeI(MjixG#aJT*CRhptgeN8j(^KwaP9U|1@IX=@mJk9V1O^8I2xrN@MjLb=Pq$<_k|MNO~=dCwf`aZw+^F5RT9RLoX z5BPr%cD@benepD!-#gJ~3jOslpHMs?Xy%sMel_c8iv_hdCi?W*G19CEsl>j zgNK>+rrh!N@o}j)EQ~b+!a#ZHM1KSNxBxPq_waDICUX=ve55^o@xg54Z+-IQN#_T| zq#Y{3A5UMxI`1WU^jbDWi~;N(grGF_T%ir=5fy)^6PUT zh_Eg}8Zb}<9em}LSDYC!_r-!eW^CVlvq_A6mA(A(YgSfP>K+lU?|~pa{MY@Mr^*Z* z;+tTbSPl7f9{zefJ)y2AN-zU|Qi+OqU=`L0ArKD)V(q5`-RJjJ1gFqgq(sCb1#{KG zFgmPf@B;XPm>kfx&}q>otI_>&c-V1tQCE7-MZc4)A63==986vAiB&)PoNxPnef#!N z3XoQ^S^?;G{itA&3J!~vUuj8_3m%K&Kp-8k;3CNf=9sZ#%>0-}-^>{KYv6J;#{2f| zbH2Ppe&;&0_PUQhwf*M{Ewy-+btUCX3V`*X-1dr|vXeKG?c>kC(O7p&J3cFJIv~0) zz8}mJ(r}?k$4}p%kFForS$ zNPx)Q$$2C`UV3!^xeWY>b$eAnc z_QNS5adGUJzhOQ;Dks766&MA^9f^MQJ{I-JM+syPq^}MM>q#I7a+DI#1~b8@o_fj= zO!0PtcG%A z-q0Wb@rJO44`!c8=LaI7qn|_@L?6aIfH?)xF&LsMy1nps2!Rj+Lx%uNHQF{9=FH~>sa{Twb=)P?&EZ@8@dyD=Ujwf(b&) z2#;Zy!CRQIGtVh7-D}sbb@-2Y@0n_@QJ3q%GMM)Z-uE~k4+~?BX$FJ^Qo^v@2>})k z3yu%v+_`fuU=C*Ueo?p!`V&rA4~fU`I~eGMw_7+pf~YuVjuho3+Vt_sE`>*fqLN># zZdW=Ir3vehR9MRJ8D%N9Y*v~>P?(<+U=4`}UA2}x`b|qt&9eg+Hd^B!KeV6y^i7*L zclKTP#PjU1&hS70jrHo)tL^u{|Gf*E1Mv|(rm>#v=M5G|XuR?9D=#mPRW&>pLLh{| z1A+h=H(YR_Ls_FkDXf1OJD3T+Vbs7K{S_?Ga1Hag#@D3>oI`-_uSrQ7$xPx;L{$ct z^PzCRx}bN_K_B(8oP!3S&~}?>1A?qZm)5o}#es?VsnforF|Kz+o~7Sd&~@?>DzuZS zfUFgzsqQ*-$l1zvrwkzHxGTDczBRRWIUnnaNh$WXZ)DrQf7u`fff&sT9ZFN0puFU5 zRysDxURj>u(yT>pj{GH9EWyfP7TJ3dZ2G-5STEKw<3wGUL$uszU_TLqUVWq1j#N&x z^y1alodiP|ga!Ag(@8Qj%wBBAu65guKYVPhEzNEZkN4Tp{eg}rSRVKvrk6hX`A0uJ zPT?FMm{khLygPH2`sZ)?&F!@9sJQLm~eAHh39b} zxDA-H9%#ce(#+@JoaQ|J56jRYFf5FboO-yeQI90;K0AbK#qdW<(F-CpxdkD})U=h&|yddQQDc^xK*;J&`bG*%n5 z6P6GHAq4Ip1TblZp7IRZy|hdlXztkmqe}#LM(DYk`Y!wC`(`_@SSsLMm{JP(7uPNV zu06LT!^%q{sXn(KY_?4E( z1XXd*^NTZVqHsRK_Dy@6?ZkzM%UPr!+@MM-iHY5|RB1z3&Pf-8o#4`%eX_mT^_g1j zdN%Y!n%<#ZuZ*>vqbt<^7G*}cEDO7{S2|@$XA0gLVZL#9OD7wO?#or|7@kQ^a{5Z& z8r#iEMw0*8a1a<4#+pgNCmgJS2LqGCnKNg)&7azyh#&aQu*Ty60k_RZ@AY~y5G4hK1foip zbM~k^EpQ?g^fzCc>i^@lEW22x=;XJ$T>kAU1yHL}dayh(+M}fXe&wkwXNraCIY<+K zaBz&5h7Z(_-iN88tJ{0x(LEsVjEwQ<3IkRLt?XL&2npzb;uq@0a>$`AqB=v znDj00>ORcLgJx1564$O>wLkvxJ^SuxuBDAxYYEBux?iRSw3U!)8O6`o)r$JA%8>Q__RD|1h6RLw82eI3DV2!lV<6gS8zjz3UuAt%A$fjM5aFDr+;& z^q_Hv$F*HJCYEd=6mBUhkcL(K9%(s!U3XD`(0msc$O^6JM2aNo6C^xuYmecptec6) zlCNm#6qwv8>I3H2Xq$Z+u%4zIvr9VA)Rai;Wn)w9?_P^oywMT*mZ&z|Yw=sn(hemr zE6JW#{_s_Dt(B}HLPOAbT_z$pG{qUkkoj+auD3H+JDn-`D#eePJvr5-BZXm)RoG8q zD#5Gl!zi8nUKy)?U+37P8ShCG##{cVLOXQwTdVJ0Ysnd7+`b%vwC@7~5xsZYRqMF9 z*-f4O{TswZe_VzObh9S2T*kA!=^Y0npEg6Wgu>j(FcnItn^ zH^ot)4bXD;RnA}Su#dMj+pN-L`%kZC$)`HmMF&TNPZ3C6@w5f|BCtfeOGY7J%zeOB-$F+%)_7yYEOttQ^#O ze)JwbnEs%#246r!5ZsHln1kSW7;g$pHT1uqn=s#eVioEH=bo=aKRv8?MzGI*dQdm| zn!i8%9v%n`8)MBxK*HxI(eQNt(Qnnm>Cu0a@C}9w0@^QoOW?5g90%Yb>VdrYWa=E! zYc^M`*F2+4WX`3^t$jn9?P`5)%B=iiRhw-P^Nnda$osiP=}HGCQ#IXJ)6gluADJ*q zvYjqu$|qR}tIvMW8I``SN3M>Hza9y}T;qR)881Oc@QuPmi|ZgQu7jvotXN^?<>ij) z<_&^~i{DjM*X`qv*V(>PDV9CqY3p*DY7lr38j<5pX|5A;=3BFbAOHP-{Hy)f|NB3? zlohlSmWK-gKdzY5G45C7F2HC1{{4#X{*9Xx5I_iE%F4=|M%(*idm<u;=RRKC6SlQ%=5a}ZGBaR`C?00F8f)VnC zYfVj!+7q_e_xlgonrD`4FIeTYiGI!dx_y1C35U1ux*kLsJr`YFj{UXh@4FhgeFFO6 zuEMheC-15gyr_CnKkvYQ+)Mv3LFZ9#u9ly%1ol|ldD_EwfqKyecmZRt+2#6R$BKJs z2b!93>JR}_R8;69eK)s=#@W8f8afmyJW~O^5@lX5HGEgo1xu;>(w>@MWN*Ily4=Bv zTpL4uHuquOKveMZ@^a@&)EBc%f9Y$m(Enf=s2^PKt4<6s2b&I$hY}sHiuBqS%&;)~nxxoyXtyyp z>rjvq{I=@k4~0K>N{?i@NdZpw9&5EzmlbhR40S=aqLWLTJ$96|ZTg)eW;;*J`zV>B z`|_x6=9pH22w|2mLE{601SztI@nL;>Q!L&$`du?JB#@Xe$ufRCXkD#Ul4fAL&lY

FS4n9vB4txPq^+wt_$hmthi)<_hy~&LK2rK6p!m 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 literal 0 HcmV?d00001 diff --git a/static/img/img_2.png b/static/img/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fda31da4c49f35d7472ee8ad4a78cce590200668 GIT binary patch literal 121906 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�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 z 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 literal 0 HcmV?d00001 From 684ee925ca212b5a468184bb98da41eeaf0457a4 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 30 Jul 2025 00:30:07 +0530 Subject: [PATCH 04/46] fix: lint --- docs/learn/overview/p2p.md | 51 ++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/docs/learn/overview/p2p.md b/docs/learn/overview/p2p.md index c337b80..589bd2b 100644 --- a/docs/learn/overview/p2p.md +++ b/docs/learn/overview/p2p.md @@ -7,9 +7,10 @@ OptimumP2P is a chain-agnostic data propagation protocol that utilizes Random Li In modern blockchain networks, data propagation represents a critical bottleneck affecting transaction throughput, block finality, and overall network performance. When a validator proposes a new block, that block must reach a supermajority of network participants before consensus can be achieved. Traditional gossip protocols like GossipSub introduce several challenges: -- **High Latency**: Nodes must receive a full message before they can forward it to their peers, leading to cumulative delays across multi-hop paths. -- **Bandwidth Inefficiency**: The same message is often transmitted multiple times over redundant paths, consuming excess bandwidth and increasing operational costs for node operators. -- **Scalability Limits**: As network size and message frequency increase, these protocols can struggle to maintain performance, limiting the practical bounds of block size and block time. + +* **High Latency**: Nodes must receive a full message before they can forward it to their peers, leading to cumulative delays across multi-hop paths. +* **Bandwidth Inefficiency**: The same message is often transmitted multiple times over redundant paths, consuming excess bandwidth and increasing operational costs for node operators. +* **Scalability Limits**: As network size and message frequency increase, these protocols can struggle to maintain performance, limiting the practical bounds of block size and block time. ## How OptimumP2P Works: A Network Coding Approach @@ -21,6 +22,7 @@ OptimumP2P addresses these limitations through RLNC, a technique that enables op The data flow involves three main components: + 1. **Validator Node Integration**: OptimumP2P interfaces directly with a blockchain client to access data, such as newly produced blocks or transactions. 2. **The Optimum Service**: This component is responsible for RLNC encoding. When it receives data, it applies network coding to generate redundant, coded shards. 3. **Network Propagation**: The coded shards are propagated through the OptimumP2P network. A fallback mechanism to standard gossip protocols can be maintained for reliability and interoperability. @@ -37,22 +39,23 @@ RLNC is the core technology that provides OptimumP2P its performance advantages. **Key Principles:** -- **Encoding**: Original data is divided into `k` pieces. These pieces are then used to generate a larger set of `n` coded shards by creating random linear combinations of the original pieces. The coefficients for these combinations are chosen from a finite field. Any equation generated has a high probability (`1 - 1/q`, where `q` is the field size) of being linearly independent, ensuring its utility. -- **Early Forwarding & Composability**: A key feature of RLNC is that nodes do not need to wait to receive all `k` pieces to contribute to the network. As soon as a node receives a shard, it can be combined with other received shards to create and forward a *new, unique* coded shard (a process called recoding). This continuous "mixing" of information allows data to propagate fluidly and rapidly. -- **Decoding**: A receiver only needs to collect *any* `k` linearly independent shards to reconstruct the original message by solving a system of linear equations. This makes the system highly resilient to packet loss, as the specific shards that arrive do not matter, only the total number of unique shards. +* **Encoding**: Original data is divided into `k` pieces. These pieces are then used to generate a larger set of `n` coded shards by creating random linear combinations of the original pieces. The coefficients for these combinations are chosen from a finite field. Any equation generated has a high probability (`1 - 1/q`, where `q` is the field size) of being linearly independent, ensuring its utility. +* **Early Forwarding & Composability**: A key feature of RLNC is that nodes do not need to wait to receive all `k` pieces to contribute to the network. As soon as a node receives a shard, it can be combined with other received shards to create and forward a *new, unique* coded shard (a process called recoding). This continuous "mixing" of information allows data to propagate fluidly and rapidly. +* **Decoding**: A receiver only needs to collect *any* `k` linearly independent shards to reconstruct the original message by solving a system of linear equations. This makes the system highly resilient to packet loss, as the specific shards that arrive do not matter, only the total number of unique shards. This approach offers several advantages: -- **Lower Latency**: Messages are broken into coded shards, which can be forwarded to the next node before the whole message is received. -- **Loss Tolerance**: Messages can be decoded with any combination of shards, as long as a sufficient number reach the destination. -- **Bandwidth Efficiency**: Sharding and recoding reduce the amount of redundant data transmission, lowering overall bandwidth usage. + +* **Lower Latency**: Messages are broken into coded shards, which can be forwarded to the next node before the whole message is received. +* **Loss Tolerance**: Messages can be decoded with any combination of shards, as long as a sufficient number reach the destination. +* **Bandwidth Efficiency**: Sharding and recoding reduce the amount of redundant data transmission, lowering overall bandwidth usage. ### High-Level Architecture OptimumP2P is composed of several components that work together: -- **Gateway Layer**: Provides a standardized API for blockchain clients to interact with the network via HTTP and WebSockets. It handles client connections, topic management, and authentication. -- **P2P Node Network**: Implements the core RLNC protocol using **[libp2p](https://docs.libp2p.io/)**. It manages peer connections, discovery (via DHT), and protocol negotiation. -- **Protocol Abstraction**: A layer that allows for dynamic protocol selection, enabling interoperability with nodes that may not be running OptimumP2P by falling back to standard GossipSub. +* **Gateway Layer**: Provides a standardized API for blockchain clients to interact with the network via HTTP and WebSockets. It handles client connections, topic management, and authentication. +* **P2P Node Network**: Implements the core RLNC protocol using **[libp2p](https://docs.libp2p.io/)**. It manages peer connections, discovery (via DHT), and protocol negotiation. +* **Protocol Abstraction**: A layer that allows for dynamic protocol selection, enabling interoperability with nodes that may not be running OptimumP2P by falling back to standard GossipSub. ### High-Level Integration Model @@ -61,6 +64,7 @@ OptimumP2P is designed to integrate with existing blockchain clients without req ![OptimumP2P Validator Implementation](/static/img/img_2.png) In this model, an **Optimum Relay** process runs alongside the validator's standard Consensus Layer (CL) client. + 1. The relay peers directly with the local CL client. 2. When a proposer needs to publish a new block, its relay forwards the block to the interconnected OptimumP2P network. 3. Other validators on the network subscribe to block topics. Their local relays receive the block from the OptimumP2P network and deliver it to their own CL clients for attestation. @@ -71,33 +75,38 @@ This architecture allows validators to tap into the high-performance OptimumP2P OptimumP2P is designed as a foundational, general-purpose data propagation layer. Its benefits extend across the entire blockchain ecosystem and it can serve as an enhanced networking stack for any blockchain client, such as those used in Ethereum or as a potential alternative to specialized protocols like Solana's Turbine. - - ### For L1/L2 Chains and Node Operators + An efficient propagation layer can lead to several advantages for the core network and its operators. + * **Scalability Improvements**: By addressing propagation bottlenecks, networks can explore opportunities to increase block sizes or shorten block times without negatively impacting decentralization. * **Operational Cost Reduction**: Lower bandwidth requirements can translate to reduced operational costs for node operators, particularly for those in bandwidth-constrained environments. This helps maintain network decentralization by keeping participation accessible. ### For Application Developers and End Users + The performance of the base-layer network directly impacts the applications built on top of it. + * **Enablement of Low-Latency dApps**: A network that supports lower-latency interactions can enable more responsive decentralized applications, including those in gaming or high-frequency DeFi. * **Improved User Experience**: The goal is to improve the end-user experience through the potential for faster transaction confirmations and a more stable gas fee environment resulting from eased network congestion. * **Enhanced Reliability**: A more predictable network can simplify dApp development by reducing the need for complex retry logic to handle network instability. -### Security Model +## Security Model OptimumP2P's security model is built upon the robust foundations of **[libp2p](https://docs.libp2p.io/)**. As such, it inherits a comprehensive suite of security features designed for hostile peer-to-peer environments. For a full overview of these protections, refer to the [libp2p security considerations](https://docs.libp2p.io/concepts/security/security-considerations/). Key inherited security features include: -- **Authenticated and Encrypted Channels**: All peer-to-peer communication is secured using Noise or TLS, preventing eavesdropping and tampering. -- **Sybil and Eclipse Attack Mitigation**: The protocol uses libp2p's peer discovery and management systems, which include defenses against an attacker flooding the network with malicious nodes to gain control or isolate honest peers. -**Network Coding-Specific Security: Pollution Attacks** +* **Authenticated and Encrypted Channels**: All peer-to-peer communication is secured using Noise or TLS, preventing eavesdropping and tampering. +* **Sybil and Eclipse Attack Mitigation**: The protocol uses libp2p's peer discovery and management systems, which include defenses against an attacker flooding the network with malicious nodes to gain control or isolate honest peers. + +### Network Coding-Specific Security: Pollution Attacks The primary security challenge unique to network coding is the risk of **pollution attacks**. In such an attack, a malicious actor injects corrupted or invalid coded shards into the network, with the goal of preventing honest nodes from successfully decoding the original message. OptimumP2P mitigates this risk through a multi-layered approach centered on **source authentication**. -- The original message data is cryptographically hashed to create a unique identifier. -- This identifier, along with the publisher's signature, is bound to the data. -- When a node decodes a message from a set of shards, it can verify the reconstructed data against the publisher's original signature and hash. + +* The original message data is cryptographically hashed to create a unique identifier. +* This identifier, along with the publisher's signature, is bound to the data. +* When a node decodes a message from a set of shards, it can verify the reconstructed data against the publisher's original signature and hash. + If the verification fails, the node knows that at least one of the shards it received was polluted. While identifying the exact malicious shard can be complex, the system can identify the peers who sent the invalid shards and lower their reputation scores, eventually isolating them from the network. This ensures that even though recoding happens at intermediate nodes, the integrity of the data can be verified end-to-end. From 150f3ba967a4b4ff7c333c2961d20867d35244e0 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 30 Jul 2025 14:40:56 +0530 Subject: [PATCH 05/46] feat: add hackathon docs --- .vitepress/config.mts | 74 ++++ docs/hackathon/README.md | 37 ++ docs/hackathon/deployment/p2p-only.md | 182 ++++++++++ docs/hackathon/deployment/p2p-with-gateway.md | 340 ++++++++++++++++++ docs/hackathon/index.md | 44 +++ docs/hackathon/quick-start/first-message.md | 241 +++++++++++++ docs/hackathon/quick-start/installation.md | 137 +++++++ package-lock.json | 18 + package.json | 1 + yarn.lock | 12 + 10 files changed, 1086 insertions(+) create mode 100644 docs/hackathon/README.md create mode 100644 docs/hackathon/deployment/p2p-only.md create mode 100644 docs/hackathon/deployment/p2p-with-gateway.md create mode 100644 docs/hackathon/index.md create mode 100644 docs/hackathon/quick-start/first-message.md create mode 100644 docs/hackathon/quick-start/installation.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 904cbad..7cfad3f 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -183,6 +183,80 @@ function nav() { function sidebarHome() { return [ + { + text: "Hackathon", + collapsed: false, + items: [ + { + text: "Overview", + link: "/docs/hackathon/", + }, + { + text: "Quick Start", + collapsed: true, + items: [ + { + text: "Installation & Setup", + link: "/docs/hackathon/quick-start/installation", + }, + { + text: "First Message Example", + link: "/docs/hackathon/quick-start/first-message", + }, + ], + }, + { + text: "Deployment Options", + collapsed: true, + items: [ + { + text: "P2P Network Only", + link: "/docs/hackathon/deployment/p2p-only", + }, + { + text: "P2P Network with Gateway", + link: "/docs/hackathon/deployment/p2p-with-gateway", + }, + ], + }, + { + text: "Client Development", + collapsed: true, + items: [ + { + text: "WebSocket Client", + link: "/docs/hackathon/clients/websocket", + }, + { + text: "gRPC Stream Client", + link: "/docs/hackathon/clients/grpc", + }, + { + text: "mump2p-cli", + link: "/docs/hackathon/clients/cli", + }, + ], + }, + { + text: "Configuration", + collapsed: true, + items: [ + { + text: "Network Parameters", + link: "/docs/hackathon/configuration/network-params", + }, + { + text: "Docker Environment Variables", + link: "/docs/hackathon/configuration/docker-vars", + }, + { + text: "Performance Tuning", + link: "/docs/hackathon/configuration/tuning", + }, + ], + }, + ], + }, { text: "Learn", collapsed: false, diff --git a/docs/hackathon/README.md b/docs/hackathon/README.md new file mode 100644 index 0000000..1abed42 --- /dev/null +++ b/docs/hackathon/README.md @@ -0,0 +1,37 @@ +# OptimumP2P Hackathon Documentation + +This documentation provides technical guidance for building applications on OptimumP2P, a high-performance peer-to-peer messaging protocol that uses Random Linear Network Coding (RLNC) for efficient message propagation. + +## Documentation Structure + +### Quick Start +- [Installation & Setup](./quick-start/installation.md) +- [First Message Example](./quick-start/first-message.md) + +### Deployment Options +- [P2P Network Only](./deployment/p2p-only.md) - Direct P2P mesh setup +- [P2P Network with Gateway](./deployment/p2p-with-gateway.md) - Gateway-enabled setup for client applications + +### Client Development +- [WebSocket Client](./clients/websocket.md) - Real-time applications using WebSocket API +- [gRPC Stream Client](./clients/grpc.md) - High-performance bidirectional streaming +- [mump2p-cli](./clients/cli.md) - Command-line interface usage + +### Configuration +- [Network Parameters](./configuration/network-params.md) - Mesh topology and RLNC settings +- [Docker Environment Variables](./configuration/docker-vars.md) - Complete environment variable reference +- [Performance Tuning](./configuration/tuning.md) - Optimization guidelines + +## Reference Documentation + +- [OptimumP2P Technical Overview](../learn/overview/p2p.md) +- [libp2p Specifications](https://github.com/libp2p/specs) +- [GossipSub Protocol](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/README.md) + + +## Support + +- [Troubleshooting Guide](./troubleshooting.md) +- [Frequently Asked Questions](./faq.md) + +Begin with the [Installation & Setup](./quick-start/installation.md) guide to start development. \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-only.md b/docs/hackathon/deployment/p2p-only.md new file mode 100644 index 0000000..4193ee6 --- /dev/null +++ b/docs/hackathon/deployment/p2p-only.md @@ -0,0 +1,182 @@ +# P2P Network Only Deployment + +This guide covers deploying a standalone OptimumP2P network without gateway intermediaries. In this configuration, clients connect directly to P2P nodes using gRPC sidecar connections, providing maximum performance and protocol flexibility. + + +### Network Topology + +The P2P network forms a mesh topology where each node maintains connections to a subset of peers based on the configured mesh parameters: + +- **Mesh Target (`OPTIMUM_MESH_TARGET`)**: Ideal number of peers per topic +- **Mesh Range (`OPTIMUM_MESH_MIN` to `OPTIMUM_MESH_MAX`)**: Acceptable peer count bounds +- **Bootstrap Nodes**: Initial discovery points for new nodes joining the network + + +## Deployment Configuration + +```yaml +services: + p2pnode-1: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: + optimum-network: + ipv4_address: 172.28.0.12 + ports: + - "33221:33212" # gRPC sidecar + - "7071:7070" # OptimumP2P + - "9091:9090" # API + volumes: + - ./identity:/identity + + p2pnode-2: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-2 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: + optimum-network: + ipv4_address: 172.28.0.13 + ports: + - "33222:33212" + - "7072:7070" + - "9092:9090" + +networks: + optimum-network: + driver: bridge + ipam: + config: + - subnet: 172.28.0.0/16 +``` + +## Environment Variables + +### Core Configuration +- `NODE_MODE`: Set to `optimum` for RLNC-enhanced protocol or `gossipsub` for standard GossipSub +- `CLUSTER_ID`: Unique identifier for the node +- `LOG_LEVEL`: Logging verbosity (`debug`, `info`, `warn`, `error`) + +### Port Configuration +- `SIDECAR_PORT`: gRPC sidecar port for client connections (default: 33212) +- `API_PORT`: HTTP API port for metrics and status (default: 9090) +- `OPTIMUM_PORT`: P2P protocol port (default: 7070) + +### RLNC Parameters +- `OPTIMUM_MAX_MSG_SIZE`: Maximum message size in bytes (default: 1048576 = 1MB) +- `OPTIMUM_SHARD_FACTOR`: Number of coded shards to generate (default: 4) +- `OPTIMUM_SHARD_MULT`: Redundancy multiplier for shards (default: 1.5) +- `OPTIMUM_THRESHOLD`: Decoding threshold as fraction (default: 0.75) + +### Mesh Topology +- `OPTIMUM_MESH_TARGET`: Target number of peers in mesh (default: 6) +- `OPTIMUM_MESH_MIN`: Minimum peers before grafting (default: 3) +- `OPTIMUM_MESH_MAX`: Maximum peers before pruning (default: 12) + +### Bootstrap Configuration +- `BOOTSTRAP_PEERS`: Comma-separated list of bootstrap peer addresses +- `IDENTITY_DIR`: Directory for storing peer identity keys + +## Starting the Network + +1. Generate peer identity (optional, will auto-generate if not present): +```bash +# Create identity directory +mkdir -p identity + +# Generate peer key +docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key +``` + +2. Set bootstrap peer ID: +```bash +export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest peer-id) +``` + +3. Start the network: +```bash +docker-compose up -d +``` + +4. Verify nodes are running: +```bash +docker-compose ps +docker-compose logs p2pnode-1 +``` + +## Client Connection + +Clients connect directly to P2P nodes via gRPC sidecar: + +```go +conn, err := grpc.Dial("localhost:33221", grpc.WithInsecure()) +if err != nil { + log.Fatal(err) +} +client := pb.NewP2PStreamClient(conn) +``` + +## Network Scaling + +To add more nodes, replicate the service definition with: +- Unique `CLUSTER_ID` +- Unique IP address in the network +- Unique port mappings +- Same `BOOTSTRAP_PEERS` configuration + +## Monitoring + +Access node metrics and status: +- Node 1: http://localhost:9091 +- Node 2: http://localhost:9092 + +## Troubleshooting + +### Peer Discovery Issues +Check bootstrap peer configuration and network connectivity: +```bash +docker-compose exec p2pnode-1 ping p2pnode-2 +docker-compose logs p2pnode-1 | grep "bootstrap" +``` + +### Mesh Formation +Verify peers are discovering each other: +```bash +curl http://localhost:9091/debug/peers +``` + +### Message Flow +Check message propagation in logs: +```bash +docker-compose logs -f | grep "message" +``` \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-with-gateway.md b/docs/hackathon/deployment/p2p-with-gateway.md new file mode 100644 index 0000000..04173c3 --- /dev/null +++ b/docs/hackathon/deployment/p2p-with-gateway.md @@ -0,0 +1,340 @@ +# P2P Network with Gateway Deployment + +This guide covers deploying OptimumP2P with gateway services that provide HTTP/WebSocket/gRPC APIs for client applications. The gateway acts as a bridge between traditional client-server applications and the OptimumP2P network. + + +### Component Responsibilities + +**Gateway Layer:** +- Protocol translation (HTTP/WebSocket/gRPC ↔ libp2p) +- Client session management +- Load balancing across P2P nodes +- Rate limiting and authentication +- API versioning and compatibility + +**P2P Network Layer:** +- RLNC message encoding/decoding +- Mesh topology maintenance +- Peer discovery and routing +- Message propagation via GossipSub +- Network resilience and fault tolerance + + +## Deployment Configuration + +Complete setup with gateways and P2P nodes: + +```yaml +services: + gateway-1: + image: 'getoptimum/gateway:latest' + platform: linux/amd64 + ports: + - "8081:8080" # HTTP/WebSocket + - "50051:50051" # gRPC + environment: + - GATEWAY_PORT=:8080 + - CLUSTER_ID=gateway-1 + - ENABLE_AUTH=false + - LOG_LEVEL=debug + - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 + networks: + optimum-network: + ipv4_address: 172.28.0.10 + depends_on: + - p2pnode-1 + - p2pnode-2 + - p2pnode-3 + - p2pnode-4 + + gateway-2: + image: 'getoptimum/gateway:latest' + platform: linux/amd64 + ports: + - "8082:8080" + - "50052:50051" + environment: + - GATEWAY_PORT=:8080 + - CLUSTER_ID=gateway-2 + - ENABLE_AUTH=false + - LOG_LEVEL=debug + - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 + networks: + optimum-network: + ipv4_address: 172.28.0.11 + depends_on: + - p2pnode-1 + - p2pnode-2 + - p2pnode-3 + - p2pnode-4 + + p2pnode-1: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + volumes: + - ./identity:/identity + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: + optimum-network: + ipv4_address: 172.28.0.12 + ports: + - "33221:33212" + - "7071:7070" + - "9091:9090" + + p2pnode-2: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-2 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: + optimum-network: + ipv4_address: 172.28.0.13 + ports: + - "33222:33212" + - "7072:7070" + - "9092:9090" + + p2pnode-3: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-3 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: + optimum-network: + ipv4_address: 172.28.0.14 + ports: + - "33223:33212" + - "7073:7070" + - "9093:9090" + + p2pnode-4: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-4 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: + optimum-network: + ipv4_address: 172.28.0.15 + ports: + - "33224:33212" + - "7074:7070" + - "9094:9090" + +networks: + optimum-network: + driver: bridge + ipam: + config: + - subnet: 172.28.0.0/16 +``` + +## Gateway Configuration + +### Environment Variables +- `GATEWAY_PORT`: HTTP/WebSocket server port (default: :8080) +- `CLUSTER_ID`: Unique gateway identifier +- `ENABLE_AUTH`: Enable Auth0 authentication (true/false) +- `P2P_NODES`: Comma-separated list of P2P node sidecar addresses +- `LOG_LEVEL`: Logging verbosity + +### Authentication (Optional) +For production deployments, enable authentication: +```yaml +environment: + - ENABLE_AUTH=true + - AUTH0_DOMAIN=your-domain.auth0.com + - AUTH0_AUDIENCE=your-api-audience +``` + +## API Endpoints + +### HTTP REST API +- `POST /publish` - Publish message to topic +- `GET /health` - Gateway health check +- `GET /metrics` - Prometheus metrics + +### WebSocket API +- `ws://localhost:8081/ws` - WebSocket connection for real-time messaging + +### gRPC API +- `localhost:50051` - Bidirectional streaming service + +## Starting the Network + +1. Generate peer identity: +```bash +mkdir -p identity +export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key --output-peer-id) +``` + +2. Start all services: +```bash +docker-compose up -d +``` + +3. Verify services: +```bash +docker-compose ps +curl http://localhost:8081/health +``` + +## Client Examples + +### HTTP REST +```bash +curl -X POST http://localhost:8081/publish \ + -H "Content-Type: application/json" \ + -d '{"topic": "test", "data": "Hello OptimumP2P"}' +``` + +### WebSocket (JavaScript) +```javascript +const ws = new WebSocket('ws://localhost:8081/ws'); +ws.onopen = () => { + ws.send(JSON.stringify({ + type: 'subscribe', + topic: 'test' + })); +}; +``` + +### gRPC (Go) +```go +conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) +client := pb.NewGatewayStreamClient(conn) +stream, err := client.Stream(context.Background()) +``` + +## Load Balancing + +Deploy multiple gateways for high availability: +- Gateway 1: `localhost:8081` (HTTP), `localhost:50051` (gRPC) +- Gateway 2: `localhost:8082` (HTTP), `localhost:50052` (gRPC) + +Use a load balancer (nginx, HAProxy) to distribute traffic: +```nginx +upstream gateway_backend { + server localhost:8081; + server localhost:8082; +} + +server { + listen 80; + location / { + proxy_pass http://gateway_backend; + } +} +``` + +## Monitoring + +### Gateway Metrics +- Gateway 1: http://localhost:8081/metrics +- Gateway 2: http://localhost:8082/metrics + +### P2P Node Status +- Node 1: http://localhost:9091 +- Node 2: http://localhost:9092 +- Node 3: http://localhost:9093 +- Node 4: http://localhost:9094 + +## Scaling Considerations + +### Gateway Scaling +Gateways are stateless and can be scaled horizontally: +- Add more gateway instances +- Use connection pooling for P2P node connections +- Implement circuit breakers for fault tolerance + +### P2P Network Scaling +Scale the P2P network by adding more nodes: +- Maintain OPTIMUM_MESH_TARGET ratio to network size +- Consider network topology and latency +- Monitor mesh formation and message propagation + +## Troubleshooting + +### Gateway Connection Issues +```bash +# Check gateway logs +docker-compose logs gateway-1 + +# Test P2P node connectivity +docker-compose exec gateway-1 nc -zv p2pnode-1 33212 +``` + +### Message Delivery Issues +```bash +# Check message flow +docker-compose logs -f | grep -E "(publish|subscribe|message)" + +# Verify P2P mesh status +curl http://localhost:9091/debug/peers +``` + +### Performance Issues +```bash +# Monitor gateway metrics +curl http://localhost:8081/metrics + +# Check resource usage +docker stats +``` \ No newline at end of file diff --git a/docs/hackathon/index.md b/docs/hackathon/index.md new file mode 100644 index 0000000..81270da --- /dev/null +++ b/docs/hackathon/index.md @@ -0,0 +1,44 @@ +# OptimumP2P Hackathon Documentation + +This documentation provides technical guidance for building applications on OptimumP2P, a high-performance peer-to-peer messaging protocol that uses Random Linear Network Coding (RLNC) for efficient message propagation. + +## Documentation Structure + +### Quick Start +- [Installation & Setup](./quick-start/installation.md) +- [First Message Example](./quick-start/first-message.md) + +### Deployment Options +- [P2P Network Only](./deployment/p2p-only.md) - Direct P2P mesh setup +- [P2P Network with Gateway](./deployment/p2p-with-gateway.md) - Gateway-enabled setup for client applications + +### Client Development +- [WebSocket Client](./clients/websocket.md) - Real-time applications using WebSocket API +- [gRPC Stream Client](./clients/grpc.md) - High-performance bidirectional streaming +- [mump2p-cli](./clients/cli.md) - Command-line interface usage + +### Configuration +- [Network Parameters](./configuration/network-params.md) - Mesh topology and RLNC settings +- [Docker Environment Variables](./configuration/docker-vars.md) - Complete environment variable reference +- [Performance Tuning](./configuration/tuning.md) - Optimization guidelines + +## Technical Features + +- RLNC-enhanced message propagation with reduced bandwidth usage +- libp2p-based networking with built-in security and peer discovery +- Dual access modes: direct P2P and gateway-mediated +- Multiple client interfaces: WebSocket, gRPC, CLI +- Configurable network parameters for different deployment scenarios + +## Reference Documentation + +- [libp2p Specifications](https://github.com/libp2p/specs) +- [GossipSub Protocol](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/README.md) +- [OptimumP2P Technical Overview](../learn/overview/p2p.md) + +## Support + +- [Troubleshooting Guide](./troubleshooting.md) +- [Frequently Asked Questions](./faq.md) + +Begin with the [Installation & Setup](./quick-start/installation.md) guide to start development. \ No newline at end of file diff --git a/docs/hackathon/quick-start/first-message.md b/docs/hackathon/quick-start/first-message.md new file mode 100644 index 0000000..dde4cbf --- /dev/null +++ b/docs/hackathon/quick-start/first-message.md @@ -0,0 +1,241 @@ +# Your First Message + +This tutorial demonstrates how to send your first message through OptimumP2P using the gateway setup. We'll use the actual configuration and scripts from the development setup guide. + +## Prerequisites + +- Docker and Docker Compose installed +- Basic familiarity with terminal/command line +- Text editor for creating configuration files + +## Step 1: Set Up the Network + +Create a working directory and use the provided docker-compose configuration: + +```bash +mkdir optimump2p-test +cd optimump2p-test +``` + +Download the complete setup: +```bash +# Clone the development setup repository +git clone https://github.com/getoptimum/optimum-dev-setup-guide.git +cd optimum-dev-setup-guide +``` + +Or create your own `docker-compose.yml` using the configuration from the [P2P Network with Gateway](../deployment/p2p-with-gateway.md) guide. + +## Step 2: Start the Network + +Generate the required peer identity: + +```bash +# Create identity directory if using local setup +mkdir -p identity + +# Set the bootstrap peer ID environment variable +export BOOTSTRAP_PEER_ID=12D3KooWExample # This will be generated automatically +``` + +Start all services: + +```bash +docker-compose up -d +``` + +Verify the services are running: + +```bash +docker-compose ps +``` + +You should see containers for: +- gateway-1 (port 8081) +- gateway-2 (port 8082) +- p2pnode-1, p2pnode-2, p2pnode-3, p2pnode-4 + +## Step 3: Test Gateway Connectivity + +The gateway provides REST API endpoints for publishing and subscribing. Test connectivity: + +```bash +# Test gateway-1 +curl -I http://localhost:8081 + +# Test gateway-2 +curl -I http://localhost:8082 +``` + +## Step 4: Build the Gateway Client + +The repository includes a Go client for interacting with the gateway: + +```bash +cd grpc_gateway_client +go build -o gateway-client ./gateway_client.go +``` + +## Step 5: Subscribe to Messages + +In one terminal window, start a subscriber: + +```bash +# Subscribe to topic "demo" with threshold 0.7 +./script/gateway_client.sh subscribe demo 0.7 +``` + +The subscriber will: +1. Register with the gateway via REST API (`/api/subscribe`) +2. Open a gRPC stream to receive messages +3. Display received messages in the format: `[RECEIVED] Topic: | Message: ` + +## Step 6: Publish Messages + +In another terminal window, publish messages: + +```bash +# Publish 5 messages to topic "demo" with threshold 0.5 +./script/gateway_client.sh publish demo 0.5 5 +``` + +The publisher will: +1. Send messages via REST API (`/api/publish`) +2. Display each published message in the format: `[PUBLISH] Message: ` + +## Step 7: Alternative REST API Usage + +You can also interact directly with the REST API using curl: + +### Subscribe via REST (requires separate gRPC stream for receiving) +```bash +curl -X POST http://localhost:8081/api/subscribe \ + -H "Content-Type: application/json" \ + -d '{ + "client_id": "test_client_001", + "topic": "demo", + "threshold": 0.7 + }' +``` + +### Publish via REST +```bash +curl -X POST http://localhost:8081/api/publish \ + -H "Content-Type: application/json" \ + -d '{ + "client_id": "test_client_001", + "topic": "demo", + "message": "Hello from REST API" + }' +``` + +## Step 8: Multiple Topics + +Test topic isolation by using different topic names: + +```bash +# Terminal 1: Subscribe to "weather" +./script/gateway_client.sh subscribe weather 0.7 + +# Terminal 2: Subscribe to "news" +./script/gateway_client.sh subscribe news 0.7 + +# Terminal 3: Publish to "weather" +./script/gateway_client.sh publish weather 0.5 3 + +# Terminal 4: Publish to "news" +./script/gateway_client.sh publish news 0.5 3 +``` + +Each subscriber will only receive messages from their subscribed topic. + +## Step 9: Load Testing + +Test network performance with higher message volumes: + +```bash +# High-frequency publishing (100 messages with 100ms delay) +./gateway-client -topic=performance -threshold=0.5 -count=100 -delay=100ms + +# Stress test (1000 messages) +./gateway-client -topic=stress -threshold=0.5 -count=1000 -delay=10ms +``` + +## Understanding the Parameters + +### Threshold +The threshold parameter (0.0 to 1.0) controls RLNC decoding: +- Lower values: Messages decoded with fewer shards (faster, less reliable) +- Higher values: Messages require more shards (slower, more reliable) +- Typical range: 0.5 to 0.8 + +### Client ID +Each client needs a unique identifier for the gateway to track subscriptions and route messages correctly. + +### Topic Names +- Case-sensitive strings +- No special characters recommended +- Use descriptive names (e.g., "chat", "alerts", "data-feed") + +## Monitoring and Debugging + +### View logs +```bash +# Gateway logs +docker-compose logs -f gateway-1 + +# P2P node logs +docker-compose logs -f p2pnode-1 + +# All logs +docker-compose logs -f +``` + +### Check network connectivity +```bash +# Test P2P node connectivity +docker-compose exec gateway-1 nc -zv p2pnode-1 33212 + +# View container network +docker network inspect optimum-dev-setup-guide_optimum-network +``` + +## Cleanup + +Stop and remove all containers: + +```bash +docker-compose down + +# Remove volumes and images (optional) +docker-compose down -v --rmi all +``` + +## Next Steps + +Now that you've successfully sent messages through OptimumP2P: + +1. **Build custom clients**: Explore the [Client Development](../clients/) guides +2. **Optimize configuration**: Learn about [Network Parameters](../configuration/network-params.md) +3. **Deploy to production**: Review [Performance Tuning](../configuration/tuning.md) + +## Troubleshooting + +### Build failures +- Ensure Go is installed: `go version` +- Check module dependencies: `go mod tidy` + +### Connection issues +- Verify Docker containers are running: `docker-compose ps` +- Check port availability: `netstat -an | grep 8081` +- Review firewall settings + +### Message delivery issues +- Verify topic names match exactly +- Check threshold values are between 0.0 and 1.0 +- Review gateway and P2P node logs for errors + +### Performance issues +- Monitor container resources: `docker stats` +- Adjust message delay parameters +- Check network bandwidth and latency \ No newline at end of file diff --git a/docs/hackathon/quick-start/installation.md b/docs/hackathon/quick-start/installation.md new file mode 100644 index 0000000..95b0d07 --- /dev/null +++ b/docs/hackathon/quick-start/installation.md @@ -0,0 +1,137 @@ +# Installation & Setup + +This guide will help you install and set up OptimumP2P on your computer. We'll explain each step clearly, so don't worry if you're new to some of these tools. + +## What You'll Need + +Before we start, you need these programs on your computer: + +### 1. Docker +Docker is like a virtual container that runs applications in an isolated environment. Think of it as a box where we put our OptimumP2P network so it doesn't interfere with other programs on your computer. + +**Install Docker:** +- **Windows/Mac**: Download Docker Desktop from [docker.com](https://www.docker.com/products/docker-desktop/) +- **Linux**: Follow the instructions for your distribution on [docs.docker.com](https://docs.docker.com/engine/install/) + +**How to check if Docker is installed:** +Open your terminal (Command Prompt on Windows, Terminal on Mac/Linux) and type: +```bash +docker --version +``` +You should see something like `Docker version 20.10.x` + +### 2. Docker Compose +Docker Compose helps us run multiple Docker containers together. It usually comes with Docker Desktop, but let's verify: + +```bash +docker-compose --version +``` +You should see something like `docker-compose version 1.29.x` + +### 3. Git (Optional but recommended) +Git helps you download and manage code. Most computers have it pre-installed. + +```bash +git --version +``` + +## Getting the Code + +You have two options to get the OptimumP2P setup files: + +### Option 1: Download from this documentation +Create a new folder on your computer and save the docker-compose.yml files from the [Deployment Options](../deployment/) section. + +### Option 2: Clone the development setup repository +```bash +git clone https://github.com/getoptimum/optimum-dev-setup-guide.git +cd optimum-dev-setup-guide +``` + +## Choose Your Setup + +OptimumP2P can run in two ways: + +1. **P2P Network Only** - Direct peer-to-peer communication (more advanced) +2. **P2P Network with Gateway** - Includes a web-friendly layer (recommended for beginners) + +For your first time, we recommend starting with the **Gateway setup** because: +- It's easier to test and see results +- You can use simple web tools to send messages +- It includes helpful monitoring tools + +## Quick Test + +Let's do a simple test to make sure everything works: + +1. Create a new folder called `optimum-test`: +```bash +mkdir optimum-test +cd optimum-test +``` + +2. Create a simple test file: +```bash +echo "version: '3.8' +services: + test: + image: hello-world" > docker-compose.yml +``` + +3. Run the test: +```bash +docker-compose up +``` + +If you see "Hello from Docker!" message, everything is working correctly. + +4. Clean up: +```bash +docker-compose down +``` + +## What's Next? + +Now that you have everything installed: + +1. **Learn the basics**: Read [Core Concepts](./concepts.md) to understand how OptimumP2P works +2. **Try it out**: Follow [First Message Example](./first-message.md) to send your first message +3. **Build something**: Check out [Client Development](../clients/) to create your own application + +## Troubleshooting + +### "Docker command not found" +- Make sure Docker is installed and running +- On Windows/Mac, start Docker Desktop application +- You might need to restart your terminal after installation + +### "Permission denied" on Linux +Add your user to the docker group: +```bash +sudo usermod -aG docker $USER +``` +Then log out and log back in. + +### "Port already in use" +If you see port conflicts, either: +- Stop other programs using those ports +- Change the port numbers in the docker-compose.yml file + +### Still having issues? +- Check Docker's own troubleshooting guide +- Make sure you have enough disk space (at least 2GB free) +- Restart your computer and try again + +## System Requirements + +**Minimum:** +- 4GB RAM +- 2GB free disk space +- Internet connection for downloading Docker images + +**Recommended:** +- 8GB RAM +- 5GB free disk space +- Stable internet connection + +You're now ready to start your OptimumP2P journey! \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e798920..8b10eab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ }, "devDependencies": { "@eslint/js": "^9.22.0", + "@types/node": "^24.1.0", "@typescript-eslint/eslint-plugin": "^8.26.1", "@typescript-eslint/parser": "^8.26.1", "eslint": "^9.22.0", @@ -2000,6 +2001,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/node": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", + "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, "node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", @@ -6533,6 +6544,13 @@ "dev": true, "license": "MIT" }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "dev": true, + "license": "MIT" + }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", diff --git a/package.json b/package.json index f2211cb..f66540c 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "devDependencies": { "@eslint/js": "^9.22.0", + "@types/node": "^24.1.0", "@typescript-eslint/eslint-plugin": "^8.26.1", "@typescript-eslint/parser": "^8.26.1", "eslint": "^9.22.0", diff --git a/yarn.lock b/yarn.lock index fc4f605..28ddef9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -718,6 +718,13 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== +"@types/node@^18.0.0 || >=20.0.0", "@types/node@^24.1.0": + version "24.1.0" + resolved "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz" + integrity sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w== + dependencies: + undici-types "~7.8.0" + "@types/unist@*", "@types/unist@^2.0.0": version "2.0.11" resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" @@ -3028,6 +3035,11 @@ uc.micro@^2.0.0, uc.micro@^2.1.0: resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== +undici-types@~7.8.0: + version "7.8.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz" + integrity sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== + unist-util-is@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" From 6f43b48c6100cb758cc415df33a047d99e494897 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 30 Jul 2025 14:46:16 +0530 Subject: [PATCH 06/46] fix: link: --- .vitepress/config.mts | 2 +- docs/hackathon/overview.md | 44 ++++++++++++++++++++++++++++++++++++++ index.md | 16 +++++++------- 3 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 docs/hackathon/overview.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 7cfad3f..c0eeef1 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -189,7 +189,7 @@ function sidebarHome() { items: [ { text: "Overview", - link: "/docs/hackathon/", + link: "/docs/hackathon/overview", }, { text: "Quick Start", diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md new file mode 100644 index 0000000..81270da --- /dev/null +++ b/docs/hackathon/overview.md @@ -0,0 +1,44 @@ +# OptimumP2P Hackathon Documentation + +This documentation provides technical guidance for building applications on OptimumP2P, a high-performance peer-to-peer messaging protocol that uses Random Linear Network Coding (RLNC) for efficient message propagation. + +## Documentation Structure + +### Quick Start +- [Installation & Setup](./quick-start/installation.md) +- [First Message Example](./quick-start/first-message.md) + +### Deployment Options +- [P2P Network Only](./deployment/p2p-only.md) - Direct P2P mesh setup +- [P2P Network with Gateway](./deployment/p2p-with-gateway.md) - Gateway-enabled setup for client applications + +### Client Development +- [WebSocket Client](./clients/websocket.md) - Real-time applications using WebSocket API +- [gRPC Stream Client](./clients/grpc.md) - High-performance bidirectional streaming +- [mump2p-cli](./clients/cli.md) - Command-line interface usage + +### Configuration +- [Network Parameters](./configuration/network-params.md) - Mesh topology and RLNC settings +- [Docker Environment Variables](./configuration/docker-vars.md) - Complete environment variable reference +- [Performance Tuning](./configuration/tuning.md) - Optimization guidelines + +## Technical Features + +- RLNC-enhanced message propagation with reduced bandwidth usage +- libp2p-based networking with built-in security and peer discovery +- Dual access modes: direct P2P and gateway-mediated +- Multiple client interfaces: WebSocket, gRPC, CLI +- Configurable network parameters for different deployment scenarios + +## Reference Documentation + +- [libp2p Specifications](https://github.com/libp2p/specs) +- [GossipSub Protocol](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/README.md) +- [OptimumP2P Technical Overview](../learn/overview/p2p.md) + +## Support + +- [Troubleshooting Guide](./troubleshooting.md) +- [Frequently Asked Questions](./faq.md) + +Begin with the [Installation & Setup](./quick-start/installation.md) guide to start development. \ No newline at end of file diff --git a/index.md b/index.md index ba25200..7c26c88 100644 --- a/index.md +++ b/index.md @@ -12,21 +12,21 @@ hero: alt: Optimum actions: - theme: brand - text: Get Started - link: /docs/how-to-guides/overview + text: Hackathon Docs + link: /docs/hackathon/overview - theme: alt - text: Introduction + text: Get Started link: /docs/learn/overview/intro features: - - title: Overview + - title: Hackathon Documentation + details: Complete guide for building applications on OptimumP2P with deployment options, client examples, and configuration. + link: /docs/hackathon/overview + icon: 🚀 + - title: Learn Optimum details: Learn more about Optimum, the various components involved, and how it could benefit your project. link: /docs/learn/overview/intro icon: 🎓 - - title: How-to Guides (Under Construction 🚧) - details: Explore step-by-step guides for running and integrating with various types of nodes, how to read and write data, and how to gossip. - # link: /docs/how-to-guides/overview - icon: ⚙️ - title: Research details: Access resources for understanding the inner workings of Optimum and the research behind the technology. link: /docs/research/overview From 5a082282273a76b04ee1d8461e3f55fd51bde07b Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 30 Jul 2025 14:47:39 +0530 Subject: [PATCH 07/46] fix: minor change --- docs/hackathon/overview.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index 81270da..7ba77c4 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -32,9 +32,10 @@ This documentation provides technical guidance for building applications on Opti ## Reference Documentation +- [OptimumP2P Technical Overview](../learn/overview/p2p.md) - [libp2p Specifications](https://github.com/libp2p/specs) - [GossipSub Protocol](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/README.md) -- [OptimumP2P Technical Overview](../learn/overview/p2p.md) + ## Support From b20d2b0375e322532fc50e650ebdabcc1b11572a Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 30 Jul 2025 15:58:23 +0530 Subject: [PATCH 08/46] fix: add more details --- docs/hackathon/deployment/p2p-only.md | 139 +++++++++++-- docs/hackathon/deployment/p2p-with-gateway.md | 193 ++++++++++++++---- 2 files changed, 271 insertions(+), 61 deletions(-) diff --git a/docs/hackathon/deployment/p2p-only.md b/docs/hackathon/deployment/p2p-only.md index 4193ee6..2aef29d 100644 --- a/docs/hackathon/deployment/p2p-only.md +++ b/docs/hackathon/deployment/p2p-only.md @@ -83,29 +83,130 @@ networks: ## Environment Variables ### Core Configuration -- `NODE_MODE`: Set to `optimum` for RLNC-enhanced protocol or `gossipsub` for standard GossipSub -- `CLUSTER_ID`: Unique identifier for the node -- `LOG_LEVEL`: Logging verbosity (`debug`, `info`, `warn`, `error`) + +- **`NODE_MODE`**: P2P protocol implementation mode + - Purpose: Selects the underlying pub/sub protocol + - Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) + - Default: `optimum` + - Usage: Use `optimum` for better performance with RLNC coding + - Note: All nodes in network should use same mode for compatibility + +- **`CLUSTER_ID`**: Unique identifier for each P2P node + - Purpose: Distinguishes nodes in logs, metrics, and network topology + - Usage: Should be unique across all P2P nodes in deployment + - Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. + - Required: Yes, no default value + +- **`LOG_LEVEL`**: Logging verbosity level + - Purpose: Controls the amount and detail of log output + - Values: `debug`, `info`, `warn`, `error` + - Default: `info` + - Usage Guide: + - `debug`: Most verbose, includes detailed P2P protocol events (development) + - `info`: Standard level with operational information + - `warn`: Only warnings and errors (quiet operation) + - `error`: Only error messages (minimal logging) ### Port Configuration -- `SIDECAR_PORT`: gRPC sidecar port for client connections (default: 33212) -- `API_PORT`: HTTP API port for metrics and status (default: 9090) -- `OPTIMUM_PORT`: P2P protocol port (default: 7070) + +- **`SIDECAR_PORT`**: gRPC bidirectional communication port + - Purpose: Port where clients connect directly to interact with P2P node + - Default: `33212` + - Range: Any available port + - Usage: Must be accessible from client applications for direct P2P access + - Network: Used for client-to-node gRPC communication + +- **`API_PORT`**: HTTP monitoring and management API port + - Purpose: Exposes REST endpoints for health checks, node state, and metrics + - Default: `9090` + - Range: Any available port + - Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` + - Usage: Used for operational monitoring and debugging + +- **`OPTIMUM_PORT`**: P2P protocol communication port + - Purpose: Port for peer-to-peer communication between nodes + - Default: `7070` + - Range: Any available port + - Usage: Must be accessible between all P2P nodes in the mesh + - Network: Used for inter-node OptimumP2P protocol communication ### RLNC Parameters -- `OPTIMUM_MAX_MSG_SIZE`: Maximum message size in bytes (default: 1048576 = 1MB) -- `OPTIMUM_SHARD_FACTOR`: Number of coded shards to generate (default: 4) -- `OPTIMUM_SHARD_MULT`: Redundancy multiplier for shards (default: 1.5) -- `OPTIMUM_THRESHOLD`: Decoding threshold as fraction (default: 0.75) - -### Mesh Topology -- `OPTIMUM_MESH_TARGET`: Target number of peers in mesh (default: 6) -- `OPTIMUM_MESH_MIN`: Minimum peers before grafting (default: 3) -- `OPTIMUM_MESH_MAX`: Maximum peers before pruning (default: 12) - -### Bootstrap Configuration -- `BOOTSTRAP_PEERS`: Comma-separated list of bootstrap peer addresses -- `IDENTITY_DIR`: Directory for storing peer identity keys + +- **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes + - Purpose: Limits individual message size to prevent memory issues + - Default: `1048576` (1MB) + - Usage: Larger values allow bigger payloads but use more memory/bandwidth + + +- **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message + - Purpose: Controls how many pieces each message is split into for RLNC + - Default: `4` + - Impact: Higher values increase redundancy and fault tolerance but use more bandwidth + - Note: Must be non-zero to enable RLNC functionality + +- **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier + - Purpose: Controls redundancy factor for error recovery + - Default: `1.5` + - Impact: Higher values improve error recovery but increase bandwidth usage + - Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) + + +- **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio + - Purpose: Fraction of shards needed before forwarding or decoding message + - Default: `0.75` (75%) + - Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) + - Impact: Critical for network performance tuning + - Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency + +### Mesh Topology Configuration + +- **`OPTIMUM_MESH_TARGET`**: Target number of peer connections + - Purpose: Ideal number of peers each node connects to in the mesh + - Default: `6` + - Range: 3-50 (typically 4-12 for most deployments) + - Impact: Higher values increase redundancy and fault tolerance but use more resources + + +- **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections + - Purpose: Minimum connections before attempting to add more peers + - Default: `4` + - Note: Should be less than MESH_TARGET + - Impact: Lower values reduce fault tolerance, higher values increase resource usage + - Usage: Prevents network partitioning by maintaining minimum connectivity + +- **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections + - Purpose: Maximum connections before pruning excess peers + - Default: `12` + - Note: Should be greater than MESH_TARGET + - Impact: Prevents resource exhaustion while maintaining network connectivity + - Usage: Sets upper bound to control memory and bandwidth usage + +### Bootstrap and Identity Configuration + +- **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses + - Purpose: List of known peers for joining the mesh network + - Format: `/ip4//tcp//p2p/` + - Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` + - Usage: New nodes use these to discover and join the network + - Multiple: Can specify multiple peers separated by commas + - Note: At least one bootstrap peer must be accessible for network joining + +- **`IDENTITY_DIR`**: Node cryptographic identity directory + - Purpose: Directory containing node's P2P identity key (p2p.key) + - Default: `/identity` + - Usage: Only needed for bootstrap nodes, other nodes auto-generate identity + - Security: Contains private key material, should be properly secured + - Permissions: Ensure proper file permissions (600) for security + +### Configuration Notes + +All parameter values can be adjusted based on specific use case requirements. TWhen modifying parameters: + +- Higher OPTIMUM_THRESHOLD values improve reliability but increase latency +- Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources +- Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage +- OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET +- OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET ## Starting the Network diff --git a/docs/hackathon/deployment/p2p-with-gateway.md b/docs/hackathon/deployment/p2p-with-gateway.md index 04173c3..be10a2c 100644 --- a/docs/hackathon/deployment/p2p-with-gateway.md +++ b/docs/hackathon/deployment/p2p-with-gateway.md @@ -186,14 +186,160 @@ networks: - subnet: 172.28.0.0/16 ``` +## P2P Node Environment Variables + +### Core P2P Configuration + +- **`CLUSTER_ID`**: Unique identifier for each P2P node + - Purpose: Distinguishes nodes in logs, metrics, and network topology + - Usage: Should be unique across all P2P nodes in deployment + - Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. + - Required: Yes, no default value + +- **`NODE_MODE`**: P2P protocol implementation mode + - Purpose: Selects the underlying pub/sub protocol + - Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) + - Default: `optimum` + - Usage: Use `optimum` for better performance with RLNC coding + - Note: All nodes in network should use same mode for compatibility + +- **`SIDECAR_PORT`**: gRPC bidirectional communication port + - Purpose: Port where gateways and clients connect to interact with P2P node + - Default: `33212` + - Range: Any available port (1024-65535) + - Usage: Must be accessible from gateway containers for internal communication + - Network: Used for internal container-to-container communication + +- **`API_PORT`**: HTTP monitoring and management API port + - Purpose: Exposes REST endpoints for health checks, node state, and metrics + - Default: `8081` for gateway, `9090` for P2P nodes (varies by component) + - Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` + - Usage: Used for operational monitoring and debugging + +### Network Discovery Configuration + +- **`IDENTITY_DIR`**: Node cryptographic identity directory + - Purpose: Directory containing node's P2P identity key (p2p.key) + - Default: `/identity` + - Usage: Only needed for bootstrap nodes, other nodes auto-generate identity + - Security: Contains private key material, should be properly secured + +- **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses + - Purpose: List of known peers for joining the mesh network + - Format: `/ip4//tcp//p2p/` + - Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` + - Usage: New nodes use these to discover and join the network + - Multiple: Can specify multiple peers separated by commas + +### OptimumP2P Protocol Configuration + +- **`OPTIMUM_PORT`**: P2P protocol communication port + - Purpose: Port for peer-to-peer communication between nodes + - Default: `7070` + - Range: Any available port, commonly 7070-7080 + - Usage: Must be accessible between all P2P nodes in the mesh + - Network: Used for inter-node OptimumP2P protocol communication + +- **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes + - Purpose: Limits individual message size to prevent memory issues + - Default: `1048576` (1MB) + - Usage: Larger values allow bigger payloads but use more memory/bandwidth + +### RLNC (Random Linear Network Coding) Configuration + +- **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message + - Purpose: Controls how many pieces each message is split into for RLNC + - Default: `4` + - Impact: Higher values increase redundancy and fault tolerance but use more bandwidth + - Note: Must be non-zero to enable RLNC functionality + +- **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier + - Purpose: Controls redundancy factor for error recovery + - Default: `1.5` + - Impact: Higher values improve error recovery but increase bandwidth usage + - Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) + +- **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio + - Purpose: Fraction of shards needed before forwarding or decoding message + - Default: `0.75` (75%) + - Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) + - Impact: Critical for network performance tuning + - Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency + +### Mesh Topology Configuration + +- **`OPTIMUM_MESH_TARGET`**: Target number of peer connections + - Purpose: Ideal number of peers each node connects to in the mesh + - Default: `6` + - Impact: Higher values increase redundancy and fault tolerance but use more resources + - Scaling: Adjust based on network size and reliability requirements + +- **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections + - Purpose: Minimum connections before attempting to add more peers + - Default: `4` + - Note: Should be less than `MESH_TARGET` + - Impact: Lower values reduce fault tolerance, higher values increase resource usage + - Usage: Prevents network partitioning by maintaining minimum connectivity + +- **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections + - Purpose: Maximum connections before pruning excess peers + - Default: `12` + - Note: Should be greater than `MESH_TARGET` + - Impact: Prevents resource exhaustion while maintaining network connectivity + - Usage: Sets upper bound to control memory and bandwidth usage + +### Configuration Notes + +All parameter values can be adjusted based on specific use case requirements. When modifying parameters: + +- Higher OPTIMUM_THRESHOLD values improve reliability but increase latency +- Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources +- Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage +- OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET +- OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET + ## Gateway Configuration ### Environment Variables -- `GATEWAY_PORT`: HTTP/WebSocket server port (default: :8080) -- `CLUSTER_ID`: Unique gateway identifier -- `ENABLE_AUTH`: Enable Auth0 authentication (true/false) -- `P2P_NODES`: Comma-separated list of P2P node sidecar addresses -- `LOG_LEVEL`: Logging verbosity + +- **`GATEWAY_PORT`**: HTTP/WebSocket server port (default: `:8080`) + - Purpose: Defines the port where the gateway listens for client connections + - Usage: Internal container port for REST API and WebSocket connections + - Example: `:8080`, `:3000`, `:8081` + - Note: External port mapping is configured separately in docker-compose ports section + +- **`CLUSTER_ID`**: Unique gateway identifier + - Purpose: Distinguishes between multiple gateway instances in logs, metrics, and monitoring + - Usage: Should be unique across all gateway instances in your deployment + - Format: Alphanumeric string, no spaces + - Example: `gateway-1`, `gateway-primary`, `gateway-us-east` + - Required: Yes, no default value + +- **`ENABLE_AUTH`**: Enable Auth0 JWT authentication (true/false) + - Purpose: Controls whether API requests require JWT authentication + - Usage: Set to `false` for development/testing, `true` for production + - Values: `true` (requires valid JWT tokens) or `false` (open access) + - Default: `false` + - Note: When `true`, requires additional Auth0 configuration (AUTH0_DOMAIN, AUTH0_AUDIENCE) + +- **`P2P_NODES`**: Comma-separated list of P2P node gRPC sidecar addresses + - Purpose: Defines which P2P nodes the gateway can connect to for message routing + - Format: `hostname:port,hostname:port,...` + - Usage: Gateway load-balances requests across these nodes for high availability + - Port: Should match SIDECAR_PORT of P2P nodes (typically 33212) + - Example: `p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212` + - Behavior: Gateway attempts to connect to all listed nodes and routes to healthy ones + +- **`LOG_LEVEL`**: Logging verbosity level + - Purpose: Controls the amount and detail of log output + - Values: `debug`, `info`, `warn`, `error` + - Default: `info` + - Usage Guide: + - `debug`: Most verbose, includes request/response details, connection events (development) + - `info`: Standard production level with operational information + - `warn`: Only warnings and errors (quiet production) + - `error`: Only error messages (minimal logging) + - Performance: Higher verbosity may impact performance and storage ### Authentication (Optional) For production deployments, enable authentication: @@ -263,27 +409,6 @@ client := pb.NewGatewayStreamClient(conn) stream, err := client.Stream(context.Background()) ``` -## Load Balancing - -Deploy multiple gateways for high availability: -- Gateway 1: `localhost:8081` (HTTP), `localhost:50051` (gRPC) -- Gateway 2: `localhost:8082` (HTTP), `localhost:50052` (gRPC) - -Use a load balancer (nginx, HAProxy) to distribute traffic: -```nginx -upstream gateway_backend { - server localhost:8081; - server localhost:8082; -} - -server { - listen 80; - location / { - proxy_pass http://gateway_backend; - } -} -``` - ## Monitoring ### Gateway Metrics @@ -298,13 +423,6 @@ server { ## Scaling Considerations -### Gateway Scaling -Gateways are stateless and can be scaled horizontally: -- Add more gateway instances -- Use connection pooling for P2P node connections -- Implement circuit breakers for fault tolerance - -### P2P Network Scaling Scale the P2P network by adding more nodes: - Maintain OPTIMUM_MESH_TARGET ratio to network size - Consider network topology and latency @@ -329,12 +447,3 @@ docker-compose logs -f | grep -E "(publish|subscribe|message)" # Verify P2P mesh status curl http://localhost:9091/debug/peers ``` - -### Performance Issues -```bash -# Monitor gateway metrics -curl http://localhost:8081/metrics - -# Check resource usage -docker stats -``` \ No newline at end of file From 8dd859cf53fffda5788704eb6ce76d00585d5698 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 30 Jul 2025 16:13:01 +0530 Subject: [PATCH 09/46] Add GossipSub configuration documentation --- .vitepress/config.mts | 4 + docs/hackathon/configuration/gossipsub.md | 124 ++++++++++++++++++ docs/hackathon/deployment/p2p-only.md | 8 +- docs/hackathon/deployment/p2p-with-gateway.md | 6 + docs/hackathon/overview.md | 4 +- 5 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 docs/hackathon/configuration/gossipsub.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index c0eeef1..0a0adc3 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -241,6 +241,10 @@ function sidebarHome() { text: "Configuration", collapsed: true, items: [ + { + text: "GossipSub Configuration", + link: "/docs/hackathon/configuration/gossipsub", + }, { text: "Network Parameters", link: "/docs/hackathon/configuration/network-params", diff --git a/docs/hackathon/configuration/gossipsub.md b/docs/hackathon/configuration/gossipsub.md new file mode 100644 index 0000000..8363e85 --- /dev/null +++ b/docs/hackathon/configuration/gossipsub.md @@ -0,0 +1,124 @@ +# GossipSub Configuration + +Understanding GossipSub configuration is essential for optimizing your P2P network performance. This page explains the core GossipSub parameters and how to configure them in Optimum P2P. + +## What is GossipSub? + +GossipSub is a pubsub protocol designed for decentralized networks that builds on the concept of a "mesh" - a subset of peers that directly exchange messages, plus "gossip" to peers outside the mesh about available messages. + +### Key Concepts + +- **Mesh**: Direct connections between peers for message forwarding +- **Gossip**: Metadata exchange about available messages with non-mesh peers +- **Fanout**: Temporary connections for publishing when not subscribed to a topic +- **Degree**: The number of peer connections each node maintains + +## Core GossipSub Parameters + +Based on the [libp2p GossipSub v1.0 specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md#parameters), here are the fundamental parameters: + +### Network Topology Parameters + +| Parameter | Purpose | Default | Description | +|-----------|---------|---------|-------------| +| `D` | Desired mesh degree | 6 | Target number of peers in topic mesh | +| `D_low` | Lower bound for mesh degree | 4 | Minimum connections before adding peers | +| `D_high` | Upper bound for mesh degree | 12 | Maximum connections before pruning peers | +| `D_lazy` | Gossip emission degree | 6 | Number of peers for gossip emission | + +### Timing Parameters + +| Parameter | Purpose | Default | Description | +|-----------|---------|---------|-------------| +| `heartbeat_interval` | Mesh maintenance frequency | 1 second | How often to run maintenance | +| `fanout_ttl` | Fanout topic lifetime | 60 seconds | TTL for non-subscribed topic state | +| `seen_ttl` | Message deduplication cache | 2 minutes | How long to remember seen messages | + +### Message Cache Parameters + +| Parameter | Purpose | Default | Description | +|-----------|---------|---------|-------------| +| `mcache_len` | Message history windows | 5 | Number of history windows to keep | +| `mcache_gossip` | Gossip history windows | 3 | Windows to use for gossip emission | + +## Optimum P2P GossipSub Configuration + +Optimum P2P implements GossipSub with configurable parameters through environment variables: + +### Environment Variables + +- **`GOSSIPSUB_PORT`**: Port for GossipSub protocol communication + - Purpose: Network port for GossipSub peer-to-peer communication + - Default: `6060` + - Usage: Internal P2P networking, separate from API ports + - Example: `GOSSIPSUB_PORT=6060` + +- **`GOSSIPSUB_MAX_MSG_SIZE`**: Maximum message size in bytes + - Purpose: Limits individual message size to prevent memory issues + - Default: `1048576` (1MB) + - Usage: Larger values allow bigger payloads but use more memory + - Example: `GOSSIPSUB_MAX_MSG_SIZE=1048576` + +- **`GOSSIPSUB_MESH_TARGET`**: Target number of mesh connections + - Purpose: Ideal number of direct peer connections (corresponds to `D`) + - Default: `6` + - Impact: Higher values increase redundancy but use more bandwidth + - Example: `GOSSIPSUB_MESH_TARGET=6` + +- **`GOSSIPSUB_MESH_MIN`**: Minimum mesh connections + - Purpose: Lower threshold before attempting to add peers (corresponds to `D_low`) + - Default: `4` + - Note: Should be less than `GOSSIPSUB_MESH_TARGET` + - Example: `GOSSIPSUB_MESH_MIN=4` + +- **`GOSSIPSUB_MESH_MAX`**: Maximum mesh connections + - Purpose: Upper threshold before pruning excess peers (corresponds to `D_high`) + - Default: `12` + - Note: Should be greater than `GOSSIPSUB_MESH_TARGET` + - Example: `GOSSIPSUB_MESH_MAX=12` + +### Configuration Example + +```yaml +# docker-compose.yml +services: + p2pnode-1: + environment: + - GOSSIPSUB_PORT=6060 + - GOSSIPSUB_MAX_MSG_SIZE=1048576 + - GOSSIPSUB_MESH_TARGET=6 + - GOSSIPSUB_MESH_MIN=4 + - GOSSIPSUB_MESH_MAX=12 +``` + +## GossipSub vs Optimum Protocol + +Optimum P2P runs two protocols simultaneously: + +1. **Standard GossipSub**: For baseline pub/sub functionality +2. **Optimum Protocol**: Enhanced with RLNC (Random Linear Network Coding) + +Both protocols have their own configuration parameters: + +| Aspect | GossipSub | Optimum | +|--------|-----------|---------| +| Purpose | Standard pub/sub mesh | RLNC-enhanced messaging | +| Port | `GOSSIPSUB_PORT` | `OPTIMUM_PORT` | +| Mesh Target | `GOSSIPSUB_MESH_TARGET` | `OPTIMUM_MESH_TARGET` | +| Message Size | `GOSSIPSUB_MAX_MSG_SIZE` | `OPTIMUM_MAX_MSG_SIZE` | + +### Control Messages + +GossipSub uses four types of control messages: + +- **GRAFT**: Add peer to mesh (invite to join topic mesh) +- **PRUNE**: Remove peer from mesh (remove from topic mesh) +- **IHAVE**: Announce available messages (gossip metadata) +- **IWANT**: Request specific messages (response to IHAVE) + + +## References + +- [libp2p GossipSub v1.0 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md) +- [libp2p PubSub Interface](https://github.com/libp2p/specs/blob/master/pubsub/README.md) +- [Optimum P2P Configuration Guide](/docs/hackathon/deployment/p2p-with-gateway.md#p2p-node-configuration) \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-only.md b/docs/hackathon/deployment/p2p-only.md index 2aef29d..f506a1b 100644 --- a/docs/hackathon/deployment/p2p-only.md +++ b/docs/hackathon/deployment/p2p-only.md @@ -280,4 +280,10 @@ curl http://localhost:9091/debug/peers Check message propagation in logs: ```bash docker-compose logs -f | grep "message" -``` \ No newline at end of file +``` + +## See Also + +- [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters +- [P2P with Gateway Deployment](/docs/hackathon/deployment/p2p-with-gateway.md) - Alternative deployment with gateway layer +- [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-with-gateway.md b/docs/hackathon/deployment/p2p-with-gateway.md index be10a2c..69de61b 100644 --- a/docs/hackathon/deployment/p2p-with-gateway.md +++ b/docs/hackathon/deployment/p2p-with-gateway.md @@ -447,3 +447,9 @@ docker-compose logs -f | grep -E "(publish|subscribe|message)" # Verify P2P mesh status curl http://localhost:9091/debug/peers ``` + +## See Also + +- [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters +- [P2P-Only Deployment](/docs/hackathon/deployment/p2p-only.md) - Alternative deployment without gateways +- [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index 7ba77c4..7e66e63 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -18,6 +18,7 @@ This documentation provides technical guidance for building applications on Opti - [mump2p-cli](./clients/cli.md) - Command-line interface usage ### Configuration +- [GossipSub Configuration](./configuration/gossipsub.md) - Understanding and configuring the underlying pub/sub protocol - [Network Parameters](./configuration/network-params.md) - Mesh topology and RLNC settings - [Docker Environment Variables](./configuration/docker-vars.md) - Complete environment variable reference - [Performance Tuning](./configuration/tuning.md) - Optimization guidelines @@ -34,7 +35,8 @@ This documentation provides technical guidance for building applications on Opti - [OptimumP2P Technical Overview](../learn/overview/p2p.md) - [libp2p Specifications](https://github.com/libp2p/specs) -- [GossipSub Protocol](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/README.md) +- [GossipSub v1.0 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md) +- [libp2p PubSub Interface](https://github.com/libp2p/specs/blob/master/pubsub/README.md) ## Support From a5c097ba3cbff24f18f48a4e9f2d0083f11e8731 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 30 Jul 2025 17:34:40 +0530 Subject: [PATCH 10/46] fix: docker version --- docs/hackathon/quick-start/installation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/hackathon/quick-start/installation.md b/docs/hackathon/quick-start/installation.md index 95b0d07..363c6f6 100644 --- a/docs/hackathon/quick-start/installation.md +++ b/docs/hackathon/quick-start/installation.md @@ -18,7 +18,7 @@ Open your terminal (Command Prompt on Windows, Terminal on Mac/Linux) and type: ```bash docker --version ``` -You should see something like `Docker version 20.10.x` + ### 2. Docker Compose Docker Compose helps us run multiple Docker containers together. It usually comes with Docker Desktop, but let's verify: @@ -26,7 +26,7 @@ Docker Compose helps us run multiple Docker containers together. It usually come ```bash docker-compose --version ``` -You should see something like `docker-compose version 1.29.x` + ### 3. Git (Optional but recommended) Git helps you download and manage code. Most computers have it pre-installed. From db37b9a4e7136aa3cb99ff89241ad4ec7a744d28 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Fri, 1 Aug 2025 15:54:41 +0530 Subject: [PATCH 11/46] docs: Improve hackathon documentation structure and content --- .vitepress/config.mts | 16 +- docs/hackathon/README.md | 37 --- docs/hackathon/configuration/optimump2p.md | 246 ++++++++++++++++++++ docs/hackathon/index.md | 44 ---- docs/hackathon/overview.md | 86 ++++--- docs/hackathon/quick-start/first-message.md | 4 +- docs/hackathon/quick-start/installation.md | 42 ---- 7 files changed, 305 insertions(+), 170 deletions(-) delete mode 100644 docs/hackathon/README.md create mode 100644 docs/hackathon/configuration/optimump2p.md delete mode 100644 docs/hackathon/index.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 0a0adc3..5963ddd 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -242,20 +242,12 @@ function sidebarHome() { collapsed: true, items: [ { - text: "GossipSub Configuration", - link: "/docs/hackathon/configuration/gossipsub", - }, - { - text: "Network Parameters", - link: "/docs/hackathon/configuration/network-params", + text: "OptimumP2P Configuration", + link: "/docs/hackathon/configuration/optimump2p", }, { - text: "Docker Environment Variables", - link: "/docs/hackathon/configuration/docker-vars", - }, - { - text: "Performance Tuning", - link: "/docs/hackathon/configuration/tuning", + text: "GossipSub Configuration", + link: "/docs/hackathon/configuration/gossipsub", }, ], }, diff --git a/docs/hackathon/README.md b/docs/hackathon/README.md deleted file mode 100644 index 1abed42..0000000 --- a/docs/hackathon/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# OptimumP2P Hackathon Documentation - -This documentation provides technical guidance for building applications on OptimumP2P, a high-performance peer-to-peer messaging protocol that uses Random Linear Network Coding (RLNC) for efficient message propagation. - -## Documentation Structure - -### Quick Start -- [Installation & Setup](./quick-start/installation.md) -- [First Message Example](./quick-start/first-message.md) - -### Deployment Options -- [P2P Network Only](./deployment/p2p-only.md) - Direct P2P mesh setup -- [P2P Network with Gateway](./deployment/p2p-with-gateway.md) - Gateway-enabled setup for client applications - -### Client Development -- [WebSocket Client](./clients/websocket.md) - Real-time applications using WebSocket API -- [gRPC Stream Client](./clients/grpc.md) - High-performance bidirectional streaming -- [mump2p-cli](./clients/cli.md) - Command-line interface usage - -### Configuration -- [Network Parameters](./configuration/network-params.md) - Mesh topology and RLNC settings -- [Docker Environment Variables](./configuration/docker-vars.md) - Complete environment variable reference -- [Performance Tuning](./configuration/tuning.md) - Optimization guidelines - -## Reference Documentation - -- [OptimumP2P Technical Overview](../learn/overview/p2p.md) -- [libp2p Specifications](https://github.com/libp2p/specs) -- [GossipSub Protocol](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/README.md) - - -## Support - -- [Troubleshooting Guide](./troubleshooting.md) -- [Frequently Asked Questions](./faq.md) - -Begin with the [Installation & Setup](./quick-start/installation.md) guide to start development. \ No newline at end of file diff --git a/docs/hackathon/configuration/optimump2p.md b/docs/hackathon/configuration/optimump2p.md new file mode 100644 index 0000000..0400543 --- /dev/null +++ b/docs/hackathon/configuration/optimump2p.md @@ -0,0 +1,246 @@ +# OptimumP2P Configuration + +This page covers all OptimumP2P-specific configuration parameters, their impact on network performance, and how to configure them for different deployment scenarios. + +## Configuration Mapping + +OptimumP2P configuration can be set via YAML config files or Docker environment variables. The following tables map the configuration fields to their corresponding Docker environment variables: + +### RLNC Core Parameters + +| Config Field | Environment Variable | Default | Description | +|--------------|---------------------|---------|-------------| +| `rlnc_shard_factor` | `OPTIMUM_SHARD_FACTOR` | `4` | Number of coded shards per message | +| `publisher_shard_multiplier` | `OPTIMUM_SHARD_MULT` | `1.5` | Coded shard multiplier for publishing | +| `forward_shard_threshold` | `OPTIMUM_THRESHOLD` | `0.75` | Fraction needed before forwarding | + +### Mesh Topology Parameters + +| Config Field | Environment Variable | Default | Description | +|--------------|---------------------|---------|-------------| +| `mesh_degree_target` | `OPTIMUM_MESH_TARGET` | `6` | Target peer connections | +| `mesh_degree_min` | `OPTIMUM_MESH_MIN` | `3` | Min before grafting | +| `mesh_degree_max` | `OPTIMUM_MESH_MAX` | `12` | Max before pruning | + +### Protocol Selection + +| Config Field | Environment Variable | Default | Description | +|--------------|---------------------|---------|-------------| +| `enable_optimum_p2p` | `NODE_MODE=optimum` | `true` | Enable RLNC protocol | +| `enable_gossipsub` | `NODE_MODE=gossipsub` | `false` | Enable GossipSub baseline | + +### Message and Network Settings + +| Config Field | Environment Variable | Default | Description | +|--------------|---------------------|---------|-------------| +| `random_message_size_bytes` | `OPTIMUM_MAX_MSG_SIZE` | `1048576` | Max message size (1MB) | +| `app_port` | `API_PORT` | `9090` | HTTP API port | + +## RLNC Parameter Details + +### Shard Factor (coded shards) + +**Parameter**: `OPTIMUM_SHARD_FACTOR` +**Config Field**: `rlnc_shard_factor` +**Default**: `4` + +Controls how many coded shards each message is divided into for network coding. This is the fundamental parameter that determines RLNC granularity. + +**Technical Impact**: +- **Higher values**: More coded shards provide better redundancy and fault tolerance but increase computational overhead +- **Lower values**: Fewer coded shards reduce processing time and bandwidth usage but may reduce fault tolerance +- **Network effect**: Directly affects the minimum number of coded shards needed for message reconstruction + +### Publisher Shard Multiplier + +**Parameter**: `OPTIMUM_SHARD_MULT` +**Config Field**: `publisher_shard_multiplier` +**Default**: `1.5` + +Controls redundancy when publishing messages. Total coded shards created = `rlnc_shard_factor × publisher_shard_multiplier`. + +**Technical Impact**: +- **Higher values**: More initial coded shards improve delivery guarantees but increase bandwidth usage +- **Lower values**: Fewer coded shards reduce network load but may impact reliability in lossy networks + +### Forward Shard Threshold + +**Parameter**: `OPTIMUM_THRESHOLD` +**Config Field**: `forward_shard_threshold` +**Default**: `0.75` + +Determines when nodes forward received coded shards. Nodes forward when they have more than `rlnc_shard_factor × threshold` coded shards. + +**Technical Impact**: +- **Higher values** (0.8-0.9): More reliable forwarding, increased latency +- **Lower values** (0.5-0.6): Faster propagation, reduced latency, potential reliability trade-offs + +## Docker Configuration Examples + +### OptimumP2P Mode (Enhanced) +```yaml +environment: + - NODE_MODE=optimum + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 +``` + +### GossipSub Mode (Baseline) +```yaml +environment: + - NODE_MODE=gossipsub + - GOSSIPSUB_MESH_TARGET=6 + - GOSSIPSUB_MESH_MIN=4 + - GOSSIPSUB_MESH_MAX=12 +``` + +## Performance Tuning + +### High Throughput Setup +Optimized for maximum message throughput: +```yaml +- OPTIMUM_SHARD_FACTOR=8 +- OPTIMUM_SHARD_MULT=2.0 +- OPTIMUM_THRESHOLD=0.5 +- OPTIMUM_MESH_TARGET=8 +``` + +### Low Latency Setup +Optimized for minimum delivery latency: +```yaml +- OPTIMUM_SHARD_FACTOR=4 +- OPTIMUM_SHARD_MULT=1.2 +- OPTIMUM_THRESHOLD=0.6 +- OPTIMUM_MESH_TARGET=6 +``` + +### High Reliability Setup +Optimized for maximum fault tolerance: +```yaml +- OPTIMUM_SHARD_FACTOR=16 +- OPTIMUM_SHARD_MULT=2.5 +- OPTIMUM_THRESHOLD=0.8 +- OPTIMUM_MESH_TARGET=10 +``` + +## Configuration File Format + +Sample YAML configuration matching the actual config structure: + +```yaml +# === General App Settings === +app_port: 23422 +cluster_id: "production_cluster" +file_storage_directory: /tmp +silent_mode_enabled: false + +# === Protocol Settings === +enable_gossipsub: false +enable_optimum_p2p: true + +# === PubSub Mesh Settings === +mesh_degree_target: 6 +mesh_degree_min: 5 +mesh_degree_max: 12 +rlnc_shard_factor: 32 # number of coded shards each message is divided into + +# === Message Generation === +random_message_size_bytes: 3145728 # 3MB +publisher_shard_multiplier: 1.5 # coded shards multiplier for publishing +forward_shard_threshold: 0.75 # forward threshold for coded shards + +# === Bootstrap Nodes === +bootstrap_nodes_optimum_p2p: + - /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample + +bootstrap_nodes_gossipsub: + - /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample +``` + +## Protocol Mode Switching + +OptimumP2P supports running both protocols for comparison: + +**OptimumP2P Mode** (`NODE_MODE=optimum`): +- Uses RLNC with coded shards for enhanced propagation +- Provides early forwarding capabilities +- Better bandwidth efficiency through network coding +- Enhanced fault tolerance via coded shard redundancy + +**GossipSub Mode** (`NODE_MODE=gossipsub`): +- Standard libp2p GossipSub implementation +- Direct message forwarding without coding +- Lower computational overhead +- Baseline for performance comparison + +## Monitoring Configuration + +Verify your configuration is applied correctly: + +```bash +# Check applied configuration +curl http://localhost:9090/config + +# Monitor mesh formation and peer connections +curl http://localhost:9090/debug/peers + +# Check protocol mode in logs +docker logs p2pnode-1 | grep -E "(optimum|gossipsub|coded.*shard)" + +# Monitor coded shard processing +docker logs p2pnode-1 | grep -E "(shard|forward|decode)" +``` + +## Configuration Constraints + +**Enforced by code**: +- `mesh_degree_min <= mesh_degree_target <= mesh_degree_max` +- `random_message_size_bytes > 0` +- `cluster_id` must not be empty or "sample_cluster" + +**Recommended best practices**: +- `forward_shard_threshold` between 0.0 and 1.0 (values outside this range may cause unexpected behavior) +- `rlnc_shard_factor > 0` (value of 0 disables RLNC functionality) +- `publisher_shard_multiplier >= 1.0` (values < 1.0 reduce redundancy) + +## Complete Docker Compose Example + +```yaml +services: + p2pnode-1: + image: getoptimum/p2pnode:latest + environment: + # Protocol selection + - NODE_MODE=optimum + - CLUSTER_ID=p2pnode-1 + + # RLNC coded shard parameters + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + + # Mesh topology + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + + # Network settings + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - SIDECAR_PORT=33212 + - API_PORT=9090 + + # Bootstrap configuration + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} +``` + +## See Also + +- **[GossipSub Configuration](./gossipsub.md)** - Standard protocol parameters for comparison +- **[P2P-Only Deployment](../deployment/p2p-only.md)** - Complete setup with configuration +- **[Gateway + P2P Deployment](../deployment/p2p-with-gateway.md)** - Full stack configuration +- **[OptimumP2P Technical Overview](../../learn/overview/p2p.md)** - Protocol fundamentals and RLNC details \ No newline at end of file diff --git a/docs/hackathon/index.md b/docs/hackathon/index.md deleted file mode 100644 index 81270da..0000000 --- a/docs/hackathon/index.md +++ /dev/null @@ -1,44 +0,0 @@ -# OptimumP2P Hackathon Documentation - -This documentation provides technical guidance for building applications on OptimumP2P, a high-performance peer-to-peer messaging protocol that uses Random Linear Network Coding (RLNC) for efficient message propagation. - -## Documentation Structure - -### Quick Start -- [Installation & Setup](./quick-start/installation.md) -- [First Message Example](./quick-start/first-message.md) - -### Deployment Options -- [P2P Network Only](./deployment/p2p-only.md) - Direct P2P mesh setup -- [P2P Network with Gateway](./deployment/p2p-with-gateway.md) - Gateway-enabled setup for client applications - -### Client Development -- [WebSocket Client](./clients/websocket.md) - Real-time applications using WebSocket API -- [gRPC Stream Client](./clients/grpc.md) - High-performance bidirectional streaming -- [mump2p-cli](./clients/cli.md) - Command-line interface usage - -### Configuration -- [Network Parameters](./configuration/network-params.md) - Mesh topology and RLNC settings -- [Docker Environment Variables](./configuration/docker-vars.md) - Complete environment variable reference -- [Performance Tuning](./configuration/tuning.md) - Optimization guidelines - -## Technical Features - -- RLNC-enhanced message propagation with reduced bandwidth usage -- libp2p-based networking with built-in security and peer discovery -- Dual access modes: direct P2P and gateway-mediated -- Multiple client interfaces: WebSocket, gRPC, CLI -- Configurable network parameters for different deployment scenarios - -## Reference Documentation - -- [libp2p Specifications](https://github.com/libp2p/specs) -- [GossipSub Protocol](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/README.md) -- [OptimumP2P Technical Overview](../learn/overview/p2p.md) - -## Support - -- [Troubleshooting Guide](./troubleshooting.md) -- [Frequently Asked Questions](./faq.md) - -Begin with the [Installation & Setup](./quick-start/installation.md) guide to start development. \ No newline at end of file diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index 7e66e63..8e00202 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -1,47 +1,67 @@ -# OptimumP2P Hackathon Documentation +# OptimumP2P Hackathon Guide -This documentation provides technical guidance for building applications on OptimumP2P, a high-performance peer-to-peer messaging protocol that uses Random Linear Network Coding (RLNC) for efficient message propagation. +Welcome to the OptimumP2P hackathon documentation. This guide provides everything you need to deploy, configure, and integrate OptimumP2P - a novel RLNC-enhanced gossip algorithm for high-performance peer-to-peer networks. -## Documentation Structure +## What is OptimumP2P? -### Quick Start -- [Installation & Setup](./quick-start/installation.md) -- [First Message Example](./quick-start/first-message.md) +OptimumP2P is a novel gossip algorithm that uses [Random Linear Network Coding (RLNC)](https://x.com/get_optimum/status/1891520664726802439) to enhance traditional gossip protocols like [GossipSub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub). For a comprehensive technical overview, see **[OptimumP2P Technical Overview](../learn/overview/p2p.md)**. -### Deployment Options -- [P2P Network Only](./deployment/p2p-only.md) - Direct P2P mesh setup -- [P2P Network with Gateway](./deployment/p2p-with-gateway.md) - Gateway-enabled setup for client applications +## Quick Start -### Client Development -- [WebSocket Client](./clients/websocket.md) - Real-time applications using WebSocket API -- [gRPC Stream Client](./clients/grpc.md) - High-performance bidirectional streaming -- [mump2p-cli](./clients/cli.md) - Command-line interface usage +Get OptimumP2P running in under 5 minutes: -### Configuration -- [GossipSub Configuration](./configuration/gossipsub.md) - Understanding and configuring the underlying pub/sub protocol -- [Network Parameters](./configuration/network-params.md) - Mesh topology and RLNC settings -- [Docker Environment Variables](./configuration/docker-vars.md) - Complete environment variable reference -- [Performance Tuning](./configuration/tuning.md) - Optimization guidelines +1. **[Installation](./quick-start/installation.md)** - Set up Docker and dependencies +2. **[First Message](./quick-start/first-message.md)** - Publish and receive your first message -## Technical Features +## Deployment Options -- RLNC-enhanced message propagation with reduced bandwidth usage -- libp2p-based networking with built-in security and peer discovery -- Dual access modes: direct P2P and gateway-mediated -- Multiple client interfaces: WebSocket, gRPC, CLI -- Configurable network parameters for different deployment scenarios +Choose your deployment strategy: -## Reference Documentation +### P2P Network Only +- **[P2P-Only Deployment](./deployment/p2p-only.md)** - Deploy just the P2P nodes for direct integration -- [OptimumP2P Technical Overview](../learn/overview/p2p.md) -- [libp2p Specifications](https://github.com/libp2p/specs) -- [GossipSub v1.0 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md) -- [libp2p PubSub Interface](https://github.com/libp2p/specs/blob/master/pubsub/README.md) +### Gateway + P2P Network +- **[Gateway + P2P Deployment](./deployment/p2p-with-gateway.md)** - Full stack with REST/WebSocket APIs +## Client Integration -## Support +Connect to OptimumP2P using various client methods: -- [Troubleshooting Guide](./troubleshooting.md) -- [Frequently Asked Questions](./faq.md) +- **[mump2p-cli](./clients/)** - Command-line client for testing and automation +- **[gRPC Clients](./clients/)** - Direct gRPC integration examples +- **[REST/WebSocket APIs](./clients/)** - Gateway-based client integration -Begin with the [Installation & Setup](./quick-start/installation.md) guide to start development. \ No newline at end of file +## Configuration + +Fine-tune OptimumP2P for your use case: + +- **[OptimumP2P Configuration](./configuration/optimump2p.md)** - RLNC parameters, mesh topology, and performance tuning +- **[GossipSub Configuration](./configuration/gossipsub.md)** - Standard GossipSub parameters for comparison + +## Performance & Comparison + +Benchmark and compare OptimumP2P: + +- **[Metrics Collection](./clients/)** - Understanding performance metrics +- **[OptimumP2P vs GossipSub](./clients/)** - Performance comparison methodology + +## Docker Images Used + +The hackathon uses these pre-built Docker images: + +- **`getoptimum/p2pnode:latest`** - Core P2P node with OptimumP2P protocol +- **`getoptimum/gateway:latest`** - Gateway service for client APIs + +Both images support protocol switching: +- `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) +- `NODE_MODE=gossipsub` - Standard GossipSub for comparison + +## Architecture Deep Dive + +For developers and integrators: + +- **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** - Complete technical specification + +--- + +**Ready to get started?** Begin with **[Installation](./quick-start/installation.md)** or dive into the **[Technical Overview](../learn/overview/p2p.md)**. \ No newline at end of file diff --git a/docs/hackathon/quick-start/first-message.md b/docs/hackathon/quick-start/first-message.md index dde4cbf..e7974ea 100644 --- a/docs/hackathon/quick-start/first-message.md +++ b/docs/hackathon/quick-start/first-message.md @@ -216,8 +216,8 @@ docker-compose down -v --rmi all Now that you've successfully sent messages through OptimumP2P: 1. **Build custom clients**: Explore the [Client Development](../clients/) guides -2. **Optimize configuration**: Learn about [Network Parameters](../configuration/network-params.md) -3. **Deploy to production**: Review [Performance Tuning](../configuration/tuning.md) +2. **Optimize configuration**: Learn about [OptimumP2P Configuration](../configuration/optimump2p.md) +3. **Compare protocols**: Review [GossipSub Configuration](../configuration/gossipsub.md) ## Troubleshooting diff --git a/docs/hackathon/quick-start/installation.md b/docs/hackathon/quick-start/installation.md index 363c6f6..181978f 100644 --- a/docs/hackathon/quick-start/installation.md +++ b/docs/hackathon/quick-start/installation.md @@ -48,48 +48,6 @@ git clone https://github.com/getoptimum/optimum-dev-setup-guide.git cd optimum-dev-setup-guide ``` -## Choose Your Setup - -OptimumP2P can run in two ways: - -1. **P2P Network Only** - Direct peer-to-peer communication (more advanced) -2. **P2P Network with Gateway** - Includes a web-friendly layer (recommended for beginners) - -For your first time, we recommend starting with the **Gateway setup** because: -- It's easier to test and see results -- You can use simple web tools to send messages -- It includes helpful monitoring tools - -## Quick Test - -Let's do a simple test to make sure everything works: - -1. Create a new folder called `optimum-test`: -```bash -mkdir optimum-test -cd optimum-test -``` - -2. Create a simple test file: -```bash -echo "version: '3.8' -services: - test: - image: hello-world" > docker-compose.yml -``` - -3. Run the test: -```bash -docker-compose up -``` - -If you see "Hello from Docker!" message, everything is working correctly. - -4. Clean up: -```bash -docker-compose down -``` - ## What's Next? Now that you have everything installed: From a3c62e8dde9523ccbbd65e52db2e4776c0dfca41 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Fri, 1 Aug 2025 16:04:21 +0530 Subject: [PATCH 12/46] fix:lint --- docs/hackathon/configuration/gossipsub.md | 127 ++- docs/hackathon/configuration/optimump2p.md | 225 +++-- docs/hackathon/deployment/p2p-only.md | 466 +++++++---- docs/hackathon/deployment/p2p-with-gateway.md | 776 ++++++++++++------ docs/hackathon/overview.md | 41 +- docs/hackathon/quick-start/first-message.md | 138 +++- docs/hackathon/quick-start/installation.md | 75 +- 7 files changed, 1271 insertions(+), 577 deletions(-) diff --git a/docs/hackathon/configuration/gossipsub.md b/docs/hackathon/configuration/gossipsub.md index 8363e85..94c73ff 100644 --- a/docs/hackathon/configuration/gossipsub.md +++ b/docs/hackathon/configuration/gossipsub.md @@ -8,10 +8,13 @@ GossipSub is a pubsub protocol designed for decentralized networks that builds o ### Key Concepts -- **Mesh**: Direct connections between peers for message forwarding -- **Gossip**: Metadata exchange about available messages with non-mesh peers -- **Fanout**: Temporary connections for publishing when not subscribed to a topic -- **Degree**: The number of peer connections each node maintains +* **Mesh**: Direct connections between peers for message forwarding + +* **Gossip**: Metadata exchange about available messages with non-mesh peers + +* **Fanout**: Temporary connections for publishing when not subscribed to a topic + +* **Degree**: The number of peer connections each node maintains ## Core GossipSub Parameters @@ -47,48 +50,76 @@ Optimum P2P implements GossipSub with configurable parameters through environmen ### Environment Variables -- **`GOSSIPSUB_PORT`**: Port for GossipSub protocol communication - - Purpose: Network port for GossipSub peer-to-peer communication - - Default: `6060` - - Usage: Internal P2P networking, separate from API ports - - Example: `GOSSIPSUB_PORT=6060` - -- **`GOSSIPSUB_MAX_MSG_SIZE`**: Maximum message size in bytes - - Purpose: Limits individual message size to prevent memory issues - - Default: `1048576` (1MB) - - Usage: Larger values allow bigger payloads but use more memory - - Example: `GOSSIPSUB_MAX_MSG_SIZE=1048576` - -- **`GOSSIPSUB_MESH_TARGET`**: Target number of mesh connections - - Purpose: Ideal number of direct peer connections (corresponds to `D`) - - Default: `6` - - Impact: Higher values increase redundancy but use more bandwidth - - Example: `GOSSIPSUB_MESH_TARGET=6` - -- **`GOSSIPSUB_MESH_MIN`**: Minimum mesh connections - - Purpose: Lower threshold before attempting to add peers (corresponds to `D_low`) - - Default: `4` - - Note: Should be less than `GOSSIPSUB_MESH_TARGET` - - Example: `GOSSIPSUB_MESH_MIN=4` - -- **`GOSSIPSUB_MESH_MAX`**: Maximum mesh connections - - Purpose: Upper threshold before pruning excess peers (corresponds to `D_high`) - - Default: `12` - - Note: Should be greater than `GOSSIPSUB_MESH_TARGET` - - Example: `GOSSIPSUB_MESH_MAX=12` +* **`GOSSIPSUB_PORT`**: Port for GossipSub protocol communication + + * Purpose: Network port for GossipSub peer-to-peer communication + + * Default: `6060` + + * Usage: Internal P2P networking, separate from API ports + + * Example: `GOSSIPSUB_PORT=6060` + +* **`GOSSIPSUB_MAX_MSG_SIZE`**: Maximum message size in bytes + + * Purpose: Limits individual message size to prevent memory issues + + * Default: `1048576` (1MB) + + * Usage: Larger values allow bigger payloads but use more memory + + * Example: `GOSSIPSUB_MAX_MSG_SIZE=1048576` + +* **`GOSSIPSUB_MESH_TARGET`**: Target number of mesh connections + + * Purpose: Ideal number of direct peer connections (corresponds to `D`) + + * Default: `6` + + * Impact: Higher values increase redundancy but use more bandwidth + + * Example: `GOSSIPSUB_MESH_TARGET=6` + +* **`GOSSIPSUB_MESH_MIN`**: Minimum mesh connections + + * Purpose: Lower threshold before attempting to add peers (corresponds to `D_low`) + + * Default: `4` + + * Note: Should be less than `GOSSIPSUB_MESH_TARGET` + + * Example: `GOSSIPSUB_MESH_MIN=4` + +* **`GOSSIPSUB_MESH_MAX`**: Maximum mesh connections + + * Purpose: Upper threshold before pruning excess peers (corresponds to `D_high`) + + * Default: `12` + + * Note: Should be greater than `GOSSIPSUB_MESH_TARGET` + + * Example: `GOSSIPSUB_MESH_MAX=12` ### Configuration Example ```yaml + # docker-compose.yml + services: p2pnode-1: environment: - - GOSSIPSUB_PORT=6060 - - GOSSIPSUB_MAX_MSG_SIZE=1048576 - - GOSSIPSUB_MESH_TARGET=6 - - GOSSIPSUB_MESH_MIN=4 - - GOSSIPSUB_MESH_MAX=12 + +* GOSSIPSUB_PORT=6060 + + * GOSSIPSUB_MAX_MSG_SIZE=1048576 + + * GOSSIPSUB_MESH_TARGET=6 + + * GOSSIPSUB_MESH_MIN=4 + + * GOSSIPSUB_MESH_MAX=12 + ``` ## GossipSub vs Optimum Protocol @@ -96,6 +127,7 @@ services: Optimum P2P runs two protocols simultaneously: 1. **Standard GossipSub**: For baseline pub/sub functionality + 2. **Optimum Protocol**: Enhanced with RLNC (Random Linear Network Coding) Both protocols have their own configuration parameters: @@ -111,14 +143,19 @@ Both protocols have their own configuration parameters: GossipSub uses four types of control messages: -- **GRAFT**: Add peer to mesh (invite to join topic mesh) -- **PRUNE**: Remove peer from mesh (remove from topic mesh) -- **IHAVE**: Announce available messages (gossip metadata) -- **IWANT**: Request specific messages (response to IHAVE) +* **GRAFT**: Add peer to mesh (invite to join topic mesh) +* **PRUNE**: Remove peer from mesh (remove from topic mesh) + +* **IHAVE**: Announce available messages (gossip metadata) + +* **IWANT**: Request specific messages (response to IHAVE) ## References -- [libp2p GossipSub v1.0 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md) -- [libp2p PubSub Interface](https://github.com/libp2p/specs/blob/master/pubsub/README.md) -- [Optimum P2P Configuration Guide](/docs/hackathon/deployment/p2p-with-gateway.md#p2p-node-configuration) \ No newline at end of file +* [libp2p GossipSub v1.0 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md) + +* [libp2p PubSub Interface](https://github.com/libp2p/specs/blob/master/pubsub/README.md) + +* [Optimum P2P Configuration Guide](/docs/hackathon/deployment/p2p-with-gateway.md#p2p-node-configuration) + diff --git a/docs/hackathon/configuration/optimump2p.md b/docs/hackathon/configuration/optimump2p.md index 0400543..a3f2970 100644 --- a/docs/hackathon/configuration/optimump2p.md +++ b/docs/hackathon/configuration/optimump2p.md @@ -47,9 +47,12 @@ OptimumP2P configuration can be set via YAML config files or Docker environment Controls how many coded shards each message is divided into for network coding. This is the fundamental parameter that determines RLNC granularity. **Technical Impact**: -- **Higher values**: More coded shards provide better redundancy and fault tolerance but increase computational overhead -- **Lower values**: Fewer coded shards reduce processing time and bandwidth usage but may reduce fault tolerance -- **Network effect**: Directly affects the minimum number of coded shards needed for message reconstruction + +* **Higher values**: More coded shards provide better redundancy and fault tolerance but increase computational overhead + +* **Lower values**: Fewer coded shards reduce processing time and bandwidth usage but may reduce fault tolerance + +* **Network effect**: Directly affects the minimum number of coded shards needed for message reconstruction ### Publisher Shard Multiplier @@ -60,8 +63,10 @@ Controls how many coded shards each message is divided into for network coding. Controls redundancy when publishing messages. Total coded shards created = `rlnc_shard_factor × publisher_shard_multiplier`. **Technical Impact**: -- **Higher values**: More initial coded shards improve delivery guarantees but increase bandwidth usage -- **Lower values**: Fewer coded shards reduce network load but may impact reliability in lossy networks + +* **Higher values**: More initial coded shards improve delivery guarantees but increase bandwidth usage + +* **Lower values**: Fewer coded shards reduce network load but may impact reliability in lossy networks ### Forward Shard Threshold @@ -72,59 +77,99 @@ Controls redundancy when publishing messages. Total coded shards created = `rlnc Determines when nodes forward received coded shards. Nodes forward when they have more than `rlnc_shard_factor × threshold` coded shards. **Technical Impact**: -- **Higher values** (0.8-0.9): More reliable forwarding, increased latency -- **Lower values** (0.5-0.6): Faster propagation, reduced latency, potential reliability trade-offs + +* **Higher values** (0.8-0.9): More reliable forwarding, increased latency + +* **Lower values** (0.5-0.6): Faster propagation, reduced latency, potential reliability trade-offs ## Docker Configuration Examples ### OptimumP2P Mode (Enhanced) + ```yaml + environment: - - NODE_MODE=optimum - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 + +* NODE_MODE=optimum + + * OPTIMUM_SHARD_FACTOR=4 + + * OPTIMUM_SHARD_MULT=1.5 + + * OPTIMUM_THRESHOLD=0.75 + + * OPTIMUM_MESH_TARGET=6 + + * OPTIMUM_MESH_MIN=3 + + * OPTIMUM_MESH_MAX=12 + ``` ### GossipSub Mode (Baseline) + ```yaml + environment: - - NODE_MODE=gossipsub - - GOSSIPSUB_MESH_TARGET=6 - - GOSSIPSUB_MESH_MIN=4 - - GOSSIPSUB_MESH_MAX=12 + +* NODE_MODE=gossipsub + + * GOSSIPSUB_MESH_TARGET=6 + + * GOSSIPSUB_MESH_MIN=4 + + * GOSSIPSUB_MESH_MAX=12 + ``` ## Performance Tuning ### High Throughput Setup + Optimized for maximum message throughput: + ```yaml -- OPTIMUM_SHARD_FACTOR=8 -- OPTIMUM_SHARD_MULT=2.0 -- OPTIMUM_THRESHOLD=0.5 -- OPTIMUM_MESH_TARGET=8 + +* OPTIMUM_SHARD_FACTOR=8 + +* OPTIMUM_SHARD_MULT=2.0 + +* OPTIMUM_THRESHOLD=0.5 + +* OPTIMUM_MESH_TARGET=8 + ``` ### Low Latency Setup + Optimized for minimum delivery latency: + ```yaml -- OPTIMUM_SHARD_FACTOR=4 -- OPTIMUM_SHARD_MULT=1.2 -- OPTIMUM_THRESHOLD=0.6 -- OPTIMUM_MESH_TARGET=6 + +* OPTIMUM_SHARD_FACTOR=4 + +* OPTIMUM_SHARD_MULT=1.2 + +* OPTIMUM_THRESHOLD=0.6 + +* OPTIMUM_MESH_TARGET=6 + ``` ### High Reliability Setup + Optimized for maximum fault tolerance: + ```yaml -- OPTIMUM_SHARD_FACTOR=16 -- OPTIMUM_SHARD_MULT=2.5 -- OPTIMUM_THRESHOLD=0.8 -- OPTIMUM_MESH_TARGET=10 + +* OPTIMUM_SHARD_FACTOR=16 + +* OPTIMUM_SHARD_MULT=2.5 + +* OPTIMUM_THRESHOLD=0.8 + +* OPTIMUM_MESH_TARGET=10 + ``` ## Configuration File Format @@ -132,33 +177,44 @@ Optimized for maximum fault tolerance: Sample YAML configuration matching the actual config structure: ```yaml + # === General App Settings === + app_port: 23422 cluster_id: "production_cluster" file_storage_directory: /tmp silent_mode_enabled: false # === Protocol Settings === + enable_gossipsub: false enable_optimum_p2p: true # === PubSub Mesh Settings === + mesh_degree_target: 6 mesh_degree_min: 5 mesh_degree_max: 12 rlnc_shard_factor: 32 # number of coded shards each message is divided into # === Message Generation === + random_message_size_bytes: 3145728 # 3MB + publisher_shard_multiplier: 1.5 # coded shards multiplier for publishing + forward_shard_threshold: 0.75 # forward threshold for coded shards # === Bootstrap Nodes === + bootstrap_nodes_optimum_p2p: - - /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample + +* /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample bootstrap_nodes_gossipsub: - - /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample + +* /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample + ``` ## Protocol Mode Switching @@ -166,81 +222,124 @@ bootstrap_nodes_gossipsub: OptimumP2P supports running both protocols for comparison: **OptimumP2P Mode** (`NODE_MODE=optimum`): -- Uses RLNC with coded shards for enhanced propagation -- Provides early forwarding capabilities -- Better bandwidth efficiency through network coding -- Enhanced fault tolerance via coded shard redundancy + +* Uses RLNC with coded shards for enhanced propagation + +* Provides early forwarding capabilities + +* Better bandwidth efficiency through network coding + +* Enhanced fault tolerance via coded shard redundancy **GossipSub Mode** (`NODE_MODE=gossipsub`): -- Standard libp2p GossipSub implementation -- Direct message forwarding without coding -- Lower computational overhead -- Baseline for performance comparison + +* Standard libp2p GossipSub implementation + +* Direct message forwarding without coding + +* Lower computational overhead + +* Baseline for performance comparison ## Monitoring Configuration Verify your configuration is applied correctly: ```bash + # Check applied configuration + curl http://localhost:9090/config # Monitor mesh formation and peer connections + curl http://localhost:9090/debug/peers # Check protocol mode in logs + docker logs p2pnode-1 | grep -E "(optimum|gossipsub|coded.*shard)" # Monitor coded shard processing + docker logs p2pnode-1 | grep -E "(shard|forward|decode)" + ``` ## Configuration Constraints **Enforced by code**: -- `mesh_degree_min <= mesh_degree_target <= mesh_degree_max` -- `random_message_size_bytes > 0` -- `cluster_id` must not be empty or "sample_cluster" + +* `mesh_degree_min <= mesh_degree_target <= mesh_degree_max` + +* `random_message_size_bytes > 0` + +* `cluster_id` must not be empty or "sample_cluster" **Recommended best practices**: -- `forward_shard_threshold` between 0.0 and 1.0 (values outside this range may cause unexpected behavior) -- `rlnc_shard_factor > 0` (value of 0 disables RLNC functionality) -- `publisher_shard_multiplier >= 1.0` (values < 1.0 reduce redundancy) + +* `forward_shard_threshold` between 0.0 and 1.0 (values outside this range may cause unexpected behavior) + +* `rlnc_shard_factor > 0` (value of 0 disables RLNC functionality) + +* `publisher_shard_multiplier >= 1.0` (values < 1.0 reduce redundancy) ## Complete Docker Compose Example ```yaml + services: p2pnode-1: image: getoptimum/p2pnode:latest environment: # Protocol selection - - NODE_MODE=optimum - - CLUSTER_ID=p2pnode-1 + +* NODE_MODE=optimum + + * CLUSTER_ID=p2pnode-1 + # RLNC coded shard parameters - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 + +* OPTIMUM_SHARD_FACTOR=4 + + * OPTIMUM_SHARD_MULT=1.5 + + * OPTIMUM_THRESHOLD=0.75 + # Mesh topology - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 + +* OPTIMUM_MESH_TARGET=6 + + * OPTIMUM_MESH_MIN=3 + + * OPTIMUM_MESH_MAX=12 + # Network settings - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - SIDECAR_PORT=33212 - - API_PORT=9090 + +* OPTIMUM_PORT=7070 + + * OPTIMUM_MAX_MSG_SIZE=1048576 + + * SIDECAR_PORT=33212 + + * API_PORT=9090 + # Bootstrap configuration - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + +* BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + ``` ## See Also -- **[GossipSub Configuration](./gossipsub.md)** - Standard protocol parameters for comparison -- **[P2P-Only Deployment](../deployment/p2p-only.md)** - Complete setup with configuration -- **[Gateway + P2P Deployment](../deployment/p2p-with-gateway.md)** - Full stack configuration -- **[OptimumP2P Technical Overview](../../learn/overview/p2p.md)** - Protocol fundamentals and RLNC details \ No newline at end of file +* **[GossipSub Configuration](./gossipsub.md)** - Standard protocol parameters for comparison + +* **[P2P-Only Deployment](../deployment/p2p-only.md)** - Complete setup with configuration + +* **[Gateway + P2P Deployment](../deployment/p2p-with-gateway.md)** - Full stack configuration + +* **[OptimumP2P Technical Overview](../../learn/overview/p2p.md)** - Protocol fundamentals and RLNC details + diff --git a/docs/hackathon/deployment/p2p-only.md b/docs/hackathon/deployment/p2p-only.md index f506a1b..888325a 100644 --- a/docs/hackathon/deployment/p2p-only.md +++ b/docs/hackathon/deployment/p2p-only.md @@ -2,237 +2,372 @@ This guide covers deploying a standalone OptimumP2P network without gateway intermediaries. In this configuration, clients connect directly to P2P nodes using gRPC sidecar connections, providing maximum performance and protocol flexibility. - -### Network Topology +## Network Topology The P2P network forms a mesh topology where each node maintains connections to a subset of peers based on the configured mesh parameters: -- **Mesh Target (`OPTIMUM_MESH_TARGET`)**: Ideal number of peers per topic -- **Mesh Range (`OPTIMUM_MESH_MIN` to `OPTIMUM_MESH_MAX`)**: Acceptable peer count bounds -- **Bootstrap Nodes**: Initial discovery points for new nodes joining the network +* **Mesh Target (`OPTIMUM_MESH_TARGET`)**: Ideal number of peers per topic + +* **Mesh Range (`OPTIMUM_MESH_MIN` to `OPTIMUM_MESH_MAX`)**: Acceptable peer count bounds +* **Bootstrap Nodes**: Initial discovery points for new nodes joining the network ## Deployment Configuration ```yaml + services: p2pnode-1: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-1 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + +* LOG_LEVEL=debug + + * CLUSTER_ID=p2pnode-1 + + * NODE_MODE=optimum + + * SIDECAR_PORT=33212 + + * API_PORT=9090 + + * IDENTITY_DIR=/identity + + * OPTIMUM_PORT=7070 + + * OPTIMUM_MAX_MSG_SIZE=1048576 + + * OPTIMUM_MESH_TARGET=6 + + * OPTIMUM_MESH_MIN=3 + + * OPTIMUM_MESH_MAX=12 + + * OPTIMUM_SHARD_FACTOR=4 + + * OPTIMUM_SHARD_MULT=1.5 + + * OPTIMUM_THRESHOLD=0.75 + + * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: optimum-network: ipv4_address: 172.28.0.12 ports: - - "33221:33212" # gRPC sidecar - - "7071:7070" # OptimumP2P - - "9091:9090" # API + +* "33221:33212" # gRPC sidecar + + * "7071:7070" # OptimumP2P + + * "9091:9090" # API + volumes: - - ./identity:/identity + +* ./identity:/identity p2pnode-2: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-2 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + +* LOG_LEVEL=debug + + * CLUSTER_ID=p2pnode-2 + + * NODE_MODE=optimum + + * SIDECAR_PORT=33212 + + * API_PORT=9090 + + * IDENTITY_DIR=/identity + + * OPTIMUM_PORT=7070 + + * OPTIMUM_MAX_MSG_SIZE=1048576 + + * OPTIMUM_MESH_TARGET=6 + + * OPTIMUM_MESH_MIN=3 + + * OPTIMUM_MESH_MAX=12 + + * OPTIMUM_SHARD_FACTOR=4 + + * OPTIMUM_SHARD_MULT=1.5 + + * OPTIMUM_THRESHOLD=0.75 + + * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: optimum-network: ipv4_address: 172.28.0.13 ports: - - "33222:33212" - - "7072:7070" - - "9092:9090" + +* "33222:33212" + + * "7072:7070" + + * "9092:9090" networks: optimum-network: driver: bridge ipam: config: - - subnet: 172.28.0.0/16 + +* subnet: 172.28.0.0/16 + ``` ## Environment Variables ### Core Configuration -- **`NODE_MODE`**: P2P protocol implementation mode - - Purpose: Selects the underlying pub/sub protocol - - Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) - - Default: `optimum` - - Usage: Use `optimum` for better performance with RLNC coding - - Note: All nodes in network should use same mode for compatibility - -- **`CLUSTER_ID`**: Unique identifier for each P2P node - - Purpose: Distinguishes nodes in logs, metrics, and network topology - - Usage: Should be unique across all P2P nodes in deployment - - Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. - - Required: Yes, no default value - -- **`LOG_LEVEL`**: Logging verbosity level - - Purpose: Controls the amount and detail of log output - - Values: `debug`, `info`, `warn`, `error` - - Default: `info` - - Usage Guide: - - `debug`: Most verbose, includes detailed P2P protocol events (development) - - `info`: Standard level with operational information - - `warn`: Only warnings and errors (quiet operation) - - `error`: Only error messages (minimal logging) +* **`NODE_MODE`**: P2P protocol implementation mode + + * Purpose: Selects the underlying pub/sub protocol + + * Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) + + * Default: `optimum` + + * Usage: Use `optimum` for better performance with RLNC coding + + * Note: All nodes in network should use same mode for compatibility + +* **`CLUSTER_ID`**: Unique identifier for each P2P node + + * Purpose: Distinguishes nodes in logs, metrics, and network topology + + * Usage: Should be unique across all P2P nodes in deployment + + * Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. + + * Required: Yes, no default value + +* **`LOG_LEVEL`**: Logging verbosity level + + * Purpose: Controls the amount and detail of log output + + * Values: `debug`, `info`, `warn`, `error` + + * Default: `info` + + * Usage Guide: + + * `debug`: Most verbose, includes detailed P2P protocol events (development) + + * `info`: Standard level with operational information + + * `warn`: Only warnings and errors (quiet operation) + + * `error`: Only error messages (minimal logging) ### Port Configuration -- **`SIDECAR_PORT`**: gRPC bidirectional communication port - - Purpose: Port where clients connect directly to interact with P2P node - - Default: `33212` - - Range: Any available port - - Usage: Must be accessible from client applications for direct P2P access - - Network: Used for client-to-node gRPC communication - -- **`API_PORT`**: HTTP monitoring and management API port - - Purpose: Exposes REST endpoints for health checks, node state, and metrics - - Default: `9090` - - Range: Any available port - - Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` - - Usage: Used for operational monitoring and debugging - -- **`OPTIMUM_PORT`**: P2P protocol communication port - - Purpose: Port for peer-to-peer communication between nodes - - Default: `7070` - - Range: Any available port - - Usage: Must be accessible between all P2P nodes in the mesh - - Network: Used for inter-node OptimumP2P protocol communication +* **`SIDECAR_PORT`**: gRPC bidirectional communication port + + * Purpose: Port where clients connect directly to interact with P2P node + + * Default: `33212` + + * Range: Any available port + + * Usage: Must be accessible from client applications for direct P2P access + + * Network: Used for client-to-node gRPC communication + +* **`API_PORT`**: HTTP monitoring and management API port + + * Purpose: Exposes REST endpoints for health checks, node state, and metrics + + * Default: `9090` + + * Range: Any available port + + * Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` + + * Usage: Used for operational monitoring and debugging + +* **`OPTIMUM_PORT`**: P2P protocol communication port + + * Purpose: Port for peer-to-peer communication between nodes + + * Default: `7070` + + * Range: Any available port + + * Usage: Must be accessible between all P2P nodes in the mesh + + * Network: Used for inter-node OptimumP2P protocol communication ### RLNC Parameters -- **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes - - Purpose: Limits individual message size to prevent memory issues - - Default: `1048576` (1MB) - - Usage: Larger values allow bigger payloads but use more memory/bandwidth +* **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes + + * Purpose: Limits individual message size to prevent memory issues + + * Default: `1048576` (1MB) + + * Usage: Larger values allow bigger payloads but use more memory/bandwidth + -- **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message - - Purpose: Controls how many pieces each message is split into for RLNC - - Default: `4` - - Impact: Higher values increase redundancy and fault tolerance but use more bandwidth - - Note: Must be non-zero to enable RLNC functionality - -- **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier - - Purpose: Controls redundancy factor for error recovery - - Default: `1.5` - - Impact: Higher values improve error recovery but increase bandwidth usage - - Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) +* **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message + + * Purpose: Controls how many pieces each message is split into for RLNC + + * Default: `4` + + * Impact: Higher values increase redundancy and fault tolerance but use more bandwidth + + * Note: Must be non-zero to enable RLNC functionality + +* **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier + + * Purpose: Controls redundancy factor for error recovery + + * Default: `1.5` + + * Impact: Higher values improve error recovery but increase bandwidth usage + + * Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) + -- **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio - - Purpose: Fraction of shards needed before forwarding or decoding message - - Default: `0.75` (75%) - - Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) - - Impact: Critical for network performance tuning - - Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency +* **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio + + * Purpose: Fraction of shards needed before forwarding or decoding message + + * Default: `0.75` (75%) + + * Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) + + * Impact: Critical for network performance tuning + + * Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency ### Mesh Topology Configuration -- **`OPTIMUM_MESH_TARGET`**: Target number of peer connections - - Purpose: Ideal number of peers each node connects to in the mesh - - Default: `6` - - Range: 3-50 (typically 4-12 for most deployments) - - Impact: Higher values increase redundancy and fault tolerance but use more resources +* **`OPTIMUM_MESH_TARGET`**: Target number of peer connections + + * Purpose: Ideal number of peers each node connects to in the mesh + + * Default: `6` + + * Range: 3-50 (typically 4-12 for most deployments) + + * Impact: Higher values increase redundancy and fault tolerance but use more resources +* **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections -- **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections - - Purpose: Minimum connections before attempting to add more peers - - Default: `4` - - Note: Should be less than MESH_TARGET - - Impact: Lower values reduce fault tolerance, higher values increase resource usage - - Usage: Prevents network partitioning by maintaining minimum connectivity + * Purpose: Minimum connections before attempting to add more peers -- **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections - - Purpose: Maximum connections before pruning excess peers - - Default: `12` - - Note: Should be greater than MESH_TARGET - - Impact: Prevents resource exhaustion while maintaining network connectivity - - Usage: Sets upper bound to control memory and bandwidth usage + * Default: `4` + + * Note: Should be less than MESH_TARGET + + * Impact: Lower values reduce fault tolerance, higher values increase resource usage + + * Usage: Prevents network partitioning by maintaining minimum connectivity + +* **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections + + * Purpose: Maximum connections before pruning excess peers + + * Default: `12` + + * Note: Should be greater than MESH_TARGET + + * Impact: Prevents resource exhaustion while maintaining network connectivity + + * Usage: Sets upper bound to control memory and bandwidth usage ### Bootstrap and Identity Configuration -- **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses - - Purpose: List of known peers for joining the mesh network - - Format: `/ip4//tcp//p2p/` - - Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` - - Usage: New nodes use these to discover and join the network - - Multiple: Can specify multiple peers separated by commas - - Note: At least one bootstrap peer must be accessible for network joining - -- **`IDENTITY_DIR`**: Node cryptographic identity directory - - Purpose: Directory containing node's P2P identity key (p2p.key) - - Default: `/identity` - - Usage: Only needed for bootstrap nodes, other nodes auto-generate identity - - Security: Contains private key material, should be properly secured - - Permissions: Ensure proper file permissions (600) for security +* **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses + + * Purpose: List of known peers for joining the mesh network + + * Format: `/ip4//tcp//p2p/` + + * Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` + + * Usage: New nodes use these to discover and join the network + + * Multiple: Can specify multiple peers separated by commas + + * Note: At least one bootstrap peer must be accessible for network joining + +* **`IDENTITY_DIR`**: Node cryptographic identity directory + + * Purpose: Directory containing node's P2P identity key (p2p.key) + + * Default: `/identity` + + * Usage: Only needed for bootstrap nodes, other nodes auto-generate identity + + * Security: Contains private key material, should be properly secured + + * Permissions: Ensure proper file permissions (600) for security ### Configuration Notes All parameter values can be adjusted based on specific use case requirements. TWhen modifying parameters: -- Higher OPTIMUM_THRESHOLD values improve reliability but increase latency -- Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources -- Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage -- OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET -- OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET +* Higher OPTIMUM_THRESHOLD values improve reliability but increase latency + +* Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources + +* Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage + +* OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET + +* OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET ## Starting the Network 1. Generate peer identity (optional, will auto-generate if not present): + ```bash + # Create identity directory + mkdir -p identity # Generate peer key + docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key + ``` -2. Set bootstrap peer ID: +1. Set bootstrap peer ID: + ```bash + export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest peer-id) + ``` -3. Start the network: +1. Start the network: + ```bash + docker-compose up -d + ``` -4. Verify nodes are running: +1. Verify nodes are running: + ```bash + docker-compose ps docker-compose logs p2pnode-1 + ``` ## Client Connection @@ -240,50 +375,73 @@ docker-compose logs p2pnode-1 Clients connect directly to P2P nodes via gRPC sidecar: ```go + conn, err := grpc.Dial("localhost:33221", grpc.WithInsecure()) if err != nil { log.Fatal(err) } client := pb.NewP2PStreamClient(conn) + ``` ## Network Scaling To add more nodes, replicate the service definition with: -- Unique `CLUSTER_ID` -- Unique IP address in the network -- Unique port mappings -- Same `BOOTSTRAP_PEERS` configuration + +* Unique `CLUSTER_ID` + +* Unique IP address in the network + +* Unique port mappings + +* Same `BOOTSTRAP_PEERS` configuration ## Monitoring Access node metrics and status: -- Node 1: http://localhost:9091 -- Node 2: http://localhost:9092 + +* Node 1: http://localhost:9091 + +* Node 2: http://localhost:9092 ## Troubleshooting ### Peer Discovery Issues + Check bootstrap peer configuration and network connectivity: + ```bash + docker-compose exec p2pnode-1 ping p2pnode-2 docker-compose logs p2pnode-1 | grep "bootstrap" + ``` ### Mesh Formation + Verify peers are discovering each other: + ```bash + curl http://localhost:9091/debug/peers + ``` ### Message Flow + Check message propagation in logs: + ```bash + docker-compose logs -f | grep "message" + ``` ## See Also -- [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters -- [P2P with Gateway Deployment](/docs/hackathon/deployment/p2p-with-gateway.md) - Alternative deployment with gateway layer -- [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide \ No newline at end of file +* [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters + +* [P2P with Gateway Deployment](/docs/hackathon/deployment/p2p-with-gateway.md) - Alternative deployment with gateway layer + +* [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide + diff --git a/docs/hackathon/deployment/p2p-with-gateway.md b/docs/hackathon/deployment/p2p-with-gateway.md index 69de61b..df33331 100644 --- a/docs/hackathon/deployment/p2p-with-gateway.md +++ b/docs/hackathon/deployment/p2p-with-gateway.md @@ -2,397 +2,633 @@ This guide covers deploying OptimumP2P with gateway services that provide HTTP/WebSocket/gRPC APIs for client applications. The gateway acts as a bridge between traditional client-server applications and the OptimumP2P network. - -### Component Responsibilities +## Component Responsibilities **Gateway Layer:** -- Protocol translation (HTTP/WebSocket/gRPC ↔ libp2p) -- Client session management -- Load balancing across P2P nodes -- Rate limiting and authentication -- API versioning and compatibility + +* Protocol translation (HTTP/WebSocket/gRPC ↔ libp2p) + +* Client session management + +* Load balancing across P2P nodes + +* Rate limiting and authentication + +* API versioning and compatibility **P2P Network Layer:** -- RLNC message encoding/decoding -- Mesh topology maintenance -- Peer discovery and routing -- Message propagation via GossipSub -- Network resilience and fault tolerance +* RLNC message encoding/decoding + +* Mesh topology maintenance + +* Peer discovery and routing + +* Message propagation via GossipSub + +* Network resilience and fault tolerance ## Deployment Configuration Complete setup with gateways and P2P nodes: ```yaml + services: gateway-1: image: 'getoptimum/gateway:latest' platform: linux/amd64 ports: - - "8081:8080" # HTTP/WebSocket - - "50051:50051" # gRPC + +* "8081:8080" # HTTP/WebSocket + + * "50051:50051" # gRPC + environment: - - GATEWAY_PORT=:8080 - - CLUSTER_ID=gateway-1 - - ENABLE_AUTH=false - - LOG_LEVEL=debug - - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 + +* GATEWAY_PORT=:8080 + + * CLUSTER_ID=gateway-1 + + * ENABLE_AUTH=false + + * LOG_LEVEL=debug + + * P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 + networks: optimum-network: ipv4_address: 172.28.0.10 depends_on: - - p2pnode-1 - - p2pnode-2 - - p2pnode-3 - - p2pnode-4 + +* p2pnode-1 + + * p2pnode-2 + + * p2pnode-3 + + * p2pnode-4 gateway-2: image: 'getoptimum/gateway:latest' platform: linux/amd64 ports: - - "8082:8080" - - "50052:50051" + +* "8082:8080" + + * "50052:50051" + environment: - - GATEWAY_PORT=:8080 - - CLUSTER_ID=gateway-2 - - ENABLE_AUTH=false - - LOG_LEVEL=debug - - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 + +* GATEWAY_PORT=:8080 + + * CLUSTER_ID=gateway-2 + + * ENABLE_AUTH=false + + * LOG_LEVEL=debug + + * P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 + networks: optimum-network: ipv4_address: 172.28.0.11 depends_on: - - p2pnode-1 - - p2pnode-2 - - p2pnode-3 - - p2pnode-4 + +* p2pnode-1 + + * p2pnode-2 + + * p2pnode-3 + + * p2pnode-4 p2pnode-1: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 volumes: - - ./identity:/identity + +* ./identity:/identity + environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-1 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + +* LOG_LEVEL=debug + + * CLUSTER_ID=p2pnode-1 + + * NODE_MODE=optimum + + * SIDECAR_PORT=33212 + + * API_PORT=9090 + + * IDENTITY_DIR=/identity + + * OPTIMUM_PORT=7070 + + * OPTIMUM_MAX_MSG_SIZE=1048576 + + * OPTIMUM_MESH_TARGET=6 + + * OPTIMUM_MESH_MIN=3 + + * OPTIMUM_MESH_MAX=12 + + * OPTIMUM_SHARD_FACTOR=4 + + * OPTIMUM_SHARD_MULT=1.5 + + * OPTIMUM_THRESHOLD=0.75 + + * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: optimum-network: ipv4_address: 172.28.0.12 ports: - - "33221:33212" - - "7071:7070" - - "9091:9090" + +* "33221:33212" + + * "7071:7070" + + * "9091:9090" p2pnode-2: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-2 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + +* LOG_LEVEL=debug + + * CLUSTER_ID=p2pnode-2 + + * NODE_MODE=optimum + + * SIDECAR_PORT=33212 + + * API_PORT=9090 + + * IDENTITY_DIR=/identity + + * OPTIMUM_PORT=7070 + + * OPTIMUM_MAX_MSG_SIZE=1048576 + + * OPTIMUM_MESH_TARGET=6 + + * OPTIMUM_MESH_MIN=3 + + * OPTIMUM_MESH_MAX=12 + + * OPTIMUM_SHARD_FACTOR=4 + + * OPTIMUM_SHARD_MULT=1.5 + + * OPTIMUM_THRESHOLD=0.75 + + * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: optimum-network: ipv4_address: 172.28.0.13 ports: - - "33222:33212" - - "7072:7070" - - "9092:9090" + +* "33222:33212" + + * "7072:7070" + + * "9092:9090" p2pnode-3: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-3 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + +* LOG_LEVEL=debug + + * CLUSTER_ID=p2pnode-3 + + * NODE_MODE=optimum + + * SIDECAR_PORT=33212 + + * API_PORT=9090 + + * IDENTITY_DIR=/identity + + * OPTIMUM_PORT=7070 + + * OPTIMUM_MAX_MSG_SIZE=1048576 + + * OPTIMUM_MESH_TARGET=6 + + * OPTIMUM_MESH_MIN=3 + + * OPTIMUM_MESH_MAX=12 + + * OPTIMUM_SHARD_FACTOR=4 + + * OPTIMUM_SHARD_MULT=1.5 + + * OPTIMUM_THRESHOLD=0.75 + + * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: optimum-network: ipv4_address: 172.28.0.14 ports: - - "33223:33212" - - "7073:7070" - - "9093:9090" + +* "33223:33212" + + * "7073:7070" + + * "9093:9090" p2pnode-4: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-4 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + +* LOG_LEVEL=debug + + * CLUSTER_ID=p2pnode-4 + + * NODE_MODE=optimum + + * SIDECAR_PORT=33212 + + * API_PORT=9090 + + * IDENTITY_DIR=/identity + + * OPTIMUM_PORT=7070 + + * OPTIMUM_MAX_MSG_SIZE=1048576 + + * OPTIMUM_MESH_TARGET=6 + + * OPTIMUM_MESH_MIN=3 + + * OPTIMUM_MESH_MAX=12 + + * OPTIMUM_SHARD_FACTOR=4 + + * OPTIMUM_SHARD_MULT=1.5 + + * OPTIMUM_THRESHOLD=0.75 + + * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: optimum-network: ipv4_address: 172.28.0.15 ports: - - "33224:33212" - - "7074:7070" - - "9094:9090" + +* "33224:33212" + + * "7074:7070" + + * "9094:9090" networks: optimum-network: driver: bridge ipam: config: - - subnet: 172.28.0.0/16 + +* subnet: 172.28.0.0/16 + ``` ## P2P Node Environment Variables ### Core P2P Configuration -- **`CLUSTER_ID`**: Unique identifier for each P2P node - - Purpose: Distinguishes nodes in logs, metrics, and network topology - - Usage: Should be unique across all P2P nodes in deployment - - Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. - - Required: Yes, no default value - -- **`NODE_MODE`**: P2P protocol implementation mode - - Purpose: Selects the underlying pub/sub protocol - - Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) - - Default: `optimum` - - Usage: Use `optimum` for better performance with RLNC coding - - Note: All nodes in network should use same mode for compatibility - -- **`SIDECAR_PORT`**: gRPC bidirectional communication port - - Purpose: Port where gateways and clients connect to interact with P2P node - - Default: `33212` - - Range: Any available port (1024-65535) - - Usage: Must be accessible from gateway containers for internal communication - - Network: Used for internal container-to-container communication - -- **`API_PORT`**: HTTP monitoring and management API port - - Purpose: Exposes REST endpoints for health checks, node state, and metrics - - Default: `8081` for gateway, `9090` for P2P nodes (varies by component) - - Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` - - Usage: Used for operational monitoring and debugging +* **`CLUSTER_ID`**: Unique identifier for each P2P node + + * Purpose: Distinguishes nodes in logs, metrics, and network topology + + * Usage: Should be unique across all P2P nodes in deployment + + * Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. + + * Required: Yes, no default value + +* **`NODE_MODE`**: P2P protocol implementation mode + + * Purpose: Selects the underlying pub/sub protocol + + * Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) + + * Default: `optimum` + + * Usage: Use `optimum` for better performance with RLNC coding + + * Note: All nodes in network should use same mode for compatibility + +* **`SIDECAR_PORT`**: gRPC bidirectional communication port + + * Purpose: Port where gateways and clients connect to interact with P2P node + + * Default: `33212` + + * Range: Any available port (1024-65535) + + * Usage: Must be accessible from gateway containers for internal communication + + * Network: Used for internal container-to-container communication + +* **`API_PORT`**: HTTP monitoring and management API port + + * Purpose: Exposes REST endpoints for health checks, node state, and metrics + + * Default: `8081` for gateway, `9090` for P2P nodes (varies by component) + + * Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` + + * Usage: Used for operational monitoring and debugging ### Network Discovery Configuration -- **`IDENTITY_DIR`**: Node cryptographic identity directory - - Purpose: Directory containing node's P2P identity key (p2p.key) - - Default: `/identity` - - Usage: Only needed for bootstrap nodes, other nodes auto-generate identity - - Security: Contains private key material, should be properly secured +* **`IDENTITY_DIR`**: Node cryptographic identity directory -- **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses - - Purpose: List of known peers for joining the mesh network - - Format: `/ip4//tcp//p2p/` - - Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` - - Usage: New nodes use these to discover and join the network - - Multiple: Can specify multiple peers separated by commas + * Purpose: Directory containing node's P2P identity key (p2p.key) + + * Default: `/identity` + + * Usage: Only needed for bootstrap nodes, other nodes auto-generate identity + + * Security: Contains private key material, should be properly secured + +* **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses + + * Purpose: List of known peers for joining the mesh network + + * Format: `/ip4//tcp//p2p/` + + * Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` + + * Usage: New nodes use these to discover and join the network + + * Multiple: Can specify multiple peers separated by commas ### OptimumP2P Protocol Configuration -- **`OPTIMUM_PORT`**: P2P protocol communication port - - Purpose: Port for peer-to-peer communication between nodes - - Default: `7070` - - Range: Any available port, commonly 7070-7080 - - Usage: Must be accessible between all P2P nodes in the mesh - - Network: Used for inter-node OptimumP2P protocol communication +* **`OPTIMUM_PORT`**: P2P protocol communication port -- **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes - - Purpose: Limits individual message size to prevent memory issues - - Default: `1048576` (1MB) - - Usage: Larger values allow bigger payloads but use more memory/bandwidth + * Purpose: Port for peer-to-peer communication between nodes + + * Default: `7070` + + * Range: Any available port, commonly 7070-7080 + + * Usage: Must be accessible between all P2P nodes in the mesh + + * Network: Used for inter-node OptimumP2P protocol communication + +* **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes + + * Purpose: Limits individual message size to prevent memory issues + + * Default: `1048576` (1MB) + + * Usage: Larger values allow bigger payloads but use more memory/bandwidth ### RLNC (Random Linear Network Coding) Configuration -- **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message - - Purpose: Controls how many pieces each message is split into for RLNC - - Default: `4` - - Impact: Higher values increase redundancy and fault tolerance but use more bandwidth - - Note: Must be non-zero to enable RLNC functionality - -- **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier - - Purpose: Controls redundancy factor for error recovery - - Default: `1.5` - - Impact: Higher values improve error recovery but increase bandwidth usage - - Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) - -- **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio - - Purpose: Fraction of shards needed before forwarding or decoding message - - Default: `0.75` (75%) - - Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) - - Impact: Critical for network performance tuning - - Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency +* **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message + + * Purpose: Controls how many pieces each message is split into for RLNC + + * Default: `4` + + * Impact: Higher values increase redundancy and fault tolerance but use more bandwidth + + * Note: Must be non-zero to enable RLNC functionality + +* **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier + + * Purpose: Controls redundancy factor for error recovery + + * Default: `1.5` + + * Impact: Higher values improve error recovery but increase bandwidth usage + + * Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) + +* **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio + + * Purpose: Fraction of shards needed before forwarding or decoding message + + * Default: `0.75` (75%) + + * Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) + + * Impact: Critical for network performance tuning + + * Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency ### Mesh Topology Configuration -- **`OPTIMUM_MESH_TARGET`**: Target number of peer connections - - Purpose: Ideal number of peers each node connects to in the mesh - - Default: `6` - - Impact: Higher values increase redundancy and fault tolerance but use more resources - - Scaling: Adjust based on network size and reliability requirements - -- **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections - - Purpose: Minimum connections before attempting to add more peers - - Default: `4` - - Note: Should be less than `MESH_TARGET` - - Impact: Lower values reduce fault tolerance, higher values increase resource usage - - Usage: Prevents network partitioning by maintaining minimum connectivity - -- **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections - - Purpose: Maximum connections before pruning excess peers - - Default: `12` - - Note: Should be greater than `MESH_TARGET` - - Impact: Prevents resource exhaustion while maintaining network connectivity - - Usage: Sets upper bound to control memory and bandwidth usage +* **`OPTIMUM_MESH_TARGET`**: Target number of peer connections + + * Purpose: Ideal number of peers each node connects to in the mesh + + * Default: `6` + + * Impact: Higher values increase redundancy and fault tolerance but use more resources + + * Scaling: Adjust based on network size and reliability requirements + +* **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections + + * Purpose: Minimum connections before attempting to add more peers + + * Default: `4` + + * Note: Should be less than `MESH_TARGET` + + * Impact: Lower values reduce fault tolerance, higher values increase resource usage + + * Usage: Prevents network partitioning by maintaining minimum connectivity + +* **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections + + * Purpose: Maximum connections before pruning excess peers + + * Default: `12` + + * Note: Should be greater than `MESH_TARGET` + + * Impact: Prevents resource exhaustion while maintaining network connectivity + + * Usage: Sets upper bound to control memory and bandwidth usage ### Configuration Notes All parameter values can be adjusted based on specific use case requirements. When modifying parameters: -- Higher OPTIMUM_THRESHOLD values improve reliability but increase latency -- Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources -- Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage -- OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET -- OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET +* Higher OPTIMUM_THRESHOLD values improve reliability but increase latency + +* Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources + +* Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage + +* OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET + +* OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET ## Gateway Configuration ### Environment Variables -- **`GATEWAY_PORT`**: HTTP/WebSocket server port (default: `:8080`) - - Purpose: Defines the port where the gateway listens for client connections - - Usage: Internal container port for REST API and WebSocket connections - - Example: `:8080`, `:3000`, `:8081` - - Note: External port mapping is configured separately in docker-compose ports section - -- **`CLUSTER_ID`**: Unique gateway identifier - - Purpose: Distinguishes between multiple gateway instances in logs, metrics, and monitoring - - Usage: Should be unique across all gateway instances in your deployment - - Format: Alphanumeric string, no spaces - - Example: `gateway-1`, `gateway-primary`, `gateway-us-east` - - Required: Yes, no default value - -- **`ENABLE_AUTH`**: Enable Auth0 JWT authentication (true/false) - - Purpose: Controls whether API requests require JWT authentication - - Usage: Set to `false` for development/testing, `true` for production - - Values: `true` (requires valid JWT tokens) or `false` (open access) - - Default: `false` - - Note: When `true`, requires additional Auth0 configuration (AUTH0_DOMAIN, AUTH0_AUDIENCE) - -- **`P2P_NODES`**: Comma-separated list of P2P node gRPC sidecar addresses - - Purpose: Defines which P2P nodes the gateway can connect to for message routing - - Format: `hostname:port,hostname:port,...` - - Usage: Gateway load-balances requests across these nodes for high availability - - Port: Should match SIDECAR_PORT of P2P nodes (typically 33212) - - Example: `p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212` - - Behavior: Gateway attempts to connect to all listed nodes and routes to healthy ones - -- **`LOG_LEVEL`**: Logging verbosity level - - Purpose: Controls the amount and detail of log output - - Values: `debug`, `info`, `warn`, `error` - - Default: `info` - - Usage Guide: - - `debug`: Most verbose, includes request/response details, connection events (development) - - `info`: Standard production level with operational information - - `warn`: Only warnings and errors (quiet production) - - `error`: Only error messages (minimal logging) - - Performance: Higher verbosity may impact performance and storage +* **`GATEWAY_PORT`**: HTTP/WebSocket server port (default: `:8080`) + + * Purpose: Defines the port where the gateway listens for client connections + + * Usage: Internal container port for REST API and WebSocket connections + + * Example: `:8080`, `:3000`, `:8081` + + * Note: External port mapping is configured separately in docker-compose ports section + +* **`CLUSTER_ID`**: Unique gateway identifier + + * Purpose: Distinguishes between multiple gateway instances in logs, metrics, and monitoring + + * Usage: Should be unique across all gateway instances in your deployment + + * Format: Alphanumeric string, no spaces + + * Example: `gateway-1`, `gateway-primary`, `gateway-us-east` + + * Required: Yes, no default value + +* **`ENABLE_AUTH`**: Enable Auth0 JWT authentication (true/false) + + * Purpose: Controls whether API requests require JWT authentication + + * Usage: Set to `false` for development/testing, `true` for production + + * Values: `true` (requires valid JWT tokens) or `false` (open access) + + * Default: `false` + + * Note: When `true`, requires additional Auth0 configuration (AUTH0_DOMAIN, AUTH0_AUDIENCE) + +* **`P2P_NODES`**: Comma-separated list of P2P node gRPC sidecar addresses + + * Purpose: Defines which P2P nodes the gateway can connect to for message routing + + * Format: `hostname:port,hostname:port,...` + + * Usage: Gateway load-balances requests across these nodes for high availability + + * Port: Should match SIDECAR_PORT of P2P nodes (typically 33212) + + * Example: `p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212` + + * Behavior: Gateway attempts to connect to all listed nodes and routes to healthy ones + +* **`LOG_LEVEL`**: Logging verbosity level + + * Purpose: Controls the amount and detail of log output + + * Values: `debug`, `info`, `warn`, `error` + + * Default: `info` + + * Usage Guide: + + * `debug`: Most verbose, includes request/response details, connection events (development) + + * `info`: Standard production level with operational information + + * `warn`: Only warnings and errors (quiet production) + + * `error`: Only error messages (minimal logging) + + * Performance: Higher verbosity may impact performance and storage ### Authentication (Optional) + For production deployments, enable authentication: + ```yaml + environment: - - ENABLE_AUTH=true - - AUTH0_DOMAIN=your-domain.auth0.com - - AUTH0_AUDIENCE=your-api-audience + +* ENABLE_AUTH=true + + * AUTH0_DOMAIN=your-domain.auth0.com + + * AUTH0_AUDIENCE=your-api-audience + ``` ## API Endpoints ### HTTP REST API -- `POST /publish` - Publish message to topic -- `GET /health` - Gateway health check -- `GET /metrics` - Prometheus metrics + +* `POST /publish` - Publish message to topic + +* `GET /health` - Gateway health check + +* `GET /metrics` - Prometheus metrics ### WebSocket API -- `ws://localhost:8081/ws` - WebSocket connection for real-time messaging + +* `ws://localhost:8081/ws` - WebSocket connection for real-time messaging ### gRPC API -- `localhost:50051` - Bidirectional streaming service + +* `localhost:50051` - Bidirectional streaming service ## Starting the Network 1. Generate peer identity: + ```bash + mkdir -p identity export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key --output-peer-id) + ``` -2. Start all services: +1. Start all services: + ```bash + docker-compose up -d + ``` -3. Verify services: +1. Verify services: + ```bash + docker-compose ps curl http://localhost:8081/health + ``` ## Client Examples ### HTTP REST + ```bash + curl -X POST http://localhost:8081/publish \ -H "Content-Type: application/json" \ -d '{"topic": "test", "data": "Hello OptimumP2P"}' + ``` ### WebSocket (JavaScript) + ```javascript + const ws = new WebSocket('ws://localhost:8081/ws'); ws.onopen = () => { ws.send(JSON.stringify({ @@ -400,56 +636,82 @@ ws.onopen = () => { topic: 'test' })); }; + ``` ### gRPC (Go) + ```go + conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) client := pb.NewGatewayStreamClient(conn) stream, err := client.Stream(context.Background()) + ``` ## Monitoring ### Gateway Metrics -- Gateway 1: http://localhost:8081/metrics -- Gateway 2: http://localhost:8082/metrics + +* Gateway 1: http://localhost:8081/metrics + +* Gateway 2: http://localhost:8082/metrics ### P2P Node Status -- Node 1: http://localhost:9091 -- Node 2: http://localhost:9092 -- Node 3: http://localhost:9093 -- Node 4: http://localhost:9094 + +* Node 1: http://localhost:9091 + +* Node 2: http://localhost:9092 + +* Node 3: http://localhost:9093 + +* Node 4: http://localhost:9094 ## Scaling Considerations Scale the P2P network by adding more nodes: -- Maintain OPTIMUM_MESH_TARGET ratio to network size -- Consider network topology and latency -- Monitor mesh formation and message propagation + +* Maintain OPTIMUM_MESH_TARGET ratio to network size + +* Consider network topology and latency + +* Monitor mesh formation and message propagation ## Troubleshooting ### Gateway Connection Issues + ```bash + # Check gateway logs + docker-compose logs gateway-1 # Test P2P node connectivity + docker-compose exec gateway-1 nc -zv p2pnode-1 33212 + ``` -### Message Delivery Issues +## Message Delivery Issues + ```bash + # Check message flow + docker-compose logs -f | grep -E "(publish|subscribe|message)" # Verify P2P mesh status + curl http://localhost:9091/debug/peers + ``` ## See Also -- [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters -- [P2P-Only Deployment](/docs/hackathon/deployment/p2p-only.md) - Alternative deployment without gateways -- [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide +* [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters + +* [P2P-Only Deployment](/docs/hackathon/deployment/p2p-only.md) - Alternative deployment without gateways + +* [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide + diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index 8e00202..f9c8641 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -11,6 +11,7 @@ OptimumP2P is a novel gossip algorithm that uses [Random Linear Network Coding ( Get OptimumP2P running in under 5 minutes: 1. **[Installation](./quick-start/installation.md)** - Set up Docker and dependencies + 2. **[First Message](./quick-start/first-message.md)** - Publish and receive your first message ## Deployment Options @@ -18,50 +19,60 @@ Get OptimumP2P running in under 5 minutes: Choose your deployment strategy: ### P2P Network Only -- **[P2P-Only Deployment](./deployment/p2p-only.md)** - Deploy just the P2P nodes for direct integration + +* **[P2P-Only Deployment](./deployment/p2p-only.md)** - Deploy just the P2P nodes for direct integration ### Gateway + P2P Network -- **[Gateway + P2P Deployment](./deployment/p2p-with-gateway.md)** - Full stack with REST/WebSocket APIs + +* **[Gateway + P2P Deployment](./deployment/p2p-with-gateway.md)** - Full stack with REST/WebSocket APIs ## Client Integration Connect to OptimumP2P using various client methods: -- **[mump2p-cli](./clients/)** - Command-line client for testing and automation -- **[gRPC Clients](./clients/)** - Direct gRPC integration examples -- **[REST/WebSocket APIs](./clients/)** - Gateway-based client integration +* **[mump2p-cli](./clients/)** - Command-line client for testing and automation + +* **[gRPC Clients](./clients/)** - Direct gRPC integration examples + +* **[REST/WebSocket APIs](./clients/)** - Gateway-based client integration ## Configuration Fine-tune OptimumP2P for your use case: -- **[OptimumP2P Configuration](./configuration/optimump2p.md)** - RLNC parameters, mesh topology, and performance tuning -- **[GossipSub Configuration](./configuration/gossipsub.md)** - Standard GossipSub parameters for comparison +* **[OptimumP2P Configuration](./configuration/optimump2p.md)** - RLNC parameters, mesh topology, and performance tuning + +* **[GossipSub Configuration](./configuration/gossipsub.md)** - Standard GossipSub parameters for comparison ## Performance & Comparison Benchmark and compare OptimumP2P: -- **[Metrics Collection](./clients/)** - Understanding performance metrics -- **[OptimumP2P vs GossipSub](./clients/)** - Performance comparison methodology +* **[Metrics Collection](./clients/)** - Understanding performance metrics + +* **[OptimumP2P vs GossipSub](./clients/)** - Performance comparison methodology ## Docker Images Used The hackathon uses these pre-built Docker images: -- **`getoptimum/p2pnode:latest`** - Core P2P node with OptimumP2P protocol -- **`getoptimum/gateway:latest`** - Gateway service for client APIs +* **`getoptimum/p2pnode:latest`** - Core P2P node with OptimumP2P protocol + +* **`getoptimum/gateway:latest`** - Gateway service for client APIs Both images support protocol switching: -- `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) -- `NODE_MODE=gossipsub` - Standard GossipSub for comparison + +* `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) + +* `NODE_MODE=gossipsub` - Standard GossipSub for comparison ## Architecture Deep Dive For developers and integrators: -- **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** - Complete technical specification +* **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** - Complete technical specification --- -**Ready to get started?** Begin with **[Installation](./quick-start/installation.md)** or dive into the **[Technical Overview](../learn/overview/p2p.md)**. \ No newline at end of file +**Ready to get started?** Begin with **[Installation](./quick-start/installation.md)** or dive into the **[Technical Overview](../learn/overview/p2p.md)**. + diff --git a/docs/hackathon/quick-start/first-message.md b/docs/hackathon/quick-start/first-message.md index e7974ea..0f97968 100644 --- a/docs/hackathon/quick-start/first-message.md +++ b/docs/hackathon/quick-start/first-message.md @@ -4,24 +4,32 @@ This tutorial demonstrates how to send your first message through OptimumP2P usi ## Prerequisites -- Docker and Docker Compose installed -- Basic familiarity with terminal/command line -- Text editor for creating configuration files +* Docker and Docker Compose installed + +* Basic familiarity with terminal/command line + +* Text editor for creating configuration files ## Step 1: Set Up the Network Create a working directory and use the provided docker-compose configuration: ```bash + mkdir optimump2p-test cd optimump2p-test + ``` Download the complete setup: + ```bash + # Clone the development setup repository + git clone https://github.com/getoptimum/optimum-dev-setup-guide.git cd optimum-dev-setup-guide + ``` Or create your own `docker-compose.yml` using the configuration from the [P2P Network with Gateway](../deployment/p2p-with-gateway.md) guide. @@ -31,40 +39,55 @@ Or create your own `docker-compose.yml` using the configuration from the [P2P Ne Generate the required peer identity: ```bash + # Create identity directory if using local setup + mkdir -p identity # Set the bootstrap peer ID environment variable + export BOOTSTRAP_PEER_ID=12D3KooWExample # This will be generated automatically + ``` Start all services: ```bash + docker-compose up -d + ``` Verify the services are running: ```bash + docker-compose ps + ``` You should see containers for: -- gateway-1 (port 8081) -- gateway-2 (port 8082) -- p2pnode-1, p2pnode-2, p2pnode-3, p2pnode-4 + +* gateway-1 (port 8081) + +* gateway-2 (port 8082) + +* p2pnode-1, p2pnode-2, p2pnode-3, p2pnode-4 ## Step 3: Test Gateway Connectivity The gateway provides REST API endpoints for publishing and subscribing. Test connectivity: ```bash + # Test gateway-1 + curl -I http://localhost:8081 # Test gateway-2 + curl -I http://localhost:8082 + ``` ## Step 4: Build the Gateway Client @@ -72,8 +95,10 @@ curl -I http://localhost:8082 The repository includes a Go client for interacting with the gateway: ```bash + cd grpc_gateway_client go build -o gateway-client ./gateway_client.go + ``` ## Step 5: Subscribe to Messages @@ -81,13 +106,19 @@ go build -o gateway-client ./gateway_client.go In one terminal window, start a subscriber: ```bash + # Subscribe to topic "demo" with threshold 0.7 + ./script/gateway_client.sh subscribe demo 0.7 + ``` The subscriber will: + 1. Register with the gateway via REST API (`/api/subscribe`) + 2. Open a gRPC stream to receive messages + 3. Display received messages in the format: `[RECEIVED] Topic: | Message: ` ## Step 6: Publish Messages @@ -95,12 +126,17 @@ The subscriber will: In another terminal window, publish messages: ```bash + # Publish 5 messages to topic "demo" with threshold 0.5 + ./script/gateway_client.sh publish demo 0.5 5 + ``` The publisher will: + 1. Send messages via REST API (`/api/publish`) + 2. Display each published message in the format: `[PUBLISH] Message: ` ## Step 7: Alternative REST API Usage @@ -108,25 +144,33 @@ The publisher will: You can also interact directly with the REST API using curl: ### Subscribe via REST (requires separate gRPC stream for receiving) + ```bash + curl -X POST http://localhost:8081/api/subscribe \ -H "Content-Type: application/json" \ -d '{ + "client_id": "test_client_001", "topic": "demo", "threshold": 0.7 }' + ``` ### Publish via REST + ```bash + curl -X POST http://localhost:8081/api/publish \ -H "Content-Type: application/json" \ -d '{ + "client_id": "test_client_001", "topic": "demo", "message": "Hello from REST API" }' + ``` ## Step 8: Multiple Topics @@ -134,17 +178,23 @@ curl -X POST http://localhost:8081/api/publish \ Test topic isolation by using different topic names: ```bash + # Terminal 1: Subscribe to "weather" + ./script/gateway_client.sh subscribe weather 0.7 # Terminal 2: Subscribe to "news" + ./script/gateway_client.sh subscribe news 0.7 # Terminal 3: Publish to "weather" + ./script/gateway_client.sh publish weather 0.5 3 # Terminal 4: Publish to "news" + ./script/gateway_client.sh publish news 0.5 3 + ``` Each subscriber will only receive messages from their subscribed topic. @@ -154,50 +204,73 @@ Each subscriber will only receive messages from their subscribed topic. Test network performance with higher message volumes: ```bash + # High-frequency publishing (100 messages with 100ms delay) + ./gateway-client -topic=performance -threshold=0.5 -count=100 -delay=100ms # Stress test (1000 messages) + ./gateway-client -topic=stress -threshold=0.5 -count=1000 -delay=10ms + ``` ## Understanding the Parameters ### Threshold + The threshold parameter (0.0 to 1.0) controls RLNC decoding: -- Lower values: Messages decoded with fewer shards (faster, less reliable) -- Higher values: Messages require more shards (slower, more reliable) -- Typical range: 0.5 to 0.8 + +* Lower values: Messages decoded with fewer shards (faster, less reliable) + +* Higher values: Messages require more shards (slower, more reliable) + +* Typical range: 0.5 to 0.8 ### Client ID + Each client needs a unique identifier for the gateway to track subscriptions and route messages correctly. ### Topic Names -- Case-sensitive strings -- No special characters recommended -- Use descriptive names (e.g., "chat", "alerts", "data-feed") + +* Case-sensitive strings + +* No special characters recommended + +* Use descriptive names (e.g., "chat", "alerts", "data-feed") ## Monitoring and Debugging ### View logs + ```bash + # Gateway logs + docker-compose logs -f gateway-1 # P2P node logs + docker-compose logs -f p2pnode-1 # All logs + docker-compose logs -f + ``` -### Check network connectivity +## Check network connectivity + ```bash + # Test P2P node connectivity + docker-compose exec gateway-1 nc -zv p2pnode-1 33212 # View container network + docker network inspect optimum-dev-setup-guide_optimum-network + ``` ## Cleanup @@ -205,10 +278,13 @@ docker network inspect optimum-dev-setup-guide_optimum-network Stop and remove all containers: ```bash + docker-compose down # Remove volumes and images (optional) + docker-compose down -v --rmi all + ``` ## Next Steps @@ -216,26 +292,40 @@ docker-compose down -v --rmi all Now that you've successfully sent messages through OptimumP2P: 1. **Build custom clients**: Explore the [Client Development](../clients/) guides + 2. **Optimize configuration**: Learn about [OptimumP2P Configuration](../configuration/optimump2p.md) + 3. **Compare protocols**: Review [GossipSub Configuration](../configuration/gossipsub.md) ## Troubleshooting ### Build failures -- Ensure Go is installed: `go version` -- Check module dependencies: `go mod tidy` + +* Ensure Go is installed: `go version` + +* Check module dependencies: `go mod tidy` ### Connection issues -- Verify Docker containers are running: `docker-compose ps` -- Check port availability: `netstat -an | grep 8081` -- Review firewall settings + +* Verify Docker containers are running: `docker-compose ps` + +* Check port availability: `netstat -an | grep 8081` + +* Review firewall settings ### Message delivery issues -- Verify topic names match exactly -- Check threshold values are between 0.0 and 1.0 -- Review gateway and P2P node logs for errors + +* Verify topic names match exactly + +* Check threshold values are between 0.0 and 1.0 + +* Review gateway and P2P node logs for errors ### Performance issues -- Monitor container resources: `docker stats` -- Adjust message delay parameters -- Check network bandwidth and latency \ No newline at end of file + +* Monitor container resources: `docker stats` + +* Adjust message delay parameters + +* Check network bandwidth and latency + diff --git a/docs/hackathon/quick-start/installation.md b/docs/hackathon/quick-start/installation.md index 181978f..cde2da3 100644 --- a/docs/hackathon/quick-start/installation.md +++ b/docs/hackathon/quick-start/installation.md @@ -7,32 +7,43 @@ This guide will help you install and set up OptimumP2P on your computer. We'll e Before we start, you need these programs on your computer: ### 1. Docker + Docker is like a virtual container that runs applications in an isolated environment. Think of it as a box where we put our OptimumP2P network so it doesn't interfere with other programs on your computer. **Install Docker:** -- **Windows/Mac**: Download Docker Desktop from [docker.com](https://www.docker.com/products/docker-desktop/) -- **Linux**: Follow the instructions for your distribution on [docs.docker.com](https://docs.docker.com/engine/install/) + +* **Windows/Mac**: Download Docker Desktop from [docker.com](https://www.docker.com/products/docker-desktop/) + +* **Linux**: Follow the instructions for your distribution on [docs.docker.com](https://docs.docker.com/engine/install/) **How to check if Docker is installed:** + Open your terminal (Command Prompt on Windows, Terminal on Mac/Linux) and type: + ```bash + docker --version -``` +``` ### 2. Docker Compose + Docker Compose helps us run multiple Docker containers together. It usually comes with Docker Desktop, but let's verify: ```bash + docker-compose --version -``` +``` ### 3. Git (Optional but recommended) + Git helps you download and manage code. Most computers have it pre-installed. ```bash + git --version + ``` ## Getting the Code @@ -40,12 +51,16 @@ git --version You have two options to get the OptimumP2P setup files: ### Option 1: Download from this documentation + Create a new folder on your computer and save the docker-compose.yml files from the [Deployment Options](../deployment/) section. ### Option 2: Clone the development setup repository + ```bash + git clone https://github.com/getoptimum/optimum-dev-setup-guide.git cd optimum-dev-setup-guide + ``` ## What's Next? @@ -53,43 +68,65 @@ cd optimum-dev-setup-guide Now that you have everything installed: 1. **Learn the basics**: Read [Core Concepts](./concepts.md) to understand how OptimumP2P works + 2. **Try it out**: Follow [First Message Example](./first-message.md) to send your first message + 3. **Build something**: Check out [Client Development](../clients/) to create your own application ## Troubleshooting ### "Docker command not found" -- Make sure Docker is installed and running -- On Windows/Mac, start Docker Desktop application -- You might need to restart your terminal after installation + +* Make sure Docker is installed and running + +* On Windows/Mac, start Docker Desktop application + +* You might need to restart your terminal after installation ### "Permission denied" on Linux + Add your user to the docker group: + ```bash + sudo usermod -aG docker $USER + ``` + Then log out and log back in. ### "Port already in use" + If you see port conflicts, either: -- Stop other programs using those ports -- Change the port numbers in the docker-compose.yml file + +* Stop other programs using those ports + +* Change the port numbers in the docker-compose.yml file ### Still having issues? -- Check Docker's own troubleshooting guide -- Make sure you have enough disk space (at least 2GB free) -- Restart your computer and try again + +* Check Docker's own troubleshooting guide + +* Make sure you have enough disk space (at least 2GB free) + +* Restart your computer and try again ## System Requirements **Minimum:** -- 4GB RAM -- 2GB free disk space -- Internet connection for downloading Docker images + +* 4GB RAM + +* 2GB free disk space + +* Internet connection for downloading Docker images **Recommended:** -- 8GB RAM -- 5GB free disk space -- Stable internet connection -You're now ready to start your OptimumP2P journey! \ No newline at end of file +* 8GB RAM + +* 5GB free disk space + +* Stable internet connection + +You're now ready to start your OptimumP2P journey! From 512d3c98a89994ca380ca64826a73352be45bd93 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Fri, 1 Aug 2025 16:26:20 +0530 Subject: [PATCH 13/46] Revert "fix:lint" This reverts commit a3c62e8dde9523ccbbd65e52db2e4776c0dfca41. --- docs/hackathon/configuration/gossipsub.md | 127 +-- docs/hackathon/configuration/optimump2p.md | 225 ++--- docs/hackathon/deployment/p2p-only.md | 466 ++++------- docs/hackathon/deployment/p2p-with-gateway.md | 776 ++++++------------ docs/hackathon/overview.md | 41 +- docs/hackathon/quick-start/first-message.md | 138 +--- docs/hackathon/quick-start/installation.md | 75 +- 7 files changed, 577 insertions(+), 1271 deletions(-) diff --git a/docs/hackathon/configuration/gossipsub.md b/docs/hackathon/configuration/gossipsub.md index 94c73ff..8363e85 100644 --- a/docs/hackathon/configuration/gossipsub.md +++ b/docs/hackathon/configuration/gossipsub.md @@ -8,13 +8,10 @@ GossipSub is a pubsub protocol designed for decentralized networks that builds o ### Key Concepts -* **Mesh**: Direct connections between peers for message forwarding - -* **Gossip**: Metadata exchange about available messages with non-mesh peers - -* **Fanout**: Temporary connections for publishing when not subscribed to a topic - -* **Degree**: The number of peer connections each node maintains +- **Mesh**: Direct connections between peers for message forwarding +- **Gossip**: Metadata exchange about available messages with non-mesh peers +- **Fanout**: Temporary connections for publishing when not subscribed to a topic +- **Degree**: The number of peer connections each node maintains ## Core GossipSub Parameters @@ -50,76 +47,48 @@ Optimum P2P implements GossipSub with configurable parameters through environmen ### Environment Variables -* **`GOSSIPSUB_PORT`**: Port for GossipSub protocol communication - - * Purpose: Network port for GossipSub peer-to-peer communication - - * Default: `6060` - - * Usage: Internal P2P networking, separate from API ports - - * Example: `GOSSIPSUB_PORT=6060` - -* **`GOSSIPSUB_MAX_MSG_SIZE`**: Maximum message size in bytes - - * Purpose: Limits individual message size to prevent memory issues - - * Default: `1048576` (1MB) - - * Usage: Larger values allow bigger payloads but use more memory - - * Example: `GOSSIPSUB_MAX_MSG_SIZE=1048576` - -* **`GOSSIPSUB_MESH_TARGET`**: Target number of mesh connections - - * Purpose: Ideal number of direct peer connections (corresponds to `D`) - - * Default: `6` - - * Impact: Higher values increase redundancy but use more bandwidth - - * Example: `GOSSIPSUB_MESH_TARGET=6` - -* **`GOSSIPSUB_MESH_MIN`**: Minimum mesh connections - - * Purpose: Lower threshold before attempting to add peers (corresponds to `D_low`) - - * Default: `4` - - * Note: Should be less than `GOSSIPSUB_MESH_TARGET` - - * Example: `GOSSIPSUB_MESH_MIN=4` - -* **`GOSSIPSUB_MESH_MAX`**: Maximum mesh connections - - * Purpose: Upper threshold before pruning excess peers (corresponds to `D_high`) - - * Default: `12` - - * Note: Should be greater than `GOSSIPSUB_MESH_TARGET` - - * Example: `GOSSIPSUB_MESH_MAX=12` +- **`GOSSIPSUB_PORT`**: Port for GossipSub protocol communication + - Purpose: Network port for GossipSub peer-to-peer communication + - Default: `6060` + - Usage: Internal P2P networking, separate from API ports + - Example: `GOSSIPSUB_PORT=6060` + +- **`GOSSIPSUB_MAX_MSG_SIZE`**: Maximum message size in bytes + - Purpose: Limits individual message size to prevent memory issues + - Default: `1048576` (1MB) + - Usage: Larger values allow bigger payloads but use more memory + - Example: `GOSSIPSUB_MAX_MSG_SIZE=1048576` + +- **`GOSSIPSUB_MESH_TARGET`**: Target number of mesh connections + - Purpose: Ideal number of direct peer connections (corresponds to `D`) + - Default: `6` + - Impact: Higher values increase redundancy but use more bandwidth + - Example: `GOSSIPSUB_MESH_TARGET=6` + +- **`GOSSIPSUB_MESH_MIN`**: Minimum mesh connections + - Purpose: Lower threshold before attempting to add peers (corresponds to `D_low`) + - Default: `4` + - Note: Should be less than `GOSSIPSUB_MESH_TARGET` + - Example: `GOSSIPSUB_MESH_MIN=4` + +- **`GOSSIPSUB_MESH_MAX`**: Maximum mesh connections + - Purpose: Upper threshold before pruning excess peers (corresponds to `D_high`) + - Default: `12` + - Note: Should be greater than `GOSSIPSUB_MESH_TARGET` + - Example: `GOSSIPSUB_MESH_MAX=12` ### Configuration Example ```yaml - # docker-compose.yml - services: p2pnode-1: environment: - -* GOSSIPSUB_PORT=6060 - - * GOSSIPSUB_MAX_MSG_SIZE=1048576 - - * GOSSIPSUB_MESH_TARGET=6 - - * GOSSIPSUB_MESH_MIN=4 - - * GOSSIPSUB_MESH_MAX=12 - + - GOSSIPSUB_PORT=6060 + - GOSSIPSUB_MAX_MSG_SIZE=1048576 + - GOSSIPSUB_MESH_TARGET=6 + - GOSSIPSUB_MESH_MIN=4 + - GOSSIPSUB_MESH_MAX=12 ``` ## GossipSub vs Optimum Protocol @@ -127,7 +96,6 @@ services: Optimum P2P runs two protocols simultaneously: 1. **Standard GossipSub**: For baseline pub/sub functionality - 2. **Optimum Protocol**: Enhanced with RLNC (Random Linear Network Coding) Both protocols have their own configuration parameters: @@ -143,19 +111,14 @@ Both protocols have their own configuration parameters: GossipSub uses four types of control messages: -* **GRAFT**: Add peer to mesh (invite to join topic mesh) +- **GRAFT**: Add peer to mesh (invite to join topic mesh) +- **PRUNE**: Remove peer from mesh (remove from topic mesh) +- **IHAVE**: Announce available messages (gossip metadata) +- **IWANT**: Request specific messages (response to IHAVE) -* **PRUNE**: Remove peer from mesh (remove from topic mesh) - -* **IHAVE**: Announce available messages (gossip metadata) - -* **IWANT**: Request specific messages (response to IHAVE) ## References -* [libp2p GossipSub v1.0 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md) - -* [libp2p PubSub Interface](https://github.com/libp2p/specs/blob/master/pubsub/README.md) - -* [Optimum P2P Configuration Guide](/docs/hackathon/deployment/p2p-with-gateway.md#p2p-node-configuration) - +- [libp2p GossipSub v1.0 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md) +- [libp2p PubSub Interface](https://github.com/libp2p/specs/blob/master/pubsub/README.md) +- [Optimum P2P Configuration Guide](/docs/hackathon/deployment/p2p-with-gateway.md#p2p-node-configuration) \ No newline at end of file diff --git a/docs/hackathon/configuration/optimump2p.md b/docs/hackathon/configuration/optimump2p.md index a3f2970..0400543 100644 --- a/docs/hackathon/configuration/optimump2p.md +++ b/docs/hackathon/configuration/optimump2p.md @@ -47,12 +47,9 @@ OptimumP2P configuration can be set via YAML config files or Docker environment Controls how many coded shards each message is divided into for network coding. This is the fundamental parameter that determines RLNC granularity. **Technical Impact**: - -* **Higher values**: More coded shards provide better redundancy and fault tolerance but increase computational overhead - -* **Lower values**: Fewer coded shards reduce processing time and bandwidth usage but may reduce fault tolerance - -* **Network effect**: Directly affects the minimum number of coded shards needed for message reconstruction +- **Higher values**: More coded shards provide better redundancy and fault tolerance but increase computational overhead +- **Lower values**: Fewer coded shards reduce processing time and bandwidth usage but may reduce fault tolerance +- **Network effect**: Directly affects the minimum number of coded shards needed for message reconstruction ### Publisher Shard Multiplier @@ -63,10 +60,8 @@ Controls how many coded shards each message is divided into for network coding. Controls redundancy when publishing messages. Total coded shards created = `rlnc_shard_factor × publisher_shard_multiplier`. **Technical Impact**: - -* **Higher values**: More initial coded shards improve delivery guarantees but increase bandwidth usage - -* **Lower values**: Fewer coded shards reduce network load but may impact reliability in lossy networks +- **Higher values**: More initial coded shards improve delivery guarantees but increase bandwidth usage +- **Lower values**: Fewer coded shards reduce network load but may impact reliability in lossy networks ### Forward Shard Threshold @@ -77,99 +72,59 @@ Controls redundancy when publishing messages. Total coded shards created = `rlnc Determines when nodes forward received coded shards. Nodes forward when they have more than `rlnc_shard_factor × threshold` coded shards. **Technical Impact**: - -* **Higher values** (0.8-0.9): More reliable forwarding, increased latency - -* **Lower values** (0.5-0.6): Faster propagation, reduced latency, potential reliability trade-offs +- **Higher values** (0.8-0.9): More reliable forwarding, increased latency +- **Lower values** (0.5-0.6): Faster propagation, reduced latency, potential reliability trade-offs ## Docker Configuration Examples ### OptimumP2P Mode (Enhanced) - ```yaml - environment: - -* NODE_MODE=optimum - - * OPTIMUM_SHARD_FACTOR=4 - - * OPTIMUM_SHARD_MULT=1.5 - - * OPTIMUM_THRESHOLD=0.75 - - * OPTIMUM_MESH_TARGET=6 - - * OPTIMUM_MESH_MIN=3 - - * OPTIMUM_MESH_MAX=12 - + - NODE_MODE=optimum + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 ``` ### GossipSub Mode (Baseline) - ```yaml - environment: - -* NODE_MODE=gossipsub - - * GOSSIPSUB_MESH_TARGET=6 - - * GOSSIPSUB_MESH_MIN=4 - - * GOSSIPSUB_MESH_MAX=12 - + - NODE_MODE=gossipsub + - GOSSIPSUB_MESH_TARGET=6 + - GOSSIPSUB_MESH_MIN=4 + - GOSSIPSUB_MESH_MAX=12 ``` ## Performance Tuning ### High Throughput Setup - Optimized for maximum message throughput: - ```yaml - -* OPTIMUM_SHARD_FACTOR=8 - -* OPTIMUM_SHARD_MULT=2.0 - -* OPTIMUM_THRESHOLD=0.5 - -* OPTIMUM_MESH_TARGET=8 - +- OPTIMUM_SHARD_FACTOR=8 +- OPTIMUM_SHARD_MULT=2.0 +- OPTIMUM_THRESHOLD=0.5 +- OPTIMUM_MESH_TARGET=8 ``` ### Low Latency Setup - Optimized for minimum delivery latency: - ```yaml - -* OPTIMUM_SHARD_FACTOR=4 - -* OPTIMUM_SHARD_MULT=1.2 - -* OPTIMUM_THRESHOLD=0.6 - -* OPTIMUM_MESH_TARGET=6 - +- OPTIMUM_SHARD_FACTOR=4 +- OPTIMUM_SHARD_MULT=1.2 +- OPTIMUM_THRESHOLD=0.6 +- OPTIMUM_MESH_TARGET=6 ``` ### High Reliability Setup - Optimized for maximum fault tolerance: - ```yaml - -* OPTIMUM_SHARD_FACTOR=16 - -* OPTIMUM_SHARD_MULT=2.5 - -* OPTIMUM_THRESHOLD=0.8 - -* OPTIMUM_MESH_TARGET=10 - +- OPTIMUM_SHARD_FACTOR=16 +- OPTIMUM_SHARD_MULT=2.5 +- OPTIMUM_THRESHOLD=0.8 +- OPTIMUM_MESH_TARGET=10 ``` ## Configuration File Format @@ -177,44 +132,33 @@ Optimized for maximum fault tolerance: Sample YAML configuration matching the actual config structure: ```yaml - # === General App Settings === - app_port: 23422 cluster_id: "production_cluster" file_storage_directory: /tmp silent_mode_enabled: false # === Protocol Settings === - enable_gossipsub: false enable_optimum_p2p: true # === PubSub Mesh Settings === - mesh_degree_target: 6 mesh_degree_min: 5 mesh_degree_max: 12 rlnc_shard_factor: 32 # number of coded shards each message is divided into # === Message Generation === - random_message_size_bytes: 3145728 # 3MB - publisher_shard_multiplier: 1.5 # coded shards multiplier for publishing - forward_shard_threshold: 0.75 # forward threshold for coded shards # === Bootstrap Nodes === - bootstrap_nodes_optimum_p2p: - -* /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample + - /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample bootstrap_nodes_gossipsub: - -* /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample - + - /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample ``` ## Protocol Mode Switching @@ -222,124 +166,81 @@ bootstrap_nodes_gossipsub: OptimumP2P supports running both protocols for comparison: **OptimumP2P Mode** (`NODE_MODE=optimum`): - -* Uses RLNC with coded shards for enhanced propagation - -* Provides early forwarding capabilities - -* Better bandwidth efficiency through network coding - -* Enhanced fault tolerance via coded shard redundancy +- Uses RLNC with coded shards for enhanced propagation +- Provides early forwarding capabilities +- Better bandwidth efficiency through network coding +- Enhanced fault tolerance via coded shard redundancy **GossipSub Mode** (`NODE_MODE=gossipsub`): - -* Standard libp2p GossipSub implementation - -* Direct message forwarding without coding - -* Lower computational overhead - -* Baseline for performance comparison +- Standard libp2p GossipSub implementation +- Direct message forwarding without coding +- Lower computational overhead +- Baseline for performance comparison ## Monitoring Configuration Verify your configuration is applied correctly: ```bash - # Check applied configuration - curl http://localhost:9090/config # Monitor mesh formation and peer connections - curl http://localhost:9090/debug/peers # Check protocol mode in logs - docker logs p2pnode-1 | grep -E "(optimum|gossipsub|coded.*shard)" # Monitor coded shard processing - docker logs p2pnode-1 | grep -E "(shard|forward|decode)" - ``` ## Configuration Constraints **Enforced by code**: - -* `mesh_degree_min <= mesh_degree_target <= mesh_degree_max` - -* `random_message_size_bytes > 0` - -* `cluster_id` must not be empty or "sample_cluster" +- `mesh_degree_min <= mesh_degree_target <= mesh_degree_max` +- `random_message_size_bytes > 0` +- `cluster_id` must not be empty or "sample_cluster" **Recommended best practices**: - -* `forward_shard_threshold` between 0.0 and 1.0 (values outside this range may cause unexpected behavior) - -* `rlnc_shard_factor > 0` (value of 0 disables RLNC functionality) - -* `publisher_shard_multiplier >= 1.0` (values < 1.0 reduce redundancy) +- `forward_shard_threshold` between 0.0 and 1.0 (values outside this range may cause unexpected behavior) +- `rlnc_shard_factor > 0` (value of 0 disables RLNC functionality) +- `publisher_shard_multiplier >= 1.0` (values < 1.0 reduce redundancy) ## Complete Docker Compose Example ```yaml - services: p2pnode-1: image: getoptimum/p2pnode:latest environment: # Protocol selection - -* NODE_MODE=optimum - - * CLUSTER_ID=p2pnode-1 - + - NODE_MODE=optimum + - CLUSTER_ID=p2pnode-1 # RLNC coded shard parameters - -* OPTIMUM_SHARD_FACTOR=4 - - * OPTIMUM_SHARD_MULT=1.5 - - * OPTIMUM_THRESHOLD=0.75 - + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 # Mesh topology - -* OPTIMUM_MESH_TARGET=6 - - * OPTIMUM_MESH_MIN=3 - - * OPTIMUM_MESH_MAX=12 - + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 # Network settings - -* OPTIMUM_PORT=7070 - - * OPTIMUM_MAX_MSG_SIZE=1048576 - - * SIDECAR_PORT=33212 - - * API_PORT=9090 - + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - SIDECAR_PORT=33212 + - API_PORT=9090 # Bootstrap configuration - -* BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} ``` ## See Also -* **[GossipSub Configuration](./gossipsub.md)** - Standard protocol parameters for comparison - -* **[P2P-Only Deployment](../deployment/p2p-only.md)** - Complete setup with configuration - -* **[Gateway + P2P Deployment](../deployment/p2p-with-gateway.md)** - Full stack configuration - -* **[OptimumP2P Technical Overview](../../learn/overview/p2p.md)** - Protocol fundamentals and RLNC details - +- **[GossipSub Configuration](./gossipsub.md)** - Standard protocol parameters for comparison +- **[P2P-Only Deployment](../deployment/p2p-only.md)** - Complete setup with configuration +- **[Gateway + P2P Deployment](../deployment/p2p-with-gateway.md)** - Full stack configuration +- **[OptimumP2P Technical Overview](../../learn/overview/p2p.md)** - Protocol fundamentals and RLNC details \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-only.md b/docs/hackathon/deployment/p2p-only.md index 888325a..f506a1b 100644 --- a/docs/hackathon/deployment/p2p-only.md +++ b/docs/hackathon/deployment/p2p-only.md @@ -2,372 +2,237 @@ This guide covers deploying a standalone OptimumP2P network without gateway intermediaries. In this configuration, clients connect directly to P2P nodes using gRPC sidecar connections, providing maximum performance and protocol flexibility. -## Network Topology -The P2P network forms a mesh topology where each node maintains connections to a subset of peers based on the configured mesh parameters: +### Network Topology -* **Mesh Target (`OPTIMUM_MESH_TARGET`)**: Ideal number of peers per topic +The P2P network forms a mesh topology where each node maintains connections to a subset of peers based on the configured mesh parameters: -* **Mesh Range (`OPTIMUM_MESH_MIN` to `OPTIMUM_MESH_MAX`)**: Acceptable peer count bounds +- **Mesh Target (`OPTIMUM_MESH_TARGET`)**: Ideal number of peers per topic +- **Mesh Range (`OPTIMUM_MESH_MIN` to `OPTIMUM_MESH_MAX`)**: Acceptable peer count bounds +- **Bootstrap Nodes**: Initial discovery points for new nodes joining the network -* **Bootstrap Nodes**: Initial discovery points for new nodes joining the network ## Deployment Configuration ```yaml - services: p2pnode-1: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - -* LOG_LEVEL=debug - - * CLUSTER_ID=p2pnode-1 - - * NODE_MODE=optimum - - * SIDECAR_PORT=33212 - - * API_PORT=9090 - - * IDENTITY_DIR=/identity - - * OPTIMUM_PORT=7070 - - * OPTIMUM_MAX_MSG_SIZE=1048576 - - * OPTIMUM_MESH_TARGET=6 - - * OPTIMUM_MESH_MIN=3 - - * OPTIMUM_MESH_MAX=12 - - * OPTIMUM_SHARD_FACTOR=4 - - * OPTIMUM_SHARD_MULT=1.5 - - * OPTIMUM_THRESHOLD=0.75 - - * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} networks: optimum-network: ipv4_address: 172.28.0.12 ports: - -* "33221:33212" # gRPC sidecar - - * "7071:7070" # OptimumP2P - - * "9091:9090" # API - + - "33221:33212" # gRPC sidecar + - "7071:7070" # OptimumP2P + - "9091:9090" # API volumes: - -* ./identity:/identity + - ./identity:/identity p2pnode-2: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - -* LOG_LEVEL=debug - - * CLUSTER_ID=p2pnode-2 - - * NODE_MODE=optimum - - * SIDECAR_PORT=33212 - - * API_PORT=9090 - - * IDENTITY_DIR=/identity - - * OPTIMUM_PORT=7070 - - * OPTIMUM_MAX_MSG_SIZE=1048576 - - * OPTIMUM_MESH_TARGET=6 - - * OPTIMUM_MESH_MIN=3 - - * OPTIMUM_MESH_MAX=12 - - * OPTIMUM_SHARD_FACTOR=4 - - * OPTIMUM_SHARD_MULT=1.5 - - * OPTIMUM_THRESHOLD=0.75 - - * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-2 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} networks: optimum-network: ipv4_address: 172.28.0.13 ports: - -* "33222:33212" - - * "7072:7070" - - * "9092:9090" + - "33222:33212" + - "7072:7070" + - "9092:9090" networks: optimum-network: driver: bridge ipam: config: - -* subnet: 172.28.0.0/16 - + - subnet: 172.28.0.0/16 ``` ## Environment Variables ### Core Configuration -* **`NODE_MODE`**: P2P protocol implementation mode - - * Purpose: Selects the underlying pub/sub protocol - - * Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) - - * Default: `optimum` - - * Usage: Use `optimum` for better performance with RLNC coding - - * Note: All nodes in network should use same mode for compatibility - -* **`CLUSTER_ID`**: Unique identifier for each P2P node - - * Purpose: Distinguishes nodes in logs, metrics, and network topology - - * Usage: Should be unique across all P2P nodes in deployment - - * Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. - - * Required: Yes, no default value - -* **`LOG_LEVEL`**: Logging verbosity level - - * Purpose: Controls the amount and detail of log output - - * Values: `debug`, `info`, `warn`, `error` - - * Default: `info` - - * Usage Guide: - - * `debug`: Most verbose, includes detailed P2P protocol events (development) - - * `info`: Standard level with operational information - - * `warn`: Only warnings and errors (quiet operation) - - * `error`: Only error messages (minimal logging) +- **`NODE_MODE`**: P2P protocol implementation mode + - Purpose: Selects the underlying pub/sub protocol + - Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) + - Default: `optimum` + - Usage: Use `optimum` for better performance with RLNC coding + - Note: All nodes in network should use same mode for compatibility + +- **`CLUSTER_ID`**: Unique identifier for each P2P node + - Purpose: Distinguishes nodes in logs, metrics, and network topology + - Usage: Should be unique across all P2P nodes in deployment + - Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. + - Required: Yes, no default value + +- **`LOG_LEVEL`**: Logging verbosity level + - Purpose: Controls the amount and detail of log output + - Values: `debug`, `info`, `warn`, `error` + - Default: `info` + - Usage Guide: + - `debug`: Most verbose, includes detailed P2P protocol events (development) + - `info`: Standard level with operational information + - `warn`: Only warnings and errors (quiet operation) + - `error`: Only error messages (minimal logging) ### Port Configuration -* **`SIDECAR_PORT`**: gRPC bidirectional communication port - - * Purpose: Port where clients connect directly to interact with P2P node - - * Default: `33212` - - * Range: Any available port - - * Usage: Must be accessible from client applications for direct P2P access - - * Network: Used for client-to-node gRPC communication - -* **`API_PORT`**: HTTP monitoring and management API port - - * Purpose: Exposes REST endpoints for health checks, node state, and metrics - - * Default: `9090` - - * Range: Any available port - - * Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` - - * Usage: Used for operational monitoring and debugging - -* **`OPTIMUM_PORT`**: P2P protocol communication port - - * Purpose: Port for peer-to-peer communication between nodes - - * Default: `7070` - - * Range: Any available port - - * Usage: Must be accessible between all P2P nodes in the mesh - - * Network: Used for inter-node OptimumP2P protocol communication +- **`SIDECAR_PORT`**: gRPC bidirectional communication port + - Purpose: Port where clients connect directly to interact with P2P node + - Default: `33212` + - Range: Any available port + - Usage: Must be accessible from client applications for direct P2P access + - Network: Used for client-to-node gRPC communication + +- **`API_PORT`**: HTTP monitoring and management API port + - Purpose: Exposes REST endpoints for health checks, node state, and metrics + - Default: `9090` + - Range: Any available port + - Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` + - Usage: Used for operational monitoring and debugging + +- **`OPTIMUM_PORT`**: P2P protocol communication port + - Purpose: Port for peer-to-peer communication between nodes + - Default: `7070` + - Range: Any available port + - Usage: Must be accessible between all P2P nodes in the mesh + - Network: Used for inter-node OptimumP2P protocol communication ### RLNC Parameters -* **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes - - * Purpose: Limits individual message size to prevent memory issues - - * Default: `1048576` (1MB) - - * Usage: Larger values allow bigger payloads but use more memory/bandwidth - +- **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes + - Purpose: Limits individual message size to prevent memory issues + - Default: `1048576` (1MB) + - Usage: Larger values allow bigger payloads but use more memory/bandwidth -* **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message - - * Purpose: Controls how many pieces each message is split into for RLNC - - * Default: `4` - - * Impact: Higher values increase redundancy and fault tolerance but use more bandwidth - - * Note: Must be non-zero to enable RLNC functionality - -* **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier - - * Purpose: Controls redundancy factor for error recovery - - * Default: `1.5` - - * Impact: Higher values improve error recovery but increase bandwidth usage - - * Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) - +- **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message + - Purpose: Controls how many pieces each message is split into for RLNC + - Default: `4` + - Impact: Higher values increase redundancy and fault tolerance but use more bandwidth + - Note: Must be non-zero to enable RLNC functionality + +- **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier + - Purpose: Controls redundancy factor for error recovery + - Default: `1.5` + - Impact: Higher values improve error recovery but increase bandwidth usage + - Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) -* **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio - - * Purpose: Fraction of shards needed before forwarding or decoding message - - * Default: `0.75` (75%) - - * Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) - - * Impact: Critical for network performance tuning - - * Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency +- **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio + - Purpose: Fraction of shards needed before forwarding or decoding message + - Default: `0.75` (75%) + - Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) + - Impact: Critical for network performance tuning + - Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency ### Mesh Topology Configuration -* **`OPTIMUM_MESH_TARGET`**: Target number of peer connections - - * Purpose: Ideal number of peers each node connects to in the mesh - - * Default: `6` - - * Range: 3-50 (typically 4-12 for most deployments) - - * Impact: Higher values increase redundancy and fault tolerance but use more resources +- **`OPTIMUM_MESH_TARGET`**: Target number of peer connections + - Purpose: Ideal number of peers each node connects to in the mesh + - Default: `6` + - Range: 3-50 (typically 4-12 for most deployments) + - Impact: Higher values increase redundancy and fault tolerance but use more resources -* **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections - * Purpose: Minimum connections before attempting to add more peers +- **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections + - Purpose: Minimum connections before attempting to add more peers + - Default: `4` + - Note: Should be less than MESH_TARGET + - Impact: Lower values reduce fault tolerance, higher values increase resource usage + - Usage: Prevents network partitioning by maintaining minimum connectivity - * Default: `4` - - * Note: Should be less than MESH_TARGET - - * Impact: Lower values reduce fault tolerance, higher values increase resource usage - - * Usage: Prevents network partitioning by maintaining minimum connectivity - -* **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections - - * Purpose: Maximum connections before pruning excess peers - - * Default: `12` - - * Note: Should be greater than MESH_TARGET - - * Impact: Prevents resource exhaustion while maintaining network connectivity - - * Usage: Sets upper bound to control memory and bandwidth usage +- **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections + - Purpose: Maximum connections before pruning excess peers + - Default: `12` + - Note: Should be greater than MESH_TARGET + - Impact: Prevents resource exhaustion while maintaining network connectivity + - Usage: Sets upper bound to control memory and bandwidth usage ### Bootstrap and Identity Configuration -* **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses - - * Purpose: List of known peers for joining the mesh network - - * Format: `/ip4//tcp//p2p/` - - * Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` - - * Usage: New nodes use these to discover and join the network - - * Multiple: Can specify multiple peers separated by commas - - * Note: At least one bootstrap peer must be accessible for network joining - -* **`IDENTITY_DIR`**: Node cryptographic identity directory - - * Purpose: Directory containing node's P2P identity key (p2p.key) - - * Default: `/identity` - - * Usage: Only needed for bootstrap nodes, other nodes auto-generate identity - - * Security: Contains private key material, should be properly secured - - * Permissions: Ensure proper file permissions (600) for security +- **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses + - Purpose: List of known peers for joining the mesh network + - Format: `/ip4//tcp//p2p/` + - Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` + - Usage: New nodes use these to discover and join the network + - Multiple: Can specify multiple peers separated by commas + - Note: At least one bootstrap peer must be accessible for network joining + +- **`IDENTITY_DIR`**: Node cryptographic identity directory + - Purpose: Directory containing node's P2P identity key (p2p.key) + - Default: `/identity` + - Usage: Only needed for bootstrap nodes, other nodes auto-generate identity + - Security: Contains private key material, should be properly secured + - Permissions: Ensure proper file permissions (600) for security ### Configuration Notes All parameter values can be adjusted based on specific use case requirements. TWhen modifying parameters: -* Higher OPTIMUM_THRESHOLD values improve reliability but increase latency - -* Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources - -* Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage - -* OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET - -* OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET +- Higher OPTIMUM_THRESHOLD values improve reliability but increase latency +- Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources +- Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage +- OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET +- OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET ## Starting the Network 1. Generate peer identity (optional, will auto-generate if not present): - ```bash - # Create identity directory - mkdir -p identity # Generate peer key - docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key - ``` -1. Set bootstrap peer ID: - +2. Set bootstrap peer ID: ```bash - export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest peer-id) - ``` -1. Start the network: - +3. Start the network: ```bash - docker-compose up -d - ``` -1. Verify nodes are running: - +4. Verify nodes are running: ```bash - docker-compose ps docker-compose logs p2pnode-1 - ``` ## Client Connection @@ -375,73 +240,50 @@ docker-compose logs p2pnode-1 Clients connect directly to P2P nodes via gRPC sidecar: ```go - conn, err := grpc.Dial("localhost:33221", grpc.WithInsecure()) if err != nil { log.Fatal(err) } client := pb.NewP2PStreamClient(conn) - ``` ## Network Scaling To add more nodes, replicate the service definition with: - -* Unique `CLUSTER_ID` - -* Unique IP address in the network - -* Unique port mappings - -* Same `BOOTSTRAP_PEERS` configuration +- Unique `CLUSTER_ID` +- Unique IP address in the network +- Unique port mappings +- Same `BOOTSTRAP_PEERS` configuration ## Monitoring Access node metrics and status: - -* Node 1: http://localhost:9091 - -* Node 2: http://localhost:9092 +- Node 1: http://localhost:9091 +- Node 2: http://localhost:9092 ## Troubleshooting ### Peer Discovery Issues - Check bootstrap peer configuration and network connectivity: - ```bash - docker-compose exec p2pnode-1 ping p2pnode-2 docker-compose logs p2pnode-1 | grep "bootstrap" - ``` ### Mesh Formation - Verify peers are discovering each other: - ```bash - curl http://localhost:9091/debug/peers - ``` ### Message Flow - Check message propagation in logs: - ```bash - docker-compose logs -f | grep "message" - ``` ## See Also -* [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters - -* [P2P with Gateway Deployment](/docs/hackathon/deployment/p2p-with-gateway.md) - Alternative deployment with gateway layer - -* [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide - +- [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters +- [P2P with Gateway Deployment](/docs/hackathon/deployment/p2p-with-gateway.md) - Alternative deployment with gateway layer +- [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-with-gateway.md b/docs/hackathon/deployment/p2p-with-gateway.md index df33331..69de61b 100644 --- a/docs/hackathon/deployment/p2p-with-gateway.md +++ b/docs/hackathon/deployment/p2p-with-gateway.md @@ -2,633 +2,397 @@ This guide covers deploying OptimumP2P with gateway services that provide HTTP/WebSocket/gRPC APIs for client applications. The gateway acts as a bridge between traditional client-server applications and the OptimumP2P network. -## Component Responsibilities -**Gateway Layer:** - -* Protocol translation (HTTP/WebSocket/gRPC ↔ libp2p) - -* Client session management - -* Load balancing across P2P nodes - -* Rate limiting and authentication +### Component Responsibilities -* API versioning and compatibility +**Gateway Layer:** +- Protocol translation (HTTP/WebSocket/gRPC ↔ libp2p) +- Client session management +- Load balancing across P2P nodes +- Rate limiting and authentication +- API versioning and compatibility **P2P Network Layer:** +- RLNC message encoding/decoding +- Mesh topology maintenance +- Peer discovery and routing +- Message propagation via GossipSub +- Network resilience and fault tolerance -* RLNC message encoding/decoding - -* Mesh topology maintenance - -* Peer discovery and routing - -* Message propagation via GossipSub - -* Network resilience and fault tolerance ## Deployment Configuration Complete setup with gateways and P2P nodes: ```yaml - services: gateway-1: image: 'getoptimum/gateway:latest' platform: linux/amd64 ports: - -* "8081:8080" # HTTP/WebSocket - - * "50051:50051" # gRPC - + - "8081:8080" # HTTP/WebSocket + - "50051:50051" # gRPC environment: - -* GATEWAY_PORT=:8080 - - * CLUSTER_ID=gateway-1 - - * ENABLE_AUTH=false - - * LOG_LEVEL=debug - - * P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 - + - GATEWAY_PORT=:8080 + - CLUSTER_ID=gateway-1 + - ENABLE_AUTH=false + - LOG_LEVEL=debug + - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 networks: optimum-network: ipv4_address: 172.28.0.10 depends_on: - -* p2pnode-1 - - * p2pnode-2 - - * p2pnode-3 - - * p2pnode-4 + - p2pnode-1 + - p2pnode-2 + - p2pnode-3 + - p2pnode-4 gateway-2: image: 'getoptimum/gateway:latest' platform: linux/amd64 ports: - -* "8082:8080" - - * "50052:50051" - + - "8082:8080" + - "50052:50051" environment: - -* GATEWAY_PORT=:8080 - - * CLUSTER_ID=gateway-2 - - * ENABLE_AUTH=false - - * LOG_LEVEL=debug - - * P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 - + - GATEWAY_PORT=:8080 + - CLUSTER_ID=gateway-2 + - ENABLE_AUTH=false + - LOG_LEVEL=debug + - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 networks: optimum-network: ipv4_address: 172.28.0.11 depends_on: - -* p2pnode-1 - - * p2pnode-2 - - * p2pnode-3 - - * p2pnode-4 + - p2pnode-1 + - p2pnode-2 + - p2pnode-3 + - p2pnode-4 p2pnode-1: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 volumes: - -* ./identity:/identity - + - ./identity:/identity environment: - -* LOG_LEVEL=debug - - * CLUSTER_ID=p2pnode-1 - - * NODE_MODE=optimum - - * SIDECAR_PORT=33212 - - * API_PORT=9090 - - * IDENTITY_DIR=/identity - - * OPTIMUM_PORT=7070 - - * OPTIMUM_MAX_MSG_SIZE=1048576 - - * OPTIMUM_MESH_TARGET=6 - - * OPTIMUM_MESH_MIN=3 - - * OPTIMUM_MESH_MAX=12 - - * OPTIMUM_SHARD_FACTOR=4 - - * OPTIMUM_SHARD_MULT=1.5 - - * OPTIMUM_THRESHOLD=0.75 - - * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} networks: optimum-network: ipv4_address: 172.28.0.12 ports: - -* "33221:33212" - - * "7071:7070" - - * "9091:9090" + - "33221:33212" + - "7071:7070" + - "9091:9090" p2pnode-2: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - -* LOG_LEVEL=debug - - * CLUSTER_ID=p2pnode-2 - - * NODE_MODE=optimum - - * SIDECAR_PORT=33212 - - * API_PORT=9090 - - * IDENTITY_DIR=/identity - - * OPTIMUM_PORT=7070 - - * OPTIMUM_MAX_MSG_SIZE=1048576 - - * OPTIMUM_MESH_TARGET=6 - - * OPTIMUM_MESH_MIN=3 - - * OPTIMUM_MESH_MAX=12 - - * OPTIMUM_SHARD_FACTOR=4 - - * OPTIMUM_SHARD_MULT=1.5 - - * OPTIMUM_THRESHOLD=0.75 - - * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-2 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} networks: optimum-network: ipv4_address: 172.28.0.13 ports: - -* "33222:33212" - - * "7072:7070" - - * "9092:9090" + - "33222:33212" + - "7072:7070" + - "9092:9090" p2pnode-3: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - -* LOG_LEVEL=debug - - * CLUSTER_ID=p2pnode-3 - - * NODE_MODE=optimum - - * SIDECAR_PORT=33212 - - * API_PORT=9090 - - * IDENTITY_DIR=/identity - - * OPTIMUM_PORT=7070 - - * OPTIMUM_MAX_MSG_SIZE=1048576 - - * OPTIMUM_MESH_TARGET=6 - - * OPTIMUM_MESH_MIN=3 - - * OPTIMUM_MESH_MAX=12 - - * OPTIMUM_SHARD_FACTOR=4 - - * OPTIMUM_SHARD_MULT=1.5 - - * OPTIMUM_THRESHOLD=0.75 - - * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-3 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} networks: optimum-network: ipv4_address: 172.28.0.14 ports: - -* "33223:33212" - - * "7073:7070" - - * "9093:9090" + - "33223:33212" + - "7073:7070" + - "9093:9090" p2pnode-4: image: 'getoptimum/p2pnode:latest' platform: linux/amd64 environment: - -* LOG_LEVEL=debug - - * CLUSTER_ID=p2pnode-4 - - * NODE_MODE=optimum - - * SIDECAR_PORT=33212 - - * API_PORT=9090 - - * IDENTITY_DIR=/identity - - * OPTIMUM_PORT=7070 - - * OPTIMUM_MAX_MSG_SIZE=1048576 - - * OPTIMUM_MESH_TARGET=6 - - * OPTIMUM_MESH_MIN=3 - - * OPTIMUM_MESH_MAX=12 - - * OPTIMUM_SHARD_FACTOR=4 - - * OPTIMUM_SHARD_MULT=1.5 - - * OPTIMUM_THRESHOLD=0.75 - - * BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-4 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} networks: optimum-network: ipv4_address: 172.28.0.15 ports: - -* "33224:33212" - - * "7074:7070" - - * "9094:9090" + - "33224:33212" + - "7074:7070" + - "9094:9090" networks: optimum-network: driver: bridge ipam: config: - -* subnet: 172.28.0.0/16 - + - subnet: 172.28.0.0/16 ``` ## P2P Node Environment Variables ### Core P2P Configuration -* **`CLUSTER_ID`**: Unique identifier for each P2P node - - * Purpose: Distinguishes nodes in logs, metrics, and network topology - - * Usage: Should be unique across all P2P nodes in deployment - - * Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. - - * Required: Yes, no default value - -* **`NODE_MODE`**: P2P protocol implementation mode - - * Purpose: Selects the underlying pub/sub protocol - - * Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) - - * Default: `optimum` - - * Usage: Use `optimum` for better performance with RLNC coding - - * Note: All nodes in network should use same mode for compatibility - -* **`SIDECAR_PORT`**: gRPC bidirectional communication port - - * Purpose: Port where gateways and clients connect to interact with P2P node - - * Default: `33212` - - * Range: Any available port (1024-65535) - - * Usage: Must be accessible from gateway containers for internal communication - - * Network: Used for internal container-to-container communication - -* **`API_PORT`**: HTTP monitoring and management API port - - * Purpose: Exposes REST endpoints for health checks, node state, and metrics - - * Default: `8081` for gateway, `9090` for P2P nodes (varies by component) - - * Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` - - * Usage: Used for operational monitoring and debugging +- **`CLUSTER_ID`**: Unique identifier for each P2P node + - Purpose: Distinguishes nodes in logs, metrics, and network topology + - Usage: Should be unique across all P2P nodes in deployment + - Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. + - Required: Yes, no default value + +- **`NODE_MODE`**: P2P protocol implementation mode + - Purpose: Selects the underlying pub/sub protocol + - Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) + - Default: `optimum` + - Usage: Use `optimum` for better performance with RLNC coding + - Note: All nodes in network should use same mode for compatibility + +- **`SIDECAR_PORT`**: gRPC bidirectional communication port + - Purpose: Port where gateways and clients connect to interact with P2P node + - Default: `33212` + - Range: Any available port (1024-65535) + - Usage: Must be accessible from gateway containers for internal communication + - Network: Used for internal container-to-container communication + +- **`API_PORT`**: HTTP monitoring and management API port + - Purpose: Exposes REST endpoints for health checks, node state, and metrics + - Default: `8081` for gateway, `9090` for P2P nodes (varies by component) + - Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` + - Usage: Used for operational monitoring and debugging ### Network Discovery Configuration -* **`IDENTITY_DIR`**: Node cryptographic identity directory +- **`IDENTITY_DIR`**: Node cryptographic identity directory + - Purpose: Directory containing node's P2P identity key (p2p.key) + - Default: `/identity` + - Usage: Only needed for bootstrap nodes, other nodes auto-generate identity + - Security: Contains private key material, should be properly secured - * Purpose: Directory containing node's P2P identity key (p2p.key) - - * Default: `/identity` - - * Usage: Only needed for bootstrap nodes, other nodes auto-generate identity - - * Security: Contains private key material, should be properly secured - -* **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses - - * Purpose: List of known peers for joining the mesh network - - * Format: `/ip4//tcp//p2p/` - - * Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` - - * Usage: New nodes use these to discover and join the network - - * Multiple: Can specify multiple peers separated by commas +- **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses + - Purpose: List of known peers for joining the mesh network + - Format: `/ip4//tcp//p2p/` + - Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` + - Usage: New nodes use these to discover and join the network + - Multiple: Can specify multiple peers separated by commas ### OptimumP2P Protocol Configuration -* **`OPTIMUM_PORT`**: P2P protocol communication port +- **`OPTIMUM_PORT`**: P2P protocol communication port + - Purpose: Port for peer-to-peer communication between nodes + - Default: `7070` + - Range: Any available port, commonly 7070-7080 + - Usage: Must be accessible between all P2P nodes in the mesh + - Network: Used for inter-node OptimumP2P protocol communication - * Purpose: Port for peer-to-peer communication between nodes - - * Default: `7070` - - * Range: Any available port, commonly 7070-7080 - - * Usage: Must be accessible between all P2P nodes in the mesh - - * Network: Used for inter-node OptimumP2P protocol communication - -* **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes - - * Purpose: Limits individual message size to prevent memory issues - - * Default: `1048576` (1MB) - - * Usage: Larger values allow bigger payloads but use more memory/bandwidth +- **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes + - Purpose: Limits individual message size to prevent memory issues + - Default: `1048576` (1MB) + - Usage: Larger values allow bigger payloads but use more memory/bandwidth ### RLNC (Random Linear Network Coding) Configuration -* **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message - - * Purpose: Controls how many pieces each message is split into for RLNC - - * Default: `4` - - * Impact: Higher values increase redundancy and fault tolerance but use more bandwidth - - * Note: Must be non-zero to enable RLNC functionality - -* **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier - - * Purpose: Controls redundancy factor for error recovery - - * Default: `1.5` - - * Impact: Higher values improve error recovery but increase bandwidth usage - - * Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) - -* **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio - - * Purpose: Fraction of shards needed before forwarding or decoding message - - * Default: `0.75` (75%) - - * Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) - - * Impact: Critical for network performance tuning - - * Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency +- **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message + - Purpose: Controls how many pieces each message is split into for RLNC + - Default: `4` + - Impact: Higher values increase redundancy and fault tolerance but use more bandwidth + - Note: Must be non-zero to enable RLNC functionality + +- **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier + - Purpose: Controls redundancy factor for error recovery + - Default: `1.5` + - Impact: Higher values improve error recovery but increase bandwidth usage + - Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) + +- **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio + - Purpose: Fraction of shards needed before forwarding or decoding message + - Default: `0.75` (75%) + - Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) + - Impact: Critical for network performance tuning + - Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency ### Mesh Topology Configuration -* **`OPTIMUM_MESH_TARGET`**: Target number of peer connections - - * Purpose: Ideal number of peers each node connects to in the mesh - - * Default: `6` - - * Impact: Higher values increase redundancy and fault tolerance but use more resources - - * Scaling: Adjust based on network size and reliability requirements - -* **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections - - * Purpose: Minimum connections before attempting to add more peers - - * Default: `4` - - * Note: Should be less than `MESH_TARGET` - - * Impact: Lower values reduce fault tolerance, higher values increase resource usage - - * Usage: Prevents network partitioning by maintaining minimum connectivity - -* **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections - - * Purpose: Maximum connections before pruning excess peers - - * Default: `12` - - * Note: Should be greater than `MESH_TARGET` - - * Impact: Prevents resource exhaustion while maintaining network connectivity - - * Usage: Sets upper bound to control memory and bandwidth usage +- **`OPTIMUM_MESH_TARGET`**: Target number of peer connections + - Purpose: Ideal number of peers each node connects to in the mesh + - Default: `6` + - Impact: Higher values increase redundancy and fault tolerance but use more resources + - Scaling: Adjust based on network size and reliability requirements + +- **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections + - Purpose: Minimum connections before attempting to add more peers + - Default: `4` + - Note: Should be less than `MESH_TARGET` + - Impact: Lower values reduce fault tolerance, higher values increase resource usage + - Usage: Prevents network partitioning by maintaining minimum connectivity + +- **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections + - Purpose: Maximum connections before pruning excess peers + - Default: `12` + - Note: Should be greater than `MESH_TARGET` + - Impact: Prevents resource exhaustion while maintaining network connectivity + - Usage: Sets upper bound to control memory and bandwidth usage ### Configuration Notes All parameter values can be adjusted based on specific use case requirements. When modifying parameters: -* Higher OPTIMUM_THRESHOLD values improve reliability but increase latency - -* Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources - -* Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage - -* OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET - -* OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET +- Higher OPTIMUM_THRESHOLD values improve reliability but increase latency +- Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources +- Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage +- OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET +- OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET ## Gateway Configuration ### Environment Variables -* **`GATEWAY_PORT`**: HTTP/WebSocket server port (default: `:8080`) - - * Purpose: Defines the port where the gateway listens for client connections - - * Usage: Internal container port for REST API and WebSocket connections - - * Example: `:8080`, `:3000`, `:8081` - - * Note: External port mapping is configured separately in docker-compose ports section - -* **`CLUSTER_ID`**: Unique gateway identifier - - * Purpose: Distinguishes between multiple gateway instances in logs, metrics, and monitoring - - * Usage: Should be unique across all gateway instances in your deployment - - * Format: Alphanumeric string, no spaces - - * Example: `gateway-1`, `gateway-primary`, `gateway-us-east` - - * Required: Yes, no default value - -* **`ENABLE_AUTH`**: Enable Auth0 JWT authentication (true/false) - - * Purpose: Controls whether API requests require JWT authentication - - * Usage: Set to `false` for development/testing, `true` for production - - * Values: `true` (requires valid JWT tokens) or `false` (open access) - - * Default: `false` - - * Note: When `true`, requires additional Auth0 configuration (AUTH0_DOMAIN, AUTH0_AUDIENCE) - -* **`P2P_NODES`**: Comma-separated list of P2P node gRPC sidecar addresses - - * Purpose: Defines which P2P nodes the gateway can connect to for message routing - - * Format: `hostname:port,hostname:port,...` - - * Usage: Gateway load-balances requests across these nodes for high availability - - * Port: Should match SIDECAR_PORT of P2P nodes (typically 33212) - - * Example: `p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212` - - * Behavior: Gateway attempts to connect to all listed nodes and routes to healthy ones - -* **`LOG_LEVEL`**: Logging verbosity level - - * Purpose: Controls the amount and detail of log output - - * Values: `debug`, `info`, `warn`, `error` - - * Default: `info` - - * Usage Guide: - - * `debug`: Most verbose, includes request/response details, connection events (development) - - * `info`: Standard production level with operational information - - * `warn`: Only warnings and errors (quiet production) - - * `error`: Only error messages (minimal logging) - - * Performance: Higher verbosity may impact performance and storage +- **`GATEWAY_PORT`**: HTTP/WebSocket server port (default: `:8080`) + - Purpose: Defines the port where the gateway listens for client connections + - Usage: Internal container port for REST API and WebSocket connections + - Example: `:8080`, `:3000`, `:8081` + - Note: External port mapping is configured separately in docker-compose ports section + +- **`CLUSTER_ID`**: Unique gateway identifier + - Purpose: Distinguishes between multiple gateway instances in logs, metrics, and monitoring + - Usage: Should be unique across all gateway instances in your deployment + - Format: Alphanumeric string, no spaces + - Example: `gateway-1`, `gateway-primary`, `gateway-us-east` + - Required: Yes, no default value + +- **`ENABLE_AUTH`**: Enable Auth0 JWT authentication (true/false) + - Purpose: Controls whether API requests require JWT authentication + - Usage: Set to `false` for development/testing, `true` for production + - Values: `true` (requires valid JWT tokens) or `false` (open access) + - Default: `false` + - Note: When `true`, requires additional Auth0 configuration (AUTH0_DOMAIN, AUTH0_AUDIENCE) + +- **`P2P_NODES`**: Comma-separated list of P2P node gRPC sidecar addresses + - Purpose: Defines which P2P nodes the gateway can connect to for message routing + - Format: `hostname:port,hostname:port,...` + - Usage: Gateway load-balances requests across these nodes for high availability + - Port: Should match SIDECAR_PORT of P2P nodes (typically 33212) + - Example: `p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212` + - Behavior: Gateway attempts to connect to all listed nodes and routes to healthy ones + +- **`LOG_LEVEL`**: Logging verbosity level + - Purpose: Controls the amount and detail of log output + - Values: `debug`, `info`, `warn`, `error` + - Default: `info` + - Usage Guide: + - `debug`: Most verbose, includes request/response details, connection events (development) + - `info`: Standard production level with operational information + - `warn`: Only warnings and errors (quiet production) + - `error`: Only error messages (minimal logging) + - Performance: Higher verbosity may impact performance and storage ### Authentication (Optional) - For production deployments, enable authentication: - ```yaml - environment: - -* ENABLE_AUTH=true - - * AUTH0_DOMAIN=your-domain.auth0.com - - * AUTH0_AUDIENCE=your-api-audience - + - ENABLE_AUTH=true + - AUTH0_DOMAIN=your-domain.auth0.com + - AUTH0_AUDIENCE=your-api-audience ``` ## API Endpoints ### HTTP REST API - -* `POST /publish` - Publish message to topic - -* `GET /health` - Gateway health check - -* `GET /metrics` - Prometheus metrics +- `POST /publish` - Publish message to topic +- `GET /health` - Gateway health check +- `GET /metrics` - Prometheus metrics ### WebSocket API - -* `ws://localhost:8081/ws` - WebSocket connection for real-time messaging +- `ws://localhost:8081/ws` - WebSocket connection for real-time messaging ### gRPC API - -* `localhost:50051` - Bidirectional streaming service +- `localhost:50051` - Bidirectional streaming service ## Starting the Network 1. Generate peer identity: - ```bash - mkdir -p identity export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key --output-peer-id) - ``` -1. Start all services: - +2. Start all services: ```bash - docker-compose up -d - ``` -1. Verify services: - +3. Verify services: ```bash - docker-compose ps curl http://localhost:8081/health - ``` ## Client Examples ### HTTP REST - ```bash - curl -X POST http://localhost:8081/publish \ -H "Content-Type: application/json" \ -d '{"topic": "test", "data": "Hello OptimumP2P"}' - ``` ### WebSocket (JavaScript) - ```javascript - const ws = new WebSocket('ws://localhost:8081/ws'); ws.onopen = () => { ws.send(JSON.stringify({ @@ -636,82 +400,56 @@ ws.onopen = () => { topic: 'test' })); }; - ``` ### gRPC (Go) - ```go - conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) client := pb.NewGatewayStreamClient(conn) stream, err := client.Stream(context.Background()) - ``` ## Monitoring ### Gateway Metrics - -* Gateway 1: http://localhost:8081/metrics - -* Gateway 2: http://localhost:8082/metrics +- Gateway 1: http://localhost:8081/metrics +- Gateway 2: http://localhost:8082/metrics ### P2P Node Status - -* Node 1: http://localhost:9091 - -* Node 2: http://localhost:9092 - -* Node 3: http://localhost:9093 - -* Node 4: http://localhost:9094 +- Node 1: http://localhost:9091 +- Node 2: http://localhost:9092 +- Node 3: http://localhost:9093 +- Node 4: http://localhost:9094 ## Scaling Considerations Scale the P2P network by adding more nodes: - -* Maintain OPTIMUM_MESH_TARGET ratio to network size - -* Consider network topology and latency - -* Monitor mesh formation and message propagation +- Maintain OPTIMUM_MESH_TARGET ratio to network size +- Consider network topology and latency +- Monitor mesh formation and message propagation ## Troubleshooting ### Gateway Connection Issues - ```bash - # Check gateway logs - docker-compose logs gateway-1 # Test P2P node connectivity - docker-compose exec gateway-1 nc -zv p2pnode-1 33212 - ``` -## Message Delivery Issues - +### Message Delivery Issues ```bash - # Check message flow - docker-compose logs -f | grep -E "(publish|subscribe|message)" # Verify P2P mesh status - curl http://localhost:9091/debug/peers - ``` ## See Also -* [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters - -* [P2P-Only Deployment](/docs/hackathon/deployment/p2p-only.md) - Alternative deployment without gateways - -* [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide - +- [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters +- [P2P-Only Deployment](/docs/hackathon/deployment/p2p-only.md) - Alternative deployment without gateways +- [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index f9c8641..8e00202 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -11,7 +11,6 @@ OptimumP2P is a novel gossip algorithm that uses [Random Linear Network Coding ( Get OptimumP2P running in under 5 minutes: 1. **[Installation](./quick-start/installation.md)** - Set up Docker and dependencies - 2. **[First Message](./quick-start/first-message.md)** - Publish and receive your first message ## Deployment Options @@ -19,60 +18,50 @@ Get OptimumP2P running in under 5 minutes: Choose your deployment strategy: ### P2P Network Only - -* **[P2P-Only Deployment](./deployment/p2p-only.md)** - Deploy just the P2P nodes for direct integration +- **[P2P-Only Deployment](./deployment/p2p-only.md)** - Deploy just the P2P nodes for direct integration ### Gateway + P2P Network - -* **[Gateway + P2P Deployment](./deployment/p2p-with-gateway.md)** - Full stack with REST/WebSocket APIs +- **[Gateway + P2P Deployment](./deployment/p2p-with-gateway.md)** - Full stack with REST/WebSocket APIs ## Client Integration Connect to OptimumP2P using various client methods: -* **[mump2p-cli](./clients/)** - Command-line client for testing and automation - -* **[gRPC Clients](./clients/)** - Direct gRPC integration examples - -* **[REST/WebSocket APIs](./clients/)** - Gateway-based client integration +- **[mump2p-cli](./clients/)** - Command-line client for testing and automation +- **[gRPC Clients](./clients/)** - Direct gRPC integration examples +- **[REST/WebSocket APIs](./clients/)** - Gateway-based client integration ## Configuration Fine-tune OptimumP2P for your use case: -* **[OptimumP2P Configuration](./configuration/optimump2p.md)** - RLNC parameters, mesh topology, and performance tuning - -* **[GossipSub Configuration](./configuration/gossipsub.md)** - Standard GossipSub parameters for comparison +- **[OptimumP2P Configuration](./configuration/optimump2p.md)** - RLNC parameters, mesh topology, and performance tuning +- **[GossipSub Configuration](./configuration/gossipsub.md)** - Standard GossipSub parameters for comparison ## Performance & Comparison Benchmark and compare OptimumP2P: -* **[Metrics Collection](./clients/)** - Understanding performance metrics - -* **[OptimumP2P vs GossipSub](./clients/)** - Performance comparison methodology +- **[Metrics Collection](./clients/)** - Understanding performance metrics +- **[OptimumP2P vs GossipSub](./clients/)** - Performance comparison methodology ## Docker Images Used The hackathon uses these pre-built Docker images: -* **`getoptimum/p2pnode:latest`** - Core P2P node with OptimumP2P protocol - -* **`getoptimum/gateway:latest`** - Gateway service for client APIs +- **`getoptimum/p2pnode:latest`** - Core P2P node with OptimumP2P protocol +- **`getoptimum/gateway:latest`** - Gateway service for client APIs Both images support protocol switching: - -* `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) - -* `NODE_MODE=gossipsub` - Standard GossipSub for comparison +- `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) +- `NODE_MODE=gossipsub` - Standard GossipSub for comparison ## Architecture Deep Dive For developers and integrators: -* **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** - Complete technical specification +- **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** - Complete technical specification --- -**Ready to get started?** Begin with **[Installation](./quick-start/installation.md)** or dive into the **[Technical Overview](../learn/overview/p2p.md)**. - +**Ready to get started?** Begin with **[Installation](./quick-start/installation.md)** or dive into the **[Technical Overview](../learn/overview/p2p.md)**. \ No newline at end of file diff --git a/docs/hackathon/quick-start/first-message.md b/docs/hackathon/quick-start/first-message.md index 0f97968..e7974ea 100644 --- a/docs/hackathon/quick-start/first-message.md +++ b/docs/hackathon/quick-start/first-message.md @@ -4,32 +4,24 @@ This tutorial demonstrates how to send your first message through OptimumP2P usi ## Prerequisites -* Docker and Docker Compose installed - -* Basic familiarity with terminal/command line - -* Text editor for creating configuration files +- Docker and Docker Compose installed +- Basic familiarity with terminal/command line +- Text editor for creating configuration files ## Step 1: Set Up the Network Create a working directory and use the provided docker-compose configuration: ```bash - mkdir optimump2p-test cd optimump2p-test - ``` Download the complete setup: - ```bash - # Clone the development setup repository - git clone https://github.com/getoptimum/optimum-dev-setup-guide.git cd optimum-dev-setup-guide - ``` Or create your own `docker-compose.yml` using the configuration from the [P2P Network with Gateway](../deployment/p2p-with-gateway.md) guide. @@ -39,55 +31,40 @@ Or create your own `docker-compose.yml` using the configuration from the [P2P Ne Generate the required peer identity: ```bash - # Create identity directory if using local setup - mkdir -p identity # Set the bootstrap peer ID environment variable - export BOOTSTRAP_PEER_ID=12D3KooWExample # This will be generated automatically - ``` Start all services: ```bash - docker-compose up -d - ``` Verify the services are running: ```bash - docker-compose ps - ``` You should see containers for: - -* gateway-1 (port 8081) - -* gateway-2 (port 8082) - -* p2pnode-1, p2pnode-2, p2pnode-3, p2pnode-4 +- gateway-1 (port 8081) +- gateway-2 (port 8082) +- p2pnode-1, p2pnode-2, p2pnode-3, p2pnode-4 ## Step 3: Test Gateway Connectivity The gateway provides REST API endpoints for publishing and subscribing. Test connectivity: ```bash - # Test gateway-1 - curl -I http://localhost:8081 # Test gateway-2 - curl -I http://localhost:8082 - ``` ## Step 4: Build the Gateway Client @@ -95,10 +72,8 @@ curl -I http://localhost:8082 The repository includes a Go client for interacting with the gateway: ```bash - cd grpc_gateway_client go build -o gateway-client ./gateway_client.go - ``` ## Step 5: Subscribe to Messages @@ -106,19 +81,13 @@ go build -o gateway-client ./gateway_client.go In one terminal window, start a subscriber: ```bash - # Subscribe to topic "demo" with threshold 0.7 - ./script/gateway_client.sh subscribe demo 0.7 - ``` The subscriber will: - 1. Register with the gateway via REST API (`/api/subscribe`) - 2. Open a gRPC stream to receive messages - 3. Display received messages in the format: `[RECEIVED] Topic: | Message: ` ## Step 6: Publish Messages @@ -126,17 +95,12 @@ The subscriber will: In another terminal window, publish messages: ```bash - # Publish 5 messages to topic "demo" with threshold 0.5 - ./script/gateway_client.sh publish demo 0.5 5 - ``` The publisher will: - 1. Send messages via REST API (`/api/publish`) - 2. Display each published message in the format: `[PUBLISH] Message: ` ## Step 7: Alternative REST API Usage @@ -144,33 +108,25 @@ The publisher will: You can also interact directly with the REST API using curl: ### Subscribe via REST (requires separate gRPC stream for receiving) - ```bash - curl -X POST http://localhost:8081/api/subscribe \ -H "Content-Type: application/json" \ -d '{ - "client_id": "test_client_001", "topic": "demo", "threshold": 0.7 }' - ``` ### Publish via REST - ```bash - curl -X POST http://localhost:8081/api/publish \ -H "Content-Type: application/json" \ -d '{ - "client_id": "test_client_001", "topic": "demo", "message": "Hello from REST API" }' - ``` ## Step 8: Multiple Topics @@ -178,23 +134,17 @@ curl -X POST http://localhost:8081/api/publish \ Test topic isolation by using different topic names: ```bash - # Terminal 1: Subscribe to "weather" - ./script/gateway_client.sh subscribe weather 0.7 # Terminal 2: Subscribe to "news" - ./script/gateway_client.sh subscribe news 0.7 # Terminal 3: Publish to "weather" - ./script/gateway_client.sh publish weather 0.5 3 # Terminal 4: Publish to "news" - ./script/gateway_client.sh publish news 0.5 3 - ``` Each subscriber will only receive messages from their subscribed topic. @@ -204,73 +154,50 @@ Each subscriber will only receive messages from their subscribed topic. Test network performance with higher message volumes: ```bash - # High-frequency publishing (100 messages with 100ms delay) - ./gateway-client -topic=performance -threshold=0.5 -count=100 -delay=100ms # Stress test (1000 messages) - ./gateway-client -topic=stress -threshold=0.5 -count=1000 -delay=10ms - ``` ## Understanding the Parameters ### Threshold - The threshold parameter (0.0 to 1.0) controls RLNC decoding: - -* Lower values: Messages decoded with fewer shards (faster, less reliable) - -* Higher values: Messages require more shards (slower, more reliable) - -* Typical range: 0.5 to 0.8 +- Lower values: Messages decoded with fewer shards (faster, less reliable) +- Higher values: Messages require more shards (slower, more reliable) +- Typical range: 0.5 to 0.8 ### Client ID - Each client needs a unique identifier for the gateway to track subscriptions and route messages correctly. ### Topic Names - -* Case-sensitive strings - -* No special characters recommended - -* Use descriptive names (e.g., "chat", "alerts", "data-feed") +- Case-sensitive strings +- No special characters recommended +- Use descriptive names (e.g., "chat", "alerts", "data-feed") ## Monitoring and Debugging ### View logs - ```bash - # Gateway logs - docker-compose logs -f gateway-1 # P2P node logs - docker-compose logs -f p2pnode-1 # All logs - docker-compose logs -f - ``` -## Check network connectivity - +### Check network connectivity ```bash - # Test P2P node connectivity - docker-compose exec gateway-1 nc -zv p2pnode-1 33212 # View container network - docker network inspect optimum-dev-setup-guide_optimum-network - ``` ## Cleanup @@ -278,13 +205,10 @@ docker network inspect optimum-dev-setup-guide_optimum-network Stop and remove all containers: ```bash - docker-compose down # Remove volumes and images (optional) - docker-compose down -v --rmi all - ``` ## Next Steps @@ -292,40 +216,26 @@ docker-compose down -v --rmi all Now that you've successfully sent messages through OptimumP2P: 1. **Build custom clients**: Explore the [Client Development](../clients/) guides - 2. **Optimize configuration**: Learn about [OptimumP2P Configuration](../configuration/optimump2p.md) - 3. **Compare protocols**: Review [GossipSub Configuration](../configuration/gossipsub.md) ## Troubleshooting ### Build failures - -* Ensure Go is installed: `go version` - -* Check module dependencies: `go mod tidy` +- Ensure Go is installed: `go version` +- Check module dependencies: `go mod tidy` ### Connection issues - -* Verify Docker containers are running: `docker-compose ps` - -* Check port availability: `netstat -an | grep 8081` - -* Review firewall settings +- Verify Docker containers are running: `docker-compose ps` +- Check port availability: `netstat -an | grep 8081` +- Review firewall settings ### Message delivery issues - -* Verify topic names match exactly - -* Check threshold values are between 0.0 and 1.0 - -* Review gateway and P2P node logs for errors +- Verify topic names match exactly +- Check threshold values are between 0.0 and 1.0 +- Review gateway and P2P node logs for errors ### Performance issues - -* Monitor container resources: `docker stats` - -* Adjust message delay parameters - -* Check network bandwidth and latency - +- Monitor container resources: `docker stats` +- Adjust message delay parameters +- Check network bandwidth and latency \ No newline at end of file diff --git a/docs/hackathon/quick-start/installation.md b/docs/hackathon/quick-start/installation.md index cde2da3..181978f 100644 --- a/docs/hackathon/quick-start/installation.md +++ b/docs/hackathon/quick-start/installation.md @@ -7,43 +7,32 @@ This guide will help you install and set up OptimumP2P on your computer. We'll e Before we start, you need these programs on your computer: ### 1. Docker - Docker is like a virtual container that runs applications in an isolated environment. Think of it as a box where we put our OptimumP2P network so it doesn't interfere with other programs on your computer. **Install Docker:** - -* **Windows/Mac**: Download Docker Desktop from [docker.com](https://www.docker.com/products/docker-desktop/) - -* **Linux**: Follow the instructions for your distribution on [docs.docker.com](https://docs.docker.com/engine/install/) +- **Windows/Mac**: Download Docker Desktop from [docker.com](https://www.docker.com/products/docker-desktop/) +- **Linux**: Follow the instructions for your distribution on [docs.docker.com](https://docs.docker.com/engine/install/) **How to check if Docker is installed:** - Open your terminal (Command Prompt on Windows, Terminal on Mac/Linux) and type: - ```bash - docker --version - ``` -### 2. Docker Compose +### 2. Docker Compose Docker Compose helps us run multiple Docker containers together. It usually comes with Docker Desktop, but let's verify: ```bash - docker-compose --version - ``` -### 3. Git (Optional but recommended) +### 3. Git (Optional but recommended) Git helps you download and manage code. Most computers have it pre-installed. ```bash - git --version - ``` ## Getting the Code @@ -51,16 +40,12 @@ git --version You have two options to get the OptimumP2P setup files: ### Option 1: Download from this documentation - Create a new folder on your computer and save the docker-compose.yml files from the [Deployment Options](../deployment/) section. ### Option 2: Clone the development setup repository - ```bash - git clone https://github.com/getoptimum/optimum-dev-setup-guide.git cd optimum-dev-setup-guide - ``` ## What's Next? @@ -68,65 +53,43 @@ cd optimum-dev-setup-guide Now that you have everything installed: 1. **Learn the basics**: Read [Core Concepts](./concepts.md) to understand how OptimumP2P works - 2. **Try it out**: Follow [First Message Example](./first-message.md) to send your first message - 3. **Build something**: Check out [Client Development](../clients/) to create your own application ## Troubleshooting ### "Docker command not found" - -* Make sure Docker is installed and running - -* On Windows/Mac, start Docker Desktop application - -* You might need to restart your terminal after installation +- Make sure Docker is installed and running +- On Windows/Mac, start Docker Desktop application +- You might need to restart your terminal after installation ### "Permission denied" on Linux - Add your user to the docker group: - ```bash - sudo usermod -aG docker $USER - ``` - Then log out and log back in. ### "Port already in use" - If you see port conflicts, either: - -* Stop other programs using those ports - -* Change the port numbers in the docker-compose.yml file +- Stop other programs using those ports +- Change the port numbers in the docker-compose.yml file ### Still having issues? - -* Check Docker's own troubleshooting guide - -* Make sure you have enough disk space (at least 2GB free) - -* Restart your computer and try again +- Check Docker's own troubleshooting guide +- Make sure you have enough disk space (at least 2GB free) +- Restart your computer and try again ## System Requirements **Minimum:** - -* 4GB RAM - -* 2GB free disk space - -* Internet connection for downloading Docker images +- 4GB RAM +- 2GB free disk space +- Internet connection for downloading Docker images **Recommended:** +- 8GB RAM +- 5GB free disk space +- Stable internet connection -* 8GB RAM - -* 5GB free disk space - -* Stable internet connection - -You're now ready to start your OptimumP2P journey! +You're now ready to start your OptimumP2P journey! \ No newline at end of file From 7ae62bff7e1358943b16423e5c1a4d2702977a16 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Fri, 1 Aug 2025 16:57:23 +0530 Subject: [PATCH 14/46] feat: Complete Task 3 client documentation and improve navigation --- .vitepress/config.mts | 107 +++--- docs/hackathon/clients/grpc-examples.md | 390 ++++++++++++++++++++ docs/hackathon/clients/mump2p-cli.md | 207 +++++++++++ docs/hackathon/overview.md | 5 +- docs/hackathon/quick-start/first-message.md | 2 +- 5 files changed, 649 insertions(+), 62 deletions(-) create mode 100644 docs/hackathon/clients/grpc-examples.md create mode 100644 docs/hackathon/clients/mump2p-cli.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 5963ddd..1bf3d18 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -184,7 +184,51 @@ function nav() { function sidebarHome() { return [ { - text: "Hackathon", + text: "Learn", + collapsed: false, + items: [ + { + text: "Overview of Optimum", + collapsed: true, + items: [ + { + text: "Introduction", + link: "/docs/learn/overview/intro", + }, + { + text: "OptimumP2P", + link: "/docs/learn/overview/p2p.md", + }, + { + text: "Optimum DeRAM", + link: "/docs/learn/overview/deram.md", + }, + ], + }, + // { + // text: "OptimumP2P", + // collapsed: true, + // items: [ + // ], + // }, + // { + // text: "MUM", + // collapsed: true, + // items: [ + // { + // text: "Overview of MUM", + // link: "/docs/learn/mum", + // }, + // { + // text: "How to stake MUM", + // link: "/docs/learn/how-to-stake-mum", + // }, + // ], + // }, + ], + }, + { + text: "Hackathon Docs", collapsed: false, items: [ { @@ -224,16 +268,12 @@ function sidebarHome() { collapsed: true, items: [ { - text: "WebSocket Client", - link: "/docs/hackathon/clients/websocket", - }, - { - text: "gRPC Stream Client", - link: "/docs/hackathon/clients/grpc", + text: "mump2p-cli", + link: "/docs/hackathon/clients/mump2p-cli", }, { - text: "mump2p-cli", - link: "/docs/hackathon/clients/cli", + text: "gRPC Client Examples", + link: "/docs/hackathon/clients/grpc-examples", }, ], }, @@ -253,55 +293,6 @@ function sidebarHome() { }, ], }, - { - text: "Learn", - collapsed: false, - items: [ - { - text: "Overview of Optimum", - collapsed: true, - items: [ - { - text: "Introduction", - link: "/docs/learn/overview/intro", - }, - { - text: "OptimumP2P", - link: "/docs/learn/overview/p2p.md", - }, - { - text: "Optimum DeRAM", - link: "/docs/learn/overview/deram.md", - }, - ], - }, - // { - // text: "OptimumP2P", - // collapsed: true, - // items: [ - // ], - // }, - // { - // text: "MUM", - // collapsed: true, - // items: [ - // { - // text: "Overview of MUM", - // link: "/docs/learn/mum", - // }, - // { - // text: "How to stake MUM", - // link: "/docs/learn/how-to-stake-mum", - // }, - // ], - // }, - ], - }, - { - text: "How-to Guides (Under Construction 🚧)", - collapsed: true, - items: [], - }, { text: "Research", collapsed: false, diff --git a/docs/hackathon/clients/grpc-examples.md b/docs/hackathon/clients/grpc-examples.md new file mode 100644 index 0000000..69a1f5d --- /dev/null +++ b/docs/hackathon/clients/grpc-examples.md @@ -0,0 +1,390 @@ +# gRPC Client Examples + +This guide demonstrates how to build and use gRPC clients for direct integration with OptimumP2P networks, covering both P2P-only and Gateway deployment scenarios. + +## Overview + +OptimumP2P provides two gRPC client integration patterns: + +1. **P2P Direct Client** - Connect directly to P2P node sidecar (for P2P-only deployments) +2. **Gateway Client** - Connect through the Gateway service (for Gateway + P2P deployments) + +## P2P Direct Client + +The P2P direct client connects to individual P2P node sidecar gRPC endpoints for direct protocol interaction. + +### Source Code Location + +``` +optimum-dev-setup-guide/grpc_p2p_client/ +├── p2p_client.go # Main client implementation +├── proto/ # Protocol buffer definitions +├── grpc/ # Generated gRPC code +└── go.mod # Go module dependencies +``` + +### Client Features + +- Direct gRPC connection to P2P node sidecar +- Real-time message publishing and subscribing +- Message trace collection for both GossipSub and OptimumP2P protocols +- Graceful shutdown handling + +### Building the P2P Client + +```bash +cd optimum-dev-setup-guide/grpc_p2p_client +go build -o p2p-client ./p2p_client.go +``` + +### Usage Examples + +#### Subscribe to a Topic + +```bash +# Basic subscription +./p2p-client -mode=subscribe -topic=test-topic -addr=localhost:33212 +``` + +#### Publish Messages + +```bash +# Publish a single message +./p2p-client -mode=publish -topic=test-topic -msg="Hello World" -addr=localhost:33212 + +# Publish multiple random messages with delay +./p2p-client -mode=publish -topic=test-topic -addr=localhost:33212 \ + -count=100 -sleep=200ms +``` + +### Using the Convenience Script + +The repository includes a helper script for easier usage: + +```bash +cd optimum-dev-setup-guide + +# Subscribe to topic +./script/p2p_client.sh 127.0.0.1:33221 subscribe test-topic + +# Publish a message +./script/p2p_client.sh 127.0.0.1:33221 publish test-topic "Hello World" + +# Publish multiple random messages +./script/p2p_client.sh 127.0.0.1:33221 publish test-topic "random" -count=100 -sleep=200ms +``` + +### P2P Client Configuration + +| Parameter | Description | Default | Example | +|-----------|-------------|---------|---------| +| `-addr` | P2P node sidecar gRPC address | `localhost:33212` | `127.0.0.1:33221` | +| `-mode` | Operation mode | `subscribe` | `subscribe`, `publish` | +| `-topic` | Topic name for pub/sub | Required | `test-topic` | +| `-msg` | Message content (publish mode) | `""` | `"Hello World"` | +| `-count` | Number of messages to publish | `1` | `100` | +| `-sleep` | Delay between messages | `1s` | `200ms`, `2s` | + +### Message Structure + +The P2P client handles messages using this structure: + +```go +type P2PMessage struct { + MessageID string // Unique identifier for the message + Topic string // Topic name where the message was published + Message []byte // Actual message data + SourceNodeID string // ID of the node that sent the message +} +``` + +### Response Types + +The client receives different response types for metrics collection: + +- `ResponseType_Message` - Actual message content +- `ResponseType_MessageTraceGossipSub` - GossipSub protocol metrics +- `ResponseType_MessageTraceOptimumP2P` - OptimumP2P protocol metrics +- `ResponseType_Unknown` - Unknown response type + +## Gateway Client + +The Gateway client connects through the Gateway service, which provides REST API registration and gRPC streaming for message delivery. + +### Source Code Location + +``` +optimum-dev-setup-guide/grpc_gateway_client/ +├── gateway_client.go # Main client implementation +├── proto/ # Protocol buffer definitions +├── grpc/ # Generated gRPC code +└── go.mod # Go module dependencies +``` + +### Client Features + +- REST API registration with threshold-based subscription +- gRPC streaming for real-time message delivery +- Automatic message publishing with configurable rate +- Load balancing across multiple gateway instances + +### Building the Gateway Client + +```bash +cd optimum-dev-setup-guide/grpc_gateway_client +go build -o gateway-client ./gateway_client.go +``` + +### Usage Examples + +#### Subscribe Only Mode + +```bash +# Basic subscription with threshold +./gateway-client -topic=demo -threshold=0.7 -subscribeOnly=true +``` + +#### Publish and Subscribe Mode + +```bash +# Publish 10 messages with 2-second delay +./gateway-client -topic=demo -threshold=0.5 -count=10 -delay=2s + +# High-frequency publishing +./gateway-client -topic=performance -threshold=0.5 -count=1000 -delay=100ms +``` + +### Using the Convenience Script + +```bash +cd optimum-dev-setup-guide + +# Subscribe to topic with threshold +./script/gateway_client.sh subscribe demo 0.7 + +# Publish messages with threshold and count +./script/gateway_client.sh publish demo 0.5 10 +``` + +### Gateway Client Configuration + +| Parameter | Description | Default | Example | +|-----------|-------------|---------|---------| +| `-topic` | Topic name for pub/sub | `demo` | `test-topic` | +| `-threshold` | Delivery threshold (0.0 to 1.0) | `0.1` | `0.7` | +| `-subscribeOnly` | Only subscribe, no publishing | `false` | `true` | +| `-count` | Number of messages to publish | `5` | `100` | +| `-delay` | Delay between message publishing | `2s` | `100ms`, `5s` | + +### Gateway Endpoints + +The Gateway client uses these endpoints: + +- **REST API**: `http://localhost:8081` (Gateway 1) / `http://localhost:8082` (Gateway 2) +- **gRPC Stream**: `localhost:50051` (default) + +### REST API Integration + +The client first registers via REST API before establishing gRPC streaming: + +```bash +# Example REST API call for subscription +curl -X POST http://localhost:8081/api/subscribe \ + -H "Content-Type: application/json" \ + -d '{ + "client_id": "test_client_001", + "topic": "demo", + "threshold": 0.7 + }' +``` + +## Performance Comparison Usage + +Both clients support metrics collection for comparing GossipSub vs OptimumP2P performance: + +### P2P Direct Client Metrics + +The P2P client receives protocol-specific trace messages: + +```go +switch resp.GetCommand() { +case protobuf.ResponseType_MessageTraceGossipSub: + // GossipSub protocol metrics +case protobuf.ResponseType_MessageTraceOptimumP2P: + // OptimumP2P protocol metrics +} +``` + +### Gateway Client Metrics + +The Gateway client provides simpler message delivery metrics suitable for application-level performance testing. + +### Example Performance Test + +```bash +# Terminal 1: Start OptimumP2P subscriber +./script/p2p_client.sh 127.0.0.1:33221 subscribe perf-test + +# Terminal 2: Start GossipSub subscriber +./script/p2p_client.sh 127.0.0.1:33222 subscribe perf-test + +# Terminal 3: Publish test messages +./script/p2p_client.sh 127.0.0.1:33221 publish perf-test "random" -count=1000 -sleep=10ms +``` + +## Integration Examples + +### Go Application Integration + +```go +package main + +import ( + "context" + "log" + "math" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + protobuf "p2p_client/grpc" +) + +func main() { + // Connect to P2P node + conn, err := grpc.NewClient("localhost:33212", + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(math.MaxInt), + grpc.MaxCallSendMsgSize(math.MaxInt), + )) + if err != nil { + log.Fatal(err) + } + defer conn.Close() + + client := protobuf.NewCommandStreamClient(conn) + stream, err := client.ListenCommands(context.Background()) + if err != nil { + log.Fatal(err) + } + + // Subscribe to topic + subReq := &protobuf.Request{ + Command: 2, // CommandSubscribeToTopic + Topic: "my-topic", + } + + if err := stream.Send(subReq); err != nil { + log.Fatal(err) + } + + // Listen for messages + for { + resp, err := stream.Recv() + if err != nil { + log.Fatal(err) + } + // Handle response... + } +} +``` + +### Protocol Buffer Definitions + +Both clients use Protocol Buffers for gRPC communication. The definitions are available in: + +- P2P Client: `optimum-dev-setup-guide/grpc_p2p_client/proto/p2p_stream.proto` +- Gateway Client: `optimum-dev-setup-guide/grpc_gateway_client/proto/gateway_stream.proto` + +## Troubleshooting + +### Connection Issues + +#### Error: `connection refused` + +``` +failed to connect to node dial tcp 127.0.0.1:33212: connect: connection refused +``` + +**Solutions:** +- Verify P2P nodes are running: `docker-compose ps` +- Check port mapping in docker-compose.yml +- Ensure correct sidecar port (typically 33212) + +### Message Delivery Issues + +#### No messages received + +**Troubleshooting:** +1. Verify topic names match exactly between publisher and subscriber +2. Check P2P node logs: `docker-compose logs p2pnode-1` +3. Ensure nodes are properly connected in mesh topology +4. Verify protocol mode consistency (all nodes using same protocol) + +#### Partial message delivery + +**For Gateway Client:** +- Adjust threshold parameter (lower values = faster delivery, less reliability) +- Check gateway connectivity to P2P nodes + +**For P2P Client:** +- Verify direct connection to healthy P2P node +- Check RLNC configuration parameters + +### Build Issues + +#### Proto generation errors + +```bash +# Regenerate gRPC code if needed +cd grpc_p2p_client +protoc --go_out=. --go-grpc_out=. proto/*.proto +``` + +#### Module dependency issues + +```bash +# Update Go modules +go mod tidy +go mod download +``` + +## Advanced Usage + +### Long-Running Subscriptions + +For production deployments, consider: + +1. **Connection monitoring**: Implement reconnection logic for network failures +2. **Message persistence**: Store received messages for reliability +3. **Load balancing**: Connect to multiple P2P nodes for redundancy +4. **Metrics collection**: Track message delivery rates and latency + +### Custom Message Formats + +Both clients support custom message formats. Modify the message structure in: + +- P2P Client: `P2PMessage` struct in `p2p_client.go` +- Gateway Client: Message handling in `gateway_client.go` + +### Integration with Other Languages + +The Protocol Buffer definitions can be used to generate client code for other languages: + +```bash +# Python +protoc --python_out=. --grpc_python_out=. proto/*.proto + +# JavaScript/Node.js +protoc --js_out=import_style=commonjs:. --grpc-web_out=import_style=commonjs,mode=grpcwebtext:. proto/*.proto + +# Java +protoc --java_out=. --grpc-java_out=. proto/*.proto +``` + +## See Also + +- [mump2p CLI Guide](./mump2p-cli.md) - Command-line client for OptimumP2P +- [P2P-Only Deployment](../deployment/p2p-only.md) - Setting up P2P nodes without gateway +- [Gateway + P2P Deployment](../deployment/p2p-with-gateway.md) - Full stack with gateway services +- [OptimumP2P Configuration](../configuration/optimump2p.md) - Protocol configuration parameters +- [GossipSub Configuration](../configuration/gossipsub.md) - Baseline protocol configuration \ No newline at end of file diff --git a/docs/hackathon/clients/mump2p-cli.md b/docs/hackathon/clients/mump2p-cli.md new file mode 100644 index 0000000..a2bf6d8 --- /dev/null +++ b/docs/hackathon/clients/mump2p-cli.md @@ -0,0 +1,207 @@ +# mump2p — OptimumP2P CLI Client + +**mump2p is the primary client entry point for interacting with OptimumP2P** — a high-performance RLNC-enhanced pubsub protocol. This command-line interface provides the easiest way to publish and subscribe to messages using the OptimumP2P protocol. + +**Source:** [https://github.com/getoptimum/mump2p-cli](https://github.com/getoptimum/mump2p-cli) + +## Installation + +Download the appropriate binary for your system from the [GitHub releases page](https://github.com/getoptimum/mump2p-cli/releases): + +- `mump2p-mac` for macOS +- `mump2p-linux` for Linux + +Make the binary executable (Mac/Linux): + +```sh +chmod +x mump2p-mac +# For convenience, you may want to rename and move to your PATH +mv mump2p-mac /usr/local/bin/mump2p +``` + +--- + +## Authentication + +### Login + +Before you can publish or subscribe to messages, you need to authenticate: + +```sh +./mump2p login +``` + +This will start the device authorization flow: + +1. A URL and a code will be displayed in your terminal +2. Open the URL in your browser +3. Enter the code when prompted +4. Complete the authentication process in the browser +5. The CLI will automatically receive and store your authentication token + +### Check Authentication Status + +To verify your current authentication status: + +```sh +./mump2p whoami +``` + +This will display: + +- Your client ID +- Token expiration time +- Token validity status +- Rate limits associated with your account + +**Important: After logging in, please share the email ID you used to sign up in the group, so we can activate your access.** + +### Refresh Token + +If your token is about to expire, you can refresh it: + +```sh +./mump2p refresh +``` + +### Logout + +To remove your stored authentication token: + +```sh +./mump2p logout +``` + +--- + +## Service URLs + +The CLI connects to different gateway servers around the world. By default, it uses the first available gateway, but you can specify a different one using the `--service-url` flag. + +For a complete list of available gateways and their locations, see: [Available Service URLs](https://github.com/getoptimum/mump2p-cli#available-service-urls) in the README. + +**Example using a specific gateway:** +```sh +./mump2p publish --topic=test --message="Hello" --service-url="http://35.221.118.95:8080" +./mump2p subscribe --topic=test --service-url="http://34.142.205.26:8080" +``` + +--- + +## Publishing Messages + +### Publish a Text Message + +To publish a simple text message to a topic: + +```sh +./mump2p publish --topic=your-topic-name --message="Your message content" +``` + +### Publish a File + +To publish the contents of a file: + +```sh +./mump2p publish --topic=your-topic-name --file=/path/to/your/file.json +``` + +Rate limits will be automatically applied based on your authentication token. + +## Subscribing to Messages + +### Basic Subscription + +To subscribe to a topic in real-time: + +```sh +./mump2p subscribe --topic=your-topic-name +``` + +This will open a WebSocket connection and display incoming messages in real-time. Press `Ctrl+C` to exit. + +### Save Messages to a File + +To persist messages to a local file while subscribing: + +```sh +./mump2p subscribe --topic=your-topic-name --persist=/path/to/save/ +``` + +If you provide just a directory path, messages will be saved to a file named `messages.log` in that directory. + +### Forward Messages to a Webhook + +To forward messages to an HTTP webhook: + +```sh +./mump2p subscribe --topic=your-topic-name --webhook=https://your-server.com/webhook +``` + +**Note: The webhook endpoint must be configured to accept POST requests.** + +#### Advanced Webhook Options + +For more control over webhook behavior: + +```sh +./mump2p subscribe --topic=your-topic-name \ + --webhook=https://your-server.com/webhook \ + --webhook-queue-size=200 \ + --webhook-timeout=5 + ``` + +Options: + +- `--webhook-queue-size`: Maximum number of messages to queue before dropping (default: `100`) +- `--webhook-timeout`: Timeout in seconds for each webhook POST request (default: `3`) + +### Combine Persistence and Webhook + +You can both save messages locally and forward them to a webhook: + +```sh +./mump2p subscribe --topic=your-topic-name \ + --persist=/path/to/messages.log \ + --webhook=https://your-server.com/webhook +``` + +--- + +## Checking Usage and Limits + +To see your current usage statistics and rate limits: + +```sh +./mump2p usage +``` + +This will display: + +- Number of publish operations (per hour and per second) +- Data usage (bytes, KB, or MB depending on amount) +- Quota limits +- Time until usage counters reset +- Timestamps of your last publish and subscribe operations + +## Tips for Effective Use + +1. **Topic Names:** Choose descriptive and unique topic names to avoid message conflicts +2. **Message Size:** Be aware of your maximum message size limit when publishing files +3. **Token Refresh:** For long-running operations, refresh your token before it expires +4. **Persistent Subscriptions:** Use the --persist option when you need a record of messages +5. **Webhook Reliability:** Increase the queue size for high-volume topics to prevent message drops + +## Troubleshooting + +- **Authentication Errors:** Run mump2p whoami to check token status, and mump2p login to re-authenticate +- **Rate Limit Errors:** Use mump2p usage to check your current usage against limits +- **Connection Issues:** Verify your internet connection and firewall settings +- **Webhook Failures:** Check that your webhook endpoint is accessible and properly configured to accept POST requests + +## See Also + +- [gRPC Client Examples](./grpc-examples.md) - Direct gRPC integration examples for advanced use cases +- [Gateway + P2P Deployment](../deployment/p2p-with-gateway.md) - Full stack deployment with REST/WebSocket APIs +- [P2P-Only Deployment](../deployment/p2p-only.md) - Direct P2P integration +- [OptimumP2P Configuration](../configuration/optimump2p.md) - Protocol configuration parameters \ No newline at end of file diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index 8e00202..989088b 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -27,9 +27,8 @@ Choose your deployment strategy: Connect to OptimumP2P using various client methods: -- **[mump2p-cli](./clients/)** - Command-line client for testing and automation -- **[gRPC Clients](./clients/)** - Direct gRPC integration examples -- **[REST/WebSocket APIs](./clients/)** - Gateway-based client integration +- **[mump2p-cli](./clients/mump2p-cli.md)** - Command-line client for testing and automation +- **[gRPC Client Examples](./clients/grpc-examples.md)** - Direct gRPC integration examples ## Configuration diff --git a/docs/hackathon/quick-start/first-message.md b/docs/hackathon/quick-start/first-message.md index e7974ea..cf694da 100644 --- a/docs/hackathon/quick-start/first-message.md +++ b/docs/hackathon/quick-start/first-message.md @@ -215,7 +215,7 @@ docker-compose down -v --rmi all Now that you've successfully sent messages through OptimumP2P: -1. **Build custom clients**: Explore the [Client Development](../clients/) guides +1. **Build custom clients**: Explore the [mump2p-cli](../clients/mump2p-cli.md) or [gRPC Client Examples](../clients/grpc-examples.md) 2. **Optimize configuration**: Learn about [OptimumP2P Configuration](../configuration/optimump2p.md) 3. **Compare protocols**: Review [GossipSub Configuration](../configuration/gossipsub.md) From d4ca6b38c7822965891d6cd200f17c8a5d4c4600 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Fri, 1 Aug 2025 17:04:29 +0530 Subject: [PATCH 15/46] fix: remove broken links --- docs/hackathon/quick-start/installation.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/hackathon/quick-start/installation.md b/docs/hackathon/quick-start/installation.md index 181978f..bd51af4 100644 --- a/docs/hackathon/quick-start/installation.md +++ b/docs/hackathon/quick-start/installation.md @@ -48,14 +48,6 @@ git clone https://github.com/getoptimum/optimum-dev-setup-guide.git cd optimum-dev-setup-guide ``` -## What's Next? - -Now that you have everything installed: - -1. **Learn the basics**: Read [Core Concepts](./concepts.md) to understand how OptimumP2P works -2. **Try it out**: Follow [First Message Example](./first-message.md) to send your first message -3. **Build something**: Check out [Client Development](../clients/) to create your own application - ## Troubleshooting ### "Docker command not found" From e57c442b895c298430ee2758742f7b98a40071df Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Sat, 2 Aug 2025 00:05:20 +0530 Subject: [PATCH 16/46] fix: gateway -> proxy --- .vitepress/config.mts | 4 +- docs/hackathon/clients/grpc-examples.md | 54 +++++++-------- docs/hackathon/clients/mump2p-cli.md | 8 +-- docs/hackathon/configuration/gossipsub.md | 2 +- docs/hackathon/configuration/optimump2p.md | 2 +- docs/hackathon/deployment/p2p-only.md | 4 +- ...{p2p-with-gateway.md => p2p-with-proxy.md} | 66 +++++++++---------- docs/hackathon/overview.md | 6 +- docs/hackathon/quick-start/first-message.md | 40 +++++------ 9 files changed, 93 insertions(+), 93 deletions(-) rename docs/hackathon/deployment/{p2p-with-gateway.md => p2p-with-proxy.md} (88%) diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 1bf3d18..02f84d4 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -258,8 +258,8 @@ function sidebarHome() { link: "/docs/hackathon/deployment/p2p-only", }, { - text: "P2P Network with Gateway", - link: "/docs/hackathon/deployment/p2p-with-gateway", + text: "P2P Network with Proxy", + link: "/docs/hackathon/deployment/p2p-with-proxy", }, ], }, diff --git a/docs/hackathon/clients/grpc-examples.md b/docs/hackathon/clients/grpc-examples.md index 69a1f5d..cc94cde 100644 --- a/docs/hackathon/clients/grpc-examples.md +++ b/docs/hackathon/clients/grpc-examples.md @@ -1,13 +1,13 @@ # gRPC Client Examples -This guide demonstrates how to build and use gRPC clients for direct integration with OptimumP2P networks, covering both P2P-only and Gateway deployment scenarios. +This guide demonstrates how to build and use gRPC clients for direct integration with OptimumP2P networks, covering both P2P-only and Proxy deployment scenarios. ## Overview OptimumP2P provides two gRPC client integration patterns: 1. **P2P Direct Client** - Connect directly to P2P node sidecar (for P2P-only deployments) -2. **Gateway Client** - Connect through the Gateway service (for Gateway + P2P deployments) +2. **Proxy Client** - Connect through the Proxy service (for Proxy + P2P deployments) ## P2P Direct Client @@ -107,15 +107,15 @@ The client receives different response types for metrics collection: - `ResponseType_MessageTraceOptimumP2P` - OptimumP2P protocol metrics - `ResponseType_Unknown` - Unknown response type -## Gateway Client +## Proxy Client -The Gateway client connects through the Gateway service, which provides REST API registration and gRPC streaming for message delivery. +The Proxy client connects through the Proxy service, which provides REST API registration and gRPC streaming for message delivery. ### Source Code Location ``` -optimum-dev-setup-guide/grpc_gateway_client/ -├── gateway_client.go # Main client implementation +optimum-dev-setup-guide/grpc_proxy_client/ +├── proxy_client.go # Main client implementation ├── proto/ # Protocol buffer definitions ├── grpc/ # Generated gRPC code └── go.mod # Go module dependencies @@ -126,13 +126,13 @@ optimum-dev-setup-guide/grpc_gateway_client/ - REST API registration with threshold-based subscription - gRPC streaming for real-time message delivery - Automatic message publishing with configurable rate -- Load balancing across multiple gateway instances +- Load balancing across multiple proxy instances -### Building the Gateway Client +### Building the Proxy Client ```bash -cd optimum-dev-setup-guide/grpc_gateway_client -go build -o gateway-client ./gateway_client.go +cd optimum-dev-setup-guide/grpc_proxy_client +go build -o proxy-client ./proxy_client.go ``` ### Usage Examples @@ -141,17 +141,17 @@ go build -o gateway-client ./gateway_client.go ```bash # Basic subscription with threshold -./gateway-client -topic=demo -threshold=0.7 -subscribeOnly=true +./proxy-client -topic=demo -threshold=0.7 -subscribeOnly=true ``` #### Publish and Subscribe Mode ```bash # Publish 10 messages with 2-second delay -./gateway-client -topic=demo -threshold=0.5 -count=10 -delay=2s +./proxy-client -topic=demo -threshold=0.5 -count=10 -delay=2s # High-frequency publishing -./gateway-client -topic=performance -threshold=0.5 -count=1000 -delay=100ms +./proxy-client -topic=performance -threshold=0.5 -count=1000 -delay=100ms ``` ### Using the Convenience Script @@ -160,13 +160,13 @@ go build -o gateway-client ./gateway_client.go cd optimum-dev-setup-guide # Subscribe to topic with threshold -./script/gateway_client.sh subscribe demo 0.7 +./script/proxy_client.sh subscribe demo 0.7 # Publish messages with threshold and count -./script/gateway_client.sh publish demo 0.5 10 +./script/proxy_client.sh publish demo 0.5 10 ``` -### Gateway Client Configuration +### Proxy Client Configuration | Parameter | Description | Default | Example | |-----------|-------------|---------|---------| @@ -176,11 +176,11 @@ cd optimum-dev-setup-guide | `-count` | Number of messages to publish | `5` | `100` | | `-delay` | Delay between message publishing | `2s` | `100ms`, `5s` | -### Gateway Endpoints +### Proxy Endpoints -The Gateway client uses these endpoints: +The Proxy client uses these endpoints: -- **REST API**: `http://localhost:8081` (Gateway 1) / `http://localhost:8082` (Gateway 2) +- **REST API**: `http://localhost:8081` (Proxy 1) / `http://localhost:8082` (Proxy 2) - **gRPC Stream**: `localhost:50051` (default) ### REST API Integration @@ -215,9 +215,9 @@ case protobuf.ResponseType_MessageTraceOptimumP2P: } ``` -### Gateway Client Metrics +### Proxy Client Metrics -The Gateway client provides simpler message delivery metrics suitable for application-level performance testing. +The Proxy client provides simpler message delivery metrics suitable for application-level performance testing. ### Example Performance Test @@ -293,7 +293,7 @@ func main() { Both clients use Protocol Buffers for gRPC communication. The definitions are available in: - P2P Client: `optimum-dev-setup-guide/grpc_p2p_client/proto/p2p_stream.proto` -- Gateway Client: `optimum-dev-setup-guide/grpc_gateway_client/proto/gateway_stream.proto` +- Proxy Client: `optimum-dev-setup-guide/grpc_proxy_client/proto/proxy_stream.proto` ## Troubleshooting @@ -322,9 +322,9 @@ failed to connect to node dial tcp 127.0.0.1:33212: connect: connection refused #### Partial message delivery -**For Gateway Client:** +**For Proxy Client:** - Adjust threshold parameter (lower values = faster delivery, less reliability) -- Check gateway connectivity to P2P nodes +- Check proxy connectivity to P2P nodes **For P2P Client:** - Verify direct connection to healthy P2P node @@ -364,7 +364,7 @@ For production deployments, consider: Both clients support custom message formats. Modify the message structure in: - P2P Client: `P2PMessage` struct in `p2p_client.go` -- Gateway Client: Message handling in `gateway_client.go` +- Proxy Client: Message handling in `proxy_client.go` ### Integration with Other Languages @@ -384,7 +384,7 @@ protoc --java_out=. --grpc-java_out=. proto/*.proto ## See Also - [mump2p CLI Guide](./mump2p-cli.md) - Command-line client for OptimumP2P -- [P2P-Only Deployment](../deployment/p2p-only.md) - Setting up P2P nodes without gateway -- [Gateway + P2P Deployment](../deployment/p2p-with-gateway.md) - Full stack with gateway services +- [P2P-Only Deployment](../deployment/p2p-only.md) - Setting up P2P nodes without proxy +- [Proxy + P2P Deployment](../deployment/p2p-with-proxy.md) - Full stack with proxy services - [OptimumP2P Configuration](../configuration/optimump2p.md) - Protocol configuration parameters - [GossipSub Configuration](../configuration/gossipsub.md) - Baseline protocol configuration \ No newline at end of file diff --git a/docs/hackathon/clients/mump2p-cli.md b/docs/hackathon/clients/mump2p-cli.md index a2bf6d8..453a540 100644 --- a/docs/hackathon/clients/mump2p-cli.md +++ b/docs/hackathon/clients/mump2p-cli.md @@ -76,11 +76,11 @@ To remove your stored authentication token: ## Service URLs -The CLI connects to different gateway servers around the world. By default, it uses the first available gateway, but you can specify a different one using the `--service-url` flag. +The CLI connects to different proxy servers around the world. By default, it uses the first available proxy, but you can specify a different one using the `--service-url` flag. -For a complete list of available gateways and their locations, see: [Available Service URLs](https://github.com/getoptimum/mump2p-cli#available-service-urls) in the README. +For a complete list of available proxys and their locations, see: [Available Service URLs](https://github.com/getoptimum/mump2p-cli#available-service-urls) in the README. -**Example using a specific gateway:** +**Example using a specific proxy:** ```sh ./mump2p publish --topic=test --message="Hello" --service-url="http://35.221.118.95:8080" ./mump2p subscribe --topic=test --service-url="http://34.142.205.26:8080" @@ -202,6 +202,6 @@ This will display: ## See Also - [gRPC Client Examples](./grpc-examples.md) - Direct gRPC integration examples for advanced use cases -- [Gateway + P2P Deployment](../deployment/p2p-with-gateway.md) - Full stack deployment with REST/WebSocket APIs +- [Proxy + P2P Deployment](../deployment/p2p-with-proxy.md) - Full stack deployment with REST/WebSocket APIs - [P2P-Only Deployment](../deployment/p2p-only.md) - Direct P2P integration - [OptimumP2P Configuration](../configuration/optimump2p.md) - Protocol configuration parameters \ No newline at end of file diff --git a/docs/hackathon/configuration/gossipsub.md b/docs/hackathon/configuration/gossipsub.md index 8363e85..41b0e08 100644 --- a/docs/hackathon/configuration/gossipsub.md +++ b/docs/hackathon/configuration/gossipsub.md @@ -121,4 +121,4 @@ GossipSub uses four types of control messages: - [libp2p GossipSub v1.0 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md) - [libp2p PubSub Interface](https://github.com/libp2p/specs/blob/master/pubsub/README.md) -- [Optimum P2P Configuration Guide](/docs/hackathon/deployment/p2p-with-gateway.md#p2p-node-configuration) \ No newline at end of file +- [Optimum P2P Configuration Guide](/docs/hackathon/deployment/p2p-with-proxy.md#p2p-node-configuration) \ No newline at end of file diff --git a/docs/hackathon/configuration/optimump2p.md b/docs/hackathon/configuration/optimump2p.md index 0400543..c842de5 100644 --- a/docs/hackathon/configuration/optimump2p.md +++ b/docs/hackathon/configuration/optimump2p.md @@ -242,5 +242,5 @@ services: - **[GossipSub Configuration](./gossipsub.md)** - Standard protocol parameters for comparison - **[P2P-Only Deployment](../deployment/p2p-only.md)** - Complete setup with configuration -- **[Gateway + P2P Deployment](../deployment/p2p-with-gateway.md)** - Full stack configuration +- **[Proxy + P2P Deployment](../deployment/p2p-with-proxy.md)** - Full stack configuration - **[OptimumP2P Technical Overview](../../learn/overview/p2p.md)** - Protocol fundamentals and RLNC details \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-only.md b/docs/hackathon/deployment/p2p-only.md index f506a1b..c2c30b5 100644 --- a/docs/hackathon/deployment/p2p-only.md +++ b/docs/hackathon/deployment/p2p-only.md @@ -1,6 +1,6 @@ # P2P Network Only Deployment -This guide covers deploying a standalone OptimumP2P network without gateway intermediaries. In this configuration, clients connect directly to P2P nodes using gRPC sidecar connections, providing maximum performance and protocol flexibility. +This guide covers deploying a standalone OptimumP2P network without proxy intermediaries. In this configuration, clients connect directly to P2P nodes using gRPC sidecar connections, providing maximum performance and protocol flexibility. ### Network Topology @@ -285,5 +285,5 @@ docker-compose logs -f | grep "message" ## See Also - [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters -- [P2P with Gateway Deployment](/docs/hackathon/deployment/p2p-with-gateway.md) - Alternative deployment with gateway layer +- [P2P with Proxy Deployment](/docs/hackathon/deployment/p2p-with-proxy.md) - Alternative deployment with proxy layer - [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-with-gateway.md b/docs/hackathon/deployment/p2p-with-proxy.md similarity index 88% rename from docs/hackathon/deployment/p2p-with-gateway.md rename to docs/hackathon/deployment/p2p-with-proxy.md index 69de61b..0759155 100644 --- a/docs/hackathon/deployment/p2p-with-gateway.md +++ b/docs/hackathon/deployment/p2p-with-proxy.md @@ -1,11 +1,11 @@ -# P2P Network with Gateway Deployment +# P2P Network with Proxy Deployment -This guide covers deploying OptimumP2P with gateway services that provide HTTP/WebSocket/gRPC APIs for client applications. The gateway acts as a bridge between traditional client-server applications and the OptimumP2P network. +This guide covers deploying OptimumP2P with proxy services that provide HTTP/WebSocket/gRPC APIs for client applications. The proxy acts as a bridge between traditional client-server applications and the OptimumP2P network. ### Component Responsibilities -**Gateway Layer:** +**Proxy Layer:** - Protocol translation (HTTP/WebSocket/gRPC ↔ libp2p) - Client session management - Load balancing across P2P nodes @@ -22,19 +22,19 @@ This guide covers deploying OptimumP2P with gateway services that provide HTTP/W ## Deployment Configuration -Complete setup with gateways and P2P nodes: +Complete setup with proxies and P2P nodes: ```yaml services: - gateway-1: + proxy-1: image: 'getoptimum/gateway:latest' platform: linux/amd64 ports: - "8081:8080" # HTTP/WebSocket - "50051:50051" # gRPC environment: - - GATEWAY_PORT=:8080 - - CLUSTER_ID=gateway-1 + - PROXY_PORT=:8080 + - CLUSTER_ID=proxy-1 - ENABLE_AUTH=false - LOG_LEVEL=debug - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 @@ -47,15 +47,15 @@ services: - p2pnode-3 - p2pnode-4 - gateway-2: + proxy-2: image: 'getoptimum/gateway:latest' platform: linux/amd64 ports: - "8082:8080" - "50052:50051" environment: - - GATEWAY_PORT=:8080 - - CLUSTER_ID=gateway-2 + - PROXY_PORT=:8080 + - CLUSTER_ID=proxy-2 - ENABLE_AUTH=false - LOG_LEVEL=debug - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 @@ -204,15 +204,15 @@ networks: - Note: All nodes in network should use same mode for compatibility - **`SIDECAR_PORT`**: gRPC bidirectional communication port - - Purpose: Port where gateways and clients connect to interact with P2P node + - Purpose: Port where proxys and clients connect to interact with P2P node - Default: `33212` - Range: Any available port (1024-65535) - - Usage: Must be accessible from gateway containers for internal communication + - Usage: Must be accessible from proxy containers for internal communication - Network: Used for internal container-to-container communication - **`API_PORT`**: HTTP monitoring and management API port - Purpose: Exposes REST endpoints for health checks, node state, and metrics - - Default: `8081` for gateway, `9090` for P2P nodes (varies by component) + - Default: `8081` for proxy, `9090` for P2P nodes (varies by component) - Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` - Usage: Used for operational monitoring and debugging @@ -298,21 +298,21 @@ All parameter values can be adjusted based on specific use case requirements. Wh - OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET - OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET -## Gateway Configuration +## Proxy Configuration ### Environment Variables -- **`GATEWAY_PORT`**: HTTP/WebSocket server port (default: `:8080`) - - Purpose: Defines the port where the gateway listens for client connections +- **`PROXY_PORT`**: HTTP/WebSocket server port (default: `:8080`) + - Purpose: Defines the port where the proxy listens for client connections - Usage: Internal container port for REST API and WebSocket connections - Example: `:8080`, `:3000`, `:8081` - Note: External port mapping is configured separately in docker-compose ports section -- **`CLUSTER_ID`**: Unique gateway identifier - - Purpose: Distinguishes between multiple gateway instances in logs, metrics, and monitoring - - Usage: Should be unique across all gateway instances in your deployment +- **`CLUSTER_ID`**: Unique proxy identifier + - Purpose: Distinguishes between multiple proxy instances in logs, metrics, and monitoring + - Usage: Should be unique across all proxy instances in your deployment - Format: Alphanumeric string, no spaces - - Example: `gateway-1`, `gateway-primary`, `gateway-us-east` + - Example: `proxy-1`, `proxy-primary`, `proxy-us-east` - Required: Yes, no default value - **`ENABLE_AUTH`**: Enable Auth0 JWT authentication (true/false) @@ -323,12 +323,12 @@ All parameter values can be adjusted based on specific use case requirements. Wh - Note: When `true`, requires additional Auth0 configuration (AUTH0_DOMAIN, AUTH0_AUDIENCE) - **`P2P_NODES`**: Comma-separated list of P2P node gRPC sidecar addresses - - Purpose: Defines which P2P nodes the gateway can connect to for message routing + - Purpose: Defines which P2P nodes the proxy can connect to for message routing - Format: `hostname:port,hostname:port,...` - - Usage: Gateway load-balances requests across these nodes for high availability + - Usage: Proxy load-balances requests across these nodes for high availability - Port: Should match SIDECAR_PORT of P2P nodes (typically 33212) - Example: `p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212` - - Behavior: Gateway attempts to connect to all listed nodes and routes to healthy ones + - Behavior: Proxy attempts to connect to all listed nodes and routes to healthy ones - **`LOG_LEVEL`**: Logging verbosity level - Purpose: Controls the amount and detail of log output @@ -354,7 +354,7 @@ environment: ### HTTP REST API - `POST /publish` - Publish message to topic -- `GET /health` - Gateway health check +- `GET /health` - Proxy health check - `GET /metrics` - Prometheus metrics ### WebSocket API @@ -405,15 +405,15 @@ ws.onopen = () => { ### gRPC (Go) ```go conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) -client := pb.NewGatewayStreamClient(conn) +client := pb.NewProxyStreamClient(conn) stream, err := client.Stream(context.Background()) ``` ## Monitoring -### Gateway Metrics -- Gateway 1: http://localhost:8081/metrics -- Gateway 2: http://localhost:8082/metrics +### Proxy Metrics +- Proxy 1: http://localhost:8081/metrics +- Proxy 2: http://localhost:8082/metrics ### P2P Node Status - Node 1: http://localhost:9091 @@ -430,13 +430,13 @@ Scale the P2P network by adding more nodes: ## Troubleshooting -### Gateway Connection Issues +### Proxy Connection Issues ```bash -# Check gateway logs -docker-compose logs gateway-1 +# Check proxy logs +docker-compose logs proxy-1 # Test P2P node connectivity -docker-compose exec gateway-1 nc -zv p2pnode-1 33212 +docker-compose exec proxy-1 nc -zv p2pnode-1 33212 ``` ### Message Delivery Issues @@ -451,5 +451,5 @@ curl http://localhost:9091/debug/peers ## See Also - [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters -- [P2P-Only Deployment](/docs/hackathon/deployment/p2p-only.md) - Alternative deployment without gateways +- [P2P-Only Deployment](/docs/hackathon/deployment/p2p-only.md) - Alternative deployment without proxys - [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index 989088b..6854ecf 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -20,8 +20,8 @@ Choose your deployment strategy: ### P2P Network Only - **[P2P-Only Deployment](./deployment/p2p-only.md)** - Deploy just the P2P nodes for direct integration -### Gateway + P2P Network -- **[Gateway + P2P Deployment](./deployment/p2p-with-gateway.md)** - Full stack with REST/WebSocket APIs +### Proxy + P2P Network +- **[Proxy + P2P Deployment](./deployment/p2p-with-proxy.md)** - Full stack with REST/WebSocket APIs ## Client Integration @@ -49,7 +49,7 @@ Benchmark and compare OptimumP2P: The hackathon uses these pre-built Docker images: - **`getoptimum/p2pnode:latest`** - Core P2P node with OptimumP2P protocol -- **`getoptimum/gateway:latest`** - Gateway service for client APIs +- **`getoptimum/proxy:latest`** - Proxy service for client APIs Both images support protocol switching: - `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) diff --git a/docs/hackathon/quick-start/first-message.md b/docs/hackathon/quick-start/first-message.md index cf694da..1759393 100644 --- a/docs/hackathon/quick-start/first-message.md +++ b/docs/hackathon/quick-start/first-message.md @@ -1,6 +1,6 @@ # Your First Message -This tutorial demonstrates how to send your first message through OptimumP2P using the gateway setup. We'll use the actual configuration and scripts from the development setup guide. +This tutorial demonstrates how to send your first message through OptimumP2P using the proxy setup. We'll use the actual configuration and scripts from the development setup guide. ## Prerequisites @@ -24,7 +24,7 @@ git clone https://github.com/getoptimum/optimum-dev-setup-guide.git cd optimum-dev-setup-guide ``` -Or create your own `docker-compose.yml` using the configuration from the [P2P Network with Gateway](../deployment/p2p-with-gateway.md) guide. +Or create your own `docker-compose.yml` using the configuration from the [P2P Network with Proxy](../deployment/p2p-with-proxy.md) guide. ## Step 2: Start the Network @@ -51,29 +51,29 @@ docker-compose ps ``` You should see containers for: -- gateway-1 (port 8081) -- gateway-2 (port 8082) +- proxy-1 (port 8081) +- proxy-2 (port 8082) - p2pnode-1, p2pnode-2, p2pnode-3, p2pnode-4 -## Step 3: Test Gateway Connectivity +## Step 3: Test Proxy Connectivity -The gateway provides REST API endpoints for publishing and subscribing. Test connectivity: +The proxy provides REST API endpoints for publishing and subscribing. Test connectivity: ```bash -# Test gateway-1 +# Test proxy-1 curl -I http://localhost:8081 -# Test gateway-2 +# Test proxy-2 curl -I http://localhost:8082 ``` -## Step 4: Build the Gateway Client +## Step 4: Build the Proxy Client -The repository includes a Go client for interacting with the gateway: +The repository includes a Go client for interacting with the proxy: ```bash -cd grpc_gateway_client -go build -o gateway-client ./gateway_client.go +cd grpc_proxy_client +go build -o proxy-client ./gateway_client.go ``` ## Step 5: Subscribe to Messages @@ -86,7 +86,7 @@ In one terminal window, start a subscriber: ``` The subscriber will: -1. Register with the gateway via REST API (`/api/subscribe`) +1. Register with the proxy via REST API (`/api/subscribe`) 2. Open a gRPC stream to receive messages 3. Display received messages in the format: `[RECEIVED] Topic: | Message: ` @@ -155,10 +155,10 @@ Test network performance with higher message volumes: ```bash # High-frequency publishing (100 messages with 100ms delay) -./gateway-client -topic=performance -threshold=0.5 -count=100 -delay=100ms +./proxy-client -topic=performance -threshold=0.5 -count=100 -delay=100ms # Stress test (1000 messages) -./gateway-client -topic=stress -threshold=0.5 -count=1000 -delay=10ms +./proxy-client -topic=stress -threshold=0.5 -count=1000 -delay=10ms ``` ## Understanding the Parameters @@ -170,7 +170,7 @@ The threshold parameter (0.0 to 1.0) controls RLNC decoding: - Typical range: 0.5 to 0.8 ### Client ID -Each client needs a unique identifier for the gateway to track subscriptions and route messages correctly. +Each client needs a unique identifier for the proxy to track subscriptions and route messages correctly. ### Topic Names - Case-sensitive strings @@ -181,8 +181,8 @@ Each client needs a unique identifier for the gateway to track subscriptions and ### View logs ```bash -# Gateway logs -docker-compose logs -f gateway-1 +# Proxy logs +docker-compose logs -f proxy-1 # P2P node logs docker-compose logs -f p2pnode-1 @@ -194,7 +194,7 @@ docker-compose logs -f ### Check network connectivity ```bash # Test P2P node connectivity -docker-compose exec gateway-1 nc -zv p2pnode-1 33212 +docker-compose exec proxy-1 nc -zv p2pnode-1 33212 # View container network docker network inspect optimum-dev-setup-guide_optimum-network @@ -233,7 +233,7 @@ Now that you've successfully sent messages through OptimumP2P: ### Message delivery issues - Verify topic names match exactly - Check threshold values are between 0.0 and 1.0 -- Review gateway and P2P node logs for errors +- Review proxy and P2P node logs for errors ### Performance issues - Monitor container resources: `docker stats` From 25884e440fa5c66dacd2c45b95924b8fa937611f Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Sat, 2 Aug 2025 01:54:13 +0530 Subject: [PATCH 17/46] feat: add protocol selection --- .vitepress/config.mts | 4 + .../configuration/protocol-selection.md | 271 ++++++++++++++++++ docs/hackathon/deployment/p2p-with-proxy.md | 4 +- docs/hackathon/overview.md | 7 +- docs/hackathon/quick-start/first-message.md | 14 +- 5 files changed, 289 insertions(+), 11 deletions(-) create mode 100644 docs/hackathon/configuration/protocol-selection.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 02f84d4..a870473 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -281,6 +281,10 @@ function sidebarHome() { text: "Configuration", collapsed: true, items: [ + { + text: "Protocol Selection", + link: "/docs/hackathon/configuration/protocol-selection", + }, { text: "OptimumP2P Configuration", link: "/docs/hackathon/configuration/optimump2p", diff --git a/docs/hackathon/configuration/protocol-selection.md b/docs/hackathon/configuration/protocol-selection.md new file mode 100644 index 0000000..2c21da3 --- /dev/null +++ b/docs/hackathon/configuration/protocol-selection.md @@ -0,0 +1,271 @@ +# Protocol Selection Guide + +The `getoptimum/p2pnode:latest` Docker image supports running two different gossip protocols: + +* **OptimumP2P** (`NODE_MODE=optimum`) - RLNC-enhanced gossip protocol (recommended) +* **GossipSub** (`NODE_MODE=gossipsub`) - Standard libp2p gossip protocol for comparison + +This guide explains how to configure and deploy each protocol mode. + +## Overview + +Both protocols use the same Docker image but operate with different: + +* **Network ports** - OptimumP2P uses port 7070, GossipSub uses port 6060 +* **Configuration parameters** - Each protocol has protocol-specific environment variables +* **Bootstrap peers** - Must match the protocol and port of target nodes +* **Performance characteristics** - OptimumP2P provides enhanced throughput and fault tolerance + +## OptimumP2P Mode (Recommended) + +### Basic Configuration + +```yaml +services: + p2pnode-optimum: + image: 'getoptimum/p2pnode:latest' + environment: + - NODE_MODE=optimum + - CLUSTER_ID=my-cluster + - OPTIMUM_PORT=7070 + - IDENTITY_DIR=/identity + # Bootstrap peer using OptimumP2P protocol and port + - BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + ports: + - "7070:7070" # OptimumP2P protocol port + - "33212:33212" # gRPC sidecar port + - "9090:9090" # HTTP API port +``` + +### OptimumP2P Parameters + +| Parameter | Environment Variable | Default | Description | +|-----------|---------------------|---------|-------------| +| Listen Port | `OPTIMUM_PORT` | `7070` | P2P protocol listening port | +| Max Message Size | `OPTIMUM_MAX_MSG_SIZE` | `1048576` | Maximum message size (bytes) | +| Mesh Target | `OPTIMUM_MESH_TARGET` | `6` | Target number of mesh peers | +| Mesh Min | `OPTIMUM_MESH_MIN` | `3` | Minimum mesh peers before grafting | +| Mesh Max | `OPTIMUM_MESH_MAX` | `12` | Maximum mesh peers before pruning | +| Shard Factor | `OPTIMUM_SHARD_FACTOR` | `4` | Number of coded shards per message | +| Shard Multiplier | `OPTIMUM_SHARD_MULT` | `1.5` | Publisher shard creation multiplier | +| Forward Threshold | `OPTIMUM_THRESHOLD` | `0.75` | Threshold for forwarding recoded shards | + +### Performance Benefits + +OptimumP2P provides several advantages over standard GossipSub: + +* **Lower Latency** - Coded shards can be forwarded before complete message reception +* **Bandwidth Efficiency** - RLNC reduces redundant data transmission +* **Fault Tolerance** - Messages decode from any sufficient combination of shards +* **Loss Recovery** - Built-in redundancy handles packet loss gracefully + +## GossipSub Mode (Baseline) + +### Basic Configuration + +```yaml +services: + p2pnode-gossipsub: + image: 'getoptimum/p2pnode:latest' + environment: + - NODE_MODE=gossipsub + - CLUSTER_ID=my-cluster + - GOSSIPSUB_PORT=6060 + - IDENTITY_DIR=/identity + # Bootstrap peer using GossipSub protocol and port + - BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/6060/p2p/${BOOTSTRAP_PEER_ID} + ports: + - "6060:6060" # GossipSub protocol port + - "33212:33212" # gRPC sidecar port + - "9090:9090" # HTTP API port +``` + +### GossipSub Parameters + +| Parameter | Environment Variable | Default | Description | +|-----------|---------------------|---------|-------------| +| Listen Port | `GOSSIPSUB_PORT` | `6060` | P2P protocol listening port | +| Max Message Size | `GOSSIPSUB_MAX_MSG_SIZE` | `1048576` | Maximum message size (bytes) | +| Mesh Target | `GOSSIPSUB_MESH_TARGET` | `6` | Target number of mesh peers | +| Mesh Min | `GOSSIPSUB_MESH_MIN` | `4` | Minimum mesh peers before grafting | +| Mesh Max | `GOSSIPSUB_MESH_MAX` | `12` | Maximum mesh peers before pruning | + +For detailed GossipSub configuration, see **[GossipSub Configuration](./gossipsub.md)**. + +## Multi-Protocol Deployment + +You can run both protocols simultaneously on the same network for comparison: + +```yaml +version: '3.8' +services: + # OptimumP2P bootstrap node + p2pnode-optimum-bootstrap: + image: 'getoptimum/p2pnode:latest' + environment: + - NODE_MODE=optimum + - CLUSTER_ID=comparison-test + - OPTIMUM_PORT=7070 + - IDENTITY_DIR=/identity + ports: + - "7070:7070" + - "33212:33212" + - "9090:9090" + networks: + test-network: + ipv4_address: 172.28.0.10 + + # GossipSub bootstrap node + p2pnode-gossipsub-bootstrap: + image: 'getoptimum/p2pnode:latest' + environment: + - NODE_MODE=gossipsub + - CLUSTER_ID=comparison-test + - GOSSIPSUB_PORT=6060 + - IDENTITY_DIR=/identity + ports: + - "6060:6060" + - "33213:33212" + - "9091:9090" + networks: + test-network: + ipv4_address: 172.28.0.11 + + # OptimumP2P peer + p2pnode-optimum-peer: + image: 'getoptimum/p2pnode:latest' + environment: + - NODE_MODE=optimum + - CLUSTER_ID=comparison-test + - OPTIMUM_PORT=7070 + - BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/7070/p2p/${OPTIMUM_BOOTSTRAP_PEER_ID} + networks: + test-network: + ipv4_address: 172.28.0.12 + + # GossipSub peer + p2pnode-gossipsub-peer: + image: 'getoptimum/p2pnode:latest' + environment: + - NODE_MODE=gossipsub + - CLUSTER_ID=comparison-test + - GOSSIPSUB_PORT=6060 + - BOOTSTRAP_PEERS=/ip4/172.28.0.11/tcp/6060/p2p/${GOSSIPSUB_BOOTSTRAP_PEER_ID} + networks: + test-network: + ipv4_address: 172.28.0.13 + +networks: + test-network: + driver: bridge + ipam: + config: + - subnet: 172.28.0.0/16 +``` + +## Validation and Troubleshooting + +### Valid NODE_MODE Values + +The p2pnode validates `NODE_MODE` at startup. Valid values are: + +* `optimum` - Enables OptimumP2P with RLNC +* `gossipsub` - Enables standard GossipSub + +Invalid values will cause the container to exit with a fatal error. + +### Common Configuration Issues + +**Port Conflicts** +```bash +# Ensure correct port mapping for each protocol +# OptimumP2P: 7070 +# GossipSub: 6060 +``` + +**Bootstrap Peer Mismatches** +```bash +# OptimumP2P nodes must bootstrap to OptimumP2P peers on port 7070 +BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/7070/p2p/${PEER_ID} + +# GossipSub nodes must bootstrap to GossipSub peers on port 6060 +BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/6060/p2p/${PEER_ID} +``` + +**Protocol Isolation** +* OptimumP2P and GossipSub nodes cannot directly communicate +* Each protocol forms its own mesh network +* Use separate bootstrap nodes for each protocol + +### Health Checks + +Both protocols expose the same health check endpoints: + +```bash +# Check node status +curl http://localhost:9090/health + +# Check peer connections +curl http://localhost:9090/peers + +# Check protocol-specific metrics +curl http://localhost:9090/metrics +``` + +## Configuration Experimentation + +### OptimumP2P Parameter Testing + +OptimumP2P's RLNC implementation provides several parameters that significantly impact network behavior: + +**Shard Factor Experimentation** +```yaml +# Test different sharding approaches +OPTIMUM_SHARD_FACTOR=2 # Minimal sharding +OPTIMUM_SHARD_FACTOR=4 # Default configuration +OPTIMUM_SHARD_FACTOR=8 # High redundancy +``` + +**Forward Threshold Testing** +```yaml +# Test forwarding behavior +OPTIMUM_THRESHOLD=0.5 # Aggressive forwarding +OPTIMUM_THRESHOLD=0.75 # Default behavior +OPTIMUM_THRESHOLD=0.9 # Conservative forwarding +``` + +**Mesh Density Configuration** +```yaml +# Test network connectivity +OPTIMUM_MESH_TARGET=4 # Sparse mesh +OPTIMUM_MESH_TARGET=8 # Dense mesh +OPTIMUM_MESH_TARGET=12 # Maximum connectivity +``` + +### Protocol Comparison Setup + +To observe protocol differences, deploy both modes with identical network topology: + +```yaml +# OptimumP2P network +services: + optimum-network: + environment: + - NODE_MODE=optimum + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_MESH_TARGET=6 + +# GossipSub network + gossipsub-network: + environment: + - NODE_MODE=gossipsub + - GOSSIPSUB_MESH_TARGET=6 +``` + + +--- + +**Next Steps:** +* **[OptimumP2P Configuration](./optimump2p.md)** - Detailed RLNC parameter tuning +* **[GossipSub Configuration](./gossipsub.md)** - Standard gossip parameters +* **[Client Integration](../clients/)** - Connect applications to either protocol \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-with-proxy.md b/docs/hackathon/deployment/p2p-with-proxy.md index 0759155..3944368 100644 --- a/docs/hackathon/deployment/p2p-with-proxy.md +++ b/docs/hackathon/deployment/p2p-with-proxy.md @@ -27,7 +27,7 @@ Complete setup with proxies and P2P nodes: ```yaml services: proxy-1: - image: 'getoptimum/gateway:latest' + image: 'getoptimum/proxy:latest' platform: linux/amd64 ports: - "8081:8080" # HTTP/WebSocket @@ -48,7 +48,7 @@ services: - p2pnode-4 proxy-2: - image: 'getoptimum/gateway:latest' + image: 'getoptimum/proxy:latest' platform: linux/amd64 ports: - "8082:8080" diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index 6854ecf..2ff055c 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -1,6 +1,6 @@ -# OptimumP2P Hackathon Guide +# OptimumP2P Network Configuration Guide -Welcome to the OptimumP2P hackathon documentation. This guide provides everything you need to deploy, configure, and integrate OptimumP2P - a novel RLNC-enhanced gossip algorithm for high-performance peer-to-peer networks. +This guide provides everything you need to deploy, configure, and experiment with OptimumP2P. ## What is OptimumP2P? @@ -34,6 +34,7 @@ Connect to OptimumP2P using various client methods: Fine-tune OptimumP2P for your use case: +- **[Protocol Selection](./configuration/protocol-selection.md)** - Switch between OptimumP2P and GossipSub modes - **[OptimumP2P Configuration](./configuration/optimump2p.md)** - RLNC parameters, mesh topology, and performance tuning - **[GossipSub Configuration](./configuration/gossipsub.md)** - Standard GossipSub parameters for comparison @@ -55,6 +56,8 @@ Both images support protocol switching: - `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) - `NODE_MODE=gossipsub` - Standard GossipSub for comparison +See **[Protocol Selection](./configuration/protocol-selection.md)** for detailed configuration and deployment examples. + ## Architecture Deep Dive For developers and integrators: diff --git a/docs/hackathon/quick-start/first-message.md b/docs/hackathon/quick-start/first-message.md index 1759393..3d518d5 100644 --- a/docs/hackathon/quick-start/first-message.md +++ b/docs/hackathon/quick-start/first-message.md @@ -73,7 +73,7 @@ The repository includes a Go client for interacting with the proxy: ```bash cd grpc_proxy_client -go build -o proxy-client ./gateway_client.go +go build -o proxy-client ./proxy_client.go ``` ## Step 5: Subscribe to Messages @@ -82,7 +82,7 @@ In one terminal window, start a subscriber: ```bash # Subscribe to topic "demo" with threshold 0.7 -./script/gateway_client.sh subscribe demo 0.7 +./script/proxy_client.sh subscribe demo 0.7 ``` The subscriber will: @@ -96,7 +96,7 @@ In another terminal window, publish messages: ```bash # Publish 5 messages to topic "demo" with threshold 0.5 -./script/gateway_client.sh publish demo 0.5 5 +./script/proxy_client.sh publish demo 0.5 5 ``` The publisher will: @@ -135,16 +135,16 @@ Test topic isolation by using different topic names: ```bash # Terminal 1: Subscribe to "weather" -./script/gateway_client.sh subscribe weather 0.7 +./script/proxy_client.sh subscribe weather 0.7 # Terminal 2: Subscribe to "news" -./script/gateway_client.sh subscribe news 0.7 +./script/proxy_client.sh subscribe news 0.7 # Terminal 3: Publish to "weather" -./script/gateway_client.sh publish weather 0.5 3 +./script/proxy_client.sh publish weather 0.5 3 # Terminal 4: Publish to "news" -./script/gateway_client.sh publish news 0.5 3 +./script/proxy_client.sh publish news 0.5 3 ``` Each subscriber will only receive messages from their subscribed topic. From 7e633c9546c3fcebfa70fea938acf9b344ebad0f Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Thu, 7 Aug 2025 13:55:20 -0700 Subject: [PATCH 18/46] fix: remove dev setup ref and break the steps --- docs/hackathon/clients/grpc-examples.md | 391 +++++++++++- docs/hackathon/quick-start/first-message.md | 650 ++++++++++++++++++-- docs/hackathon/quick-start/installation.md | 11 +- 3 files changed, 970 insertions(+), 82 deletions(-) diff --git a/docs/hackathon/clients/grpc-examples.md b/docs/hackathon/clients/grpc-examples.md index cc94cde..6151df1 100644 --- a/docs/hackathon/clients/grpc-examples.md +++ b/docs/hackathon/clients/grpc-examples.md @@ -13,10 +13,12 @@ OptimumP2P provides two gRPC client integration patterns: The P2P direct client connects to individual P2P node sidecar gRPC endpoints for direct protocol interaction. -### Source Code Location +### Creating the P2P Client + +The P2P client code is provided below. Create the following directory structure: ``` -optimum-dev-setup-guide/grpc_p2p_client/ +grpc_p2p_client/ ├── p2p_client.go # Main client implementation ├── proto/ # Protocol buffer definitions ├── grpc/ # Generated gRPC code @@ -32,8 +34,301 @@ optimum-dev-setup-guide/grpc_p2p_client/ ### Building the P2P Client +#### Step 1: Create the directory and initialize Go module + +```bash +mkdir grpc_p2p_client +cd grpc_p2p_client +go mod init p2p_client +``` + +#### Step 2: Add dependencies + +```bash +go get google.golang.org/grpc +go get google.golang.org/protobuf +``` + +#### Step 3: Create protobuf definition + +Create `proto/p2p_stream.proto`: + +```bash +mkdir proto +``` + +Create `proto/p2p_stream.proto` with this content: + +```protobuf +syntax = "proto3"; + +package proto; + +option go_package = "optimum-gateway/proto;proto"; + +service CommandStream { + rpc ListenCommands (stream Request) returns (stream Response) {} + rpc Health (Void) returns (HealthResponse) {} + rpc ListTopics(Void) returns (TopicList) {} +} + +message Void {} + +message HealthResponse { + bool status = 1; + string nodeMode = 2; + float memoryUsed = 3; + float cpuUsed = 4; + float diskUsed = 5; +} + +enum ResponseType { + Unknown = 0; + Message = 1; + MessageTraceOptimumP2P = 2; + MessageTraceGossipSub = 3; +} + +message Request { + int32 command = 1; + bytes data = 2; + string topic = 3; +} + +message Response { + ResponseType command = 1; + bytes data = 2; + bytes metadata = 3; +} + +message TopicList { + repeated string topics = 1; +} +``` + +#### Step 4: Generate protobuf code + +```bash +mkdir grpc +protoc --go_out=grpc --go-grpc_out=grpc proto/p2p_stream.proto +``` + +#### Step 5: Create the client code + +Create `p2p_client.go` with this content: + +```go +package main + +import ( + "context" + "crypto/rand" + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "io" + "log" + "math" + "os" + "os/signal" + "strings" + "sync/atomic" + "syscall" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/status" + + protobuf "p2p_client/grpc" +) + +type P2PMessage struct { + MessageID string + Topic string + Message []byte + SourceNodeID string +} + +type Command int32 + +const ( + CommandUnknown Command = iota + CommandPublishData + CommandSubscribeToTopic + CommandUnSubscribeToTopic +) + +var ( + addr = flag.String("addr", "localhost:33212", "sidecar gRPC address") + mode = flag.String("mode", "subscribe", "mode: subscribe | publish") + topic = flag.String("topic", "", "topic name") + message = flag.String("msg", "", "message data (for publish)") + + count = flag.Int("count", 1, "number of messages to publish (for publish mode)") + sleep = flag.Duration("sleep", 0, "optional delay between publishes (e.g., 1s, 500ms)") + + keepaliveTime = flag.Duration("keepalive-interval", 2*time.Minute, "gRPC keepalive ping interval") + keepaliveTimeout = flag.Duration("keepalive-timeout", 20*time.Second, "gRPC keepalive ping timeout") +) + +func main() { + flag.Parse() + if *topic == "" { + log.Fatalf("−topic is required") + } + + conn, err := grpc.NewClient(*addr, + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithInitialWindowSize(1024*1024*1024), + grpc.WithInitialConnWindowSize(1024*1024*1024), + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(math.MaxInt), + grpc.MaxCallSendMsgSize(math.MaxInt), + ), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: *keepaliveTime, + Timeout: *keepaliveTimeout, + PermitWithoutStream: false, + })) + if err != nil { + log.Fatalf("failed to connect to node %v", err) + } + defer conn.Close() + + client := protobuf.NewCommandStreamClient(conn) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + stream, err := client.ListenCommands(ctx) + if err != nil { + log.Fatalf("ListenCommands: %v", err) + } + + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt, syscall.SIGTERM) + go func() { + <-c + fmt.Println("\nshutting down…") + cancel() + os.Exit(0) + }() + + switch *mode { + case "subscribe": + subReq := &protobuf.Request{ + Command: int32(CommandSubscribeToTopic), + Topic: *topic, + } + if err := stream.Send(subReq); err != nil { + log.Fatalf("send subscribe: %v", err) + } + fmt.Printf("Subscribed to topic %q, waiting for messages…\n", *topic) + + var receivedCount int32 + msgChan := make(chan *protobuf.Response, 10000) + + go func() { + for { + resp, err := stream.Recv() + if err == io.EOF { + close(msgChan) + return + } + if err != nil { + if st, ok := status.FromError(err); ok { + msg := st.Message() + if strings.Contains(msg, "ENHANCE_YOUR_CALM") || strings.Contains(msg, "too_many_pings") { + log.Printf("Connection closed due to keepalive ping limit.") + close(msgChan) + return + } + } + log.Printf("recv error: %v", err) + close(msgChan) + return + } + msgChan <- resp + } + }() + + for { + select { + case <-ctx.Done(): + log.Printf("Context canceled. Total messages received: %d", atomic.LoadInt32(&receivedCount)) + return + case resp, ok := <-msgChan: + if !ok { + log.Printf("Stream closed. Total messages received: %d", atomic.LoadInt32(&receivedCount)) + return + } + go func(resp *protobuf.Response) { + handleResponse(resp, &receivedCount) + }(resp) + } + } + + case "publish": + if *message == "" && *count == 1 { + log.Fatalf("−msg is required in publish mode") + } + for i := 0; i < *count; i++ { + var data []byte + if *count == 1 { + data = []byte(*message) + } else { + randomBytes := make([]byte, 4) + if _, err := rand.Read(randomBytes); err != nil { + log.Fatalf("failed to generate random bytes: %v", err) + } + randomSuffix := hex.EncodeToString(randomBytes) + data = []byte(fmt.Sprintf("P2P message %d - %s", i+1, randomSuffix)) + } + + pubReq := &protobuf.Request{ + Command: int32(CommandPublishData), + Topic: *topic, + Data: data, + } + if err := stream.Send(pubReq); err != nil { + log.Fatalf("send publish: %v", err) + } + fmt.Printf("Published %q to %q\n", string(data), *topic) + + if *sleep > 0 { + time.Sleep(*sleep) + } + } + + default: + log.Fatalf("unknown mode %q", *mode) + } +} + +func handleResponse(resp *protobuf.Response, counter *int32) { + switch resp.GetCommand() { + case protobuf.ResponseType_Message: + var p2pMessage P2PMessage + if err := json.Unmarshal(resp.GetData(), &p2pMessage); err != nil { + log.Printf("Error unmarshalling message: %v", err) + return + } + n := atomic.AddInt32(counter, 1) + fmt.Printf("[%d] Received message: %q\n", n, string(p2pMessage.Message)) + case protobuf.ResponseType_MessageTraceGossipSub: + case protobuf.ResponseType_MessageTraceOptimumP2P: + case protobuf.ResponseType_Unknown: + default: + log.Println("Unknown response command:", resp.GetCommand()) + } +} +``` + +#### Step 6: Build the client + ```bash -cd optimum-dev-setup-guide/grpc_p2p_client go build -o p2p-client ./p2p_client.go ``` @@ -57,21 +352,62 @@ go build -o p2p-client ./p2p_client.go -count=100 -sleep=200ms ``` -### Using the Convenience Script +### Using a Convenience Script (Optional) -The repository includes a helper script for easier usage: +You can create a helper script `p2p_client.sh` for easier usage: ```bash -cd optimum-dev-setup-guide +#!/usr/bin/env bash +set -e + +P2P_CLIENT_DIR="./grpc_p2p_client" + +cd "$P2P_CLIENT_DIR" + +go build -o p2p-client ./p2p_client.go + +if [ -z "${1:-}" ]; then + echo "Usage: $0 (subscribe )|(publish [options])" >&2 + exit 1 +fi + +ADDR="$1" +shift + +case "${1:-}" in + subscribe) + TOPIC="$2" + shift 2 + ./p2p-client -mode=subscribe -topic="$TOPIC" --addr="$ADDR" "$@" + ;; + publish) + TOPIC="$2" + MESSAGE="$3" + shift 3 + if [[ "$MESSAGE" == "random" ]]; then + ./p2p-client -mode=publish -topic="$TOPIC" --addr="$ADDR" "$@" + else + ./p2p-client -mode=publish -topic="$TOPIC" -msg="$MESSAGE" --addr="$ADDR" "$@" + fi + ;; + *) + echo "Usage: $0 (subscribe )|(publish [options])" >&2 + exit 1 + ;; +esac +``` + +Then use it like: +```bash # Subscribe to topic -./script/p2p_client.sh 127.0.0.1:33221 subscribe test-topic +./p2p_client.sh 127.0.0.1:33221 subscribe test-topic # Publish a message -./script/p2p_client.sh 127.0.0.1:33221 publish test-topic "Hello World" +./p2p_client.sh 127.0.0.1:33221 publish test-topic "Hello World" # Publish multiple random messages -./script/p2p_client.sh 127.0.0.1:33221 publish test-topic "random" -count=100 -sleep=200ms +./p2p_client.sh 127.0.0.1:33221 publish test-topic "random" -count=100 -sleep=200ms ``` ### P2P Client Configuration @@ -111,15 +447,9 @@ The client receives different response types for metrics collection: The Proxy client connects through the Proxy service, which provides REST API registration and gRPC streaming for message delivery. -### Source Code Location +### Creating the Proxy Client -``` -optimum-dev-setup-guide/grpc_proxy_client/ -├── proxy_client.go # Main client implementation -├── proto/ # Protocol buffer definitions -├── grpc/ # Generated gRPC code -└── go.mod # Go module dependencies -``` +The Proxy client code is provided in the [Quick Start Guide](../quick-start/first-message.md#step-4-create-the-proxy-client). Follow those steps to create the complete proxy client with all necessary files. ### Client Features @@ -130,10 +460,7 @@ optimum-dev-setup-guide/grpc_proxy_client/ ### Building the Proxy Client -```bash -cd optimum-dev-setup-guide/grpc_proxy_client -go build -o proxy-client ./proxy_client.go -``` +Refer to the [Quick Start Guide Steps 4a-4g](../quick-start/first-message.md#step-4-create-the-proxy-client) for complete build instructions. ### Usage Examples @@ -156,14 +483,14 @@ go build -o proxy-client ./proxy_client.go ### Using the Convenience Script -```bash -cd optimum-dev-setup-guide +Refer to the [Quick Start Guide](../quick-start/first-message.md) for examples of using the proxy client directly with command-line flags like: +```bash # Subscribe to topic with threshold -./script/proxy_client.sh subscribe demo 0.7 +./proxy-client -topic=demo -threshold=0.7 -subscribeOnly # Publish messages with threshold and count -./script/proxy_client.sh publish demo 0.5 10 +./proxy-client -topic=demo -threshold=0.5 -count=10 ``` ### Proxy Client Configuration @@ -223,13 +550,13 @@ The Proxy client provides simpler message delivery metrics suitable for applicat ```bash # Terminal 1: Start OptimumP2P subscriber -./script/p2p_client.sh 127.0.0.1:33221 subscribe perf-test +./p2p-client -addr=127.0.0.1:33221 -mode=subscribe -topic=perf-test # Terminal 2: Start GossipSub subscriber -./script/p2p_client.sh 127.0.0.1:33222 subscribe perf-test +./p2p-client -addr=127.0.0.1:33222 -mode=subscribe -topic=perf-test # Terminal 3: Publish test messages -./script/p2p_client.sh 127.0.0.1:33221 publish perf-test "random" -count=1000 -sleep=10ms +./p2p-client -addr=127.0.0.1:33221 -mode=publish -topic=perf-test -count=1000 -sleep=10ms ``` ## Integration Examples @@ -290,10 +617,10 @@ func main() { ### Protocol Buffer Definitions -Both clients use Protocol Buffers for gRPC communication. The definitions are available in: +Both clients use Protocol Buffers for gRPC communication. The definitions are provided in the code sections above: -- P2P Client: `optimum-dev-setup-guide/grpc_p2p_client/proto/p2p_stream.proto` -- Proxy Client: `optimum-dev-setup-guide/grpc_proxy_client/proto/proxy_stream.proto` +- P2P Client: See the protobuf definition in the "Building the P2P Client" section +- Proxy Client: See the [Quick Start Guide](../quick-start/first-message.md#step-4d-create-protobuf-definition) ## Troubleshooting @@ -337,7 +664,7 @@ failed to connect to node dial tcp 127.0.0.1:33212: connect: connection refused ```bash # Regenerate gRPC code if needed cd grpc_p2p_client -protoc --go_out=. --go-grpc_out=. proto/*.proto +protoc --go_out=grpc --go-grpc_out=grpc proto/*.proto ``` #### Module dependency issues diff --git a/docs/hackathon/quick-start/first-message.md b/docs/hackathon/quick-start/first-message.md index 3d518d5..9bc0da0 100644 --- a/docs/hackathon/quick-start/first-message.md +++ b/docs/hackathon/quick-start/first-message.md @@ -1,6 +1,6 @@ # Your First Message -This tutorial demonstrates how to send your first message through OptimumP2P using the proxy setup. We'll use the actual configuration and scripts from the development setup guide. +This tutorial demonstrates how to send your first message through OptimumP2P using the proxy setup. We'll provide all the necessary configuration and code directly in this guide. ## Prerequisites @@ -10,41 +10,211 @@ This tutorial demonstrates how to send your first message through OptimumP2P usi ## Step 1: Set Up the Network -Create a working directory and use the provided docker-compose configuration: +### Step 1a: Create working directory ```bash mkdir optimump2p-test -cd optimump2p-test ``` -Download the complete setup: +### Step 1b: Navigate to directory + ```bash -# Clone the development setup repository -git clone https://github.com/getoptimum/optimum-dev-setup-guide.git -cd optimum-dev-setup-guide +cd optimump2p-test ``` -Or create your own `docker-compose.yml` using the configuration from the [P2P Network with Proxy](../deployment/p2p-with-proxy.md) guide. +### Step 1c: Create docker-compose.yml + +Create a `docker-compose.yml` file with the following content: + +```yaml +services: + proxy-1: + image: 'getoptimum/proxy:latest' + platform: linux/amd64 + ports: + - "8081:8080" # HTTP Port for the proxy + - "50051:50051" # gRPC Port for the proxy + environment: + - PROXY_PORT=:8080 + - CLUSTER_ID=proxy-1 + - ENABLE_AUTH=false + - LOG_LEVEL=debug + - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 + networks: + optimum-network: + ipv4_address: 172.28.0.10 + depends_on: + - p2pnode-1 + - p2pnode-2 + - p2pnode-3 + - p2pnode-4 + + proxy-2: + image: 'getoptimum/proxy:latest' + platform: linux/amd64 + ports: + - "8082:8080" # HTTP Port for the proxy + - "50052:50051" # gRPC Port for the proxy + environment: + - PROXY_PORT=:8080 + - CLUSTER_ID=proxy-2 + - ENABLE_AUTH=false + - LOG_LEVEL=debug + - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 + networks: + optimum-network: + ipv4_address: 172.28.0.11 + depends_on: + - p2pnode-1 + - p2pnode-2 + - p2pnode-3 + - p2pnode-4 + + p2pnode-1: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + volumes: + - ./identity:/identity + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + networks: + optimum-network: + ipv4_address: 172.28.0.12 + ports: + - "33221:33212" + - "7071:7070" + - "6061:6060" + - "9091:9090" + + p2pnode-2: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + networks: + optimum-network: + ipv4_address: 172.28.0.13 + ports: + - "33222:33212" + - "7072:7070" + - "6062:6060" + - "9092:9090" + + p2pnode-3: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: + optimum-network: + ipv4_address: 172.28.0.14 + ports: + - "33223:33212" + - "7073:7070" + - "6063:6060" + - "9093:9090" + + p2pnode-4: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + networks: + optimum-network: + ipv4_address: 172.28.0.15 + ports: + - "33224:33212" + - "7074:7070" + - "6064:6060" + - "9094:9090" + +networks: + optimum-network: + driver: bridge + ipam: + config: + - subnet: 172.28.0.0/16 +``` ## Step 2: Start the Network -Generate the required peer identity: +### Step 2a: Generate peer identity ```bash # Create identity directory if using local setup mkdir -p identity +``` + +### Step 2b: Set environment variable +```bash # Set the bootstrap peer ID environment variable export BOOTSTRAP_PEER_ID=12D3KooWExample # This will be generated automatically ``` -Start all services: +### Step 2c: Start all services ```bash docker-compose up -d ``` -Verify the services are running: +### Step 2d: Verify services are running ```bash docker-compose ps @@ -57,57 +227,357 @@ You should see containers for: ## Step 3: Test Proxy Connectivity -The proxy provides REST API endpoints for publishing and subscribing. Test connectivity: +Before we start sending messages, let's make sure the proxy services are working correctly. The proxy provides REST API endpoints for publishing and subscribing to messages. + +### Step 3a: Test First Proxy + +Test the connection to proxy-1: ```bash -# Test proxy-1 +# Test proxy-1 (should return HTTP headers if working) curl -I http://localhost:8081 +``` + +**Expected output:** You should see HTTP response headers starting with `HTTP/1.1 200 OK` or similar. + +### Step 3b: Test Second Proxy -# Test proxy-2 +Test the connection to proxy-2: + +```bash +# Test proxy-2 (should return HTTP headers if working) curl -I http://localhost:8082 ``` -## Step 4: Build the Proxy Client +**Expected output:** Similar HTTP response headers, confirming both proxies are running. + +**Troubleshooting:** If you get "connection refused" errors, check that your Docker containers are running with `docker-compose ps`. + +## Step 4: Create the Proxy Client -The repository includes a Go client for interacting with the proxy: +Let's create a Go client application that makes it easy to interact with the proxy. + +### Step 4a: Create client directory ```bash +mkdir grpc_proxy_client cd grpc_proxy_client +``` + +### Step 4b: Initialize Go module + +```bash +go mod init proxy_client +``` + +### Step 4c: Add dependencies + +```bash +go get google.golang.org/grpc +go get google.golang.org/protobuf +``` + +### Step 4d: Create protobuf definition + +Create a `proto/proxy_stream.proto` file: + +```bash +mkdir proto +``` + +Create `proto/proxy_stream.proto` with this content: + +```protobuf +syntax = "proto3"; + +package proto; + +option go_package = "optimum-proxy/proto;proto"; + +service ProxyStream { + rpc ClientStream (stream ProxyMessage) returns (stream ProxyMessage); +} + +message ProxyMessage { + string client_id = 1; + bytes message = 2; + string topic = 3; + string message_id = 4; + string type = 5; +} +``` + +### Step 4e: Generate protobuf code + +```bash +mkdir grpc +protoc --go_out=grpc --go-grpc_out=grpc proto/proxy_stream.proto +``` + +### Step 4f: Create the client code + +Create `proxy_client.go` with this content: + +```go +package main + +import ( + "bytes" + "context" + crand "crypto/rand" + "encoding/hex" + "encoding/json" + "flag" + "fmt" + "io" + "log" + "math" + "math/rand" + "net/http" + "os" + "os/signal" + "time" + + protobuf "proxy_client/grpc" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/keepalive" +) + +const ( + proxyREST = "http://localhost:8081" + proxyGRPC = "localhost:50051" + defaultTopic = "demo" + defaultThreshold = 0.1 + defaultMsgCount = 5 + defaultDelay = 2 * time.Second +) + +var ( + topic = flag.String("topic", defaultTopic, "topic name") + threshold = flag.Float64("threshold", defaultThreshold, "delivery threshold (0.0 to 1.0)") + subscribeOnly = flag.Bool("subscribeOnly", false, "only subscribe and receive messages (no publishing)") + messageCount = flag.Int("count", defaultMsgCount, "number of messages to publish") + messageDelay = flag.Duration("delay", defaultDelay, "delay between message publishing") + + keepaliveTime = flag.Duration("keepalive-interval", 2*time.Minute, "gRPC keepalive interval") + keepaliveTimeout = flag.Duration("keepalive-timeout", 20*time.Second, "gRPC keepalive timeout") + + words = []string{"hello", "ping", "update", "broadcast", "status", "message", "event", "data", "note"} +) + +func main() { + flag.Parse() + + clientID := generateClientID() + log.Printf("[INFO] Client ID: %s | Topic: %s | Threshold: %.2f", clientID, *topic, *threshold) + + if err := subscribe(clientID, *topic, *threshold); err != nil { + log.Fatalf("subscribe error: %v", err) + } + + conn, err := grpc.NewClient(proxyGRPC, + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithInitialWindowSize(1024*1024*1024), + grpc.WithInitialConnWindowSize(1024*1024*1024), + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(math.MaxInt), + grpc.MaxCallSendMsgSize(math.MaxInt), + ), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: *keepaliveTime, + Timeout: *keepaliveTimeout, + PermitWithoutStream: false, + }), + ) + if err != nil { + log.Fatalf("gRPC connection failed: %v", err) + } + defer conn.Close() + + client := protobuf.NewProxyStreamClient(conn) + stream, err := client.ClientStream(context.Background()) + if err != nil { + log.Fatalf("stream open failed: %v", err) + } + + if err := stream.Send(&protobuf.ProxyMessage{ClientId: clientID}); err != nil { + log.Fatalf("client ID send failed: %v", err) + } + + go func() { + for { + resp, err := stream.Recv() + if err == io.EOF { + log.Println("[CLOSED] gRPC stream closed by server") + return + } + if err != nil { + log.Printf("[ERROR] stream receive: %v", err) + return + } + log.Printf("[RECEIVED] Topic: %s | Message: %s", resp.Topic, string(resp.Message)) + } + }() + + c := make(chan os.Signal, 1) + signal.Notify(c, os.Interrupt) + go func() { + <-c + log.Println("[INTERRUPTED] shutting down...") + os.Exit(0) + }() + + if *subscribeOnly { + select {} + } + + for i := 0; i < *messageCount; i++ { + msg := generateRandomMessage() + log.Printf("[PUBLISH] Message: %s", msg) + if err := publishMessage(clientID, *topic, msg); err != nil { + log.Printf("[ERROR] publish failed: %v", err) + } + time.Sleep(*messageDelay) + } + + time.Sleep(3 * time.Second) +} + +func subscribe(clientID, topic string, threshold float64) error { + body := map[string]interface{}{ + "client_id": clientID, + "topic": topic, + "threshold": threshold, + } + data, _ := json.Marshal(body) + resp, err := http.Post(proxyREST+"/api/subscribe", "application/json", bytes.NewReader(data)) + if err != nil { + return err + } + defer resp.Body.Close() + io.Copy(io.Discard, resp.Body) + return nil +} + +func publishMessage(clientID, topic, msg string) error { + body := map[string]interface{}{ + "client_id": clientID, + "topic": topic, + "message": msg, + } + data, _ := json.Marshal(body) + resp, err := http.Post(proxyREST+"/api/publish", "application/json", bytes.NewReader(data)) + if err != nil { + return err + } + defer resp.Body.Close() + io.Copy(io.Discard, resp.Body) + return nil +} + +func generateClientID() string { + b := make([]byte, 4) + _, _ = crand.Read(b) + return "client_" + hex.EncodeToString(b) +} + +func generateRandomMessage() string { + return fmt.Sprintf("%s @ %s", words[rand.Intn(len(words))], time.Now().Format("15:04:05")) +} +``` + +### Step 4g: Build the client + +```bash go build -o proxy-client ./proxy_client.go ``` ## Step 5: Subscribe to Messages -In one terminal window, start a subscriber: +Now we'll set up a message subscriber. This is like tuning into a radio station - once subscribed, you'll receive all messages published to that topic. + +### Step 5a: Open a New Terminal + +Open a **new terminal window** and navigate to your project directory: + +```bash +# Make sure you're in the right directory +cd optimump2p-test +``` + +### Step 5b: Start the Subscriber + +In this terminal, start listening for messages: ```bash # Subscribe to topic "demo" with threshold 0.7 -./script/proxy_client.sh subscribe demo 0.7 +./proxy-client -topic=demo -threshold=0.7 -subscribeOnly ``` +**What this command does:** +- `subscribe`: Tells the client to listen for messages +- `demo`: The topic name we're subscribing to +- `0.7`: The threshold value (higher = more reliable message reconstruction) + +### Step 5c: Understand the Subscriber Output + The subscriber will: -1. Register with the proxy via REST API (`/api/subscribe`) -2. Open a gRPC stream to receive messages -3. Display received messages in the format: `[RECEIVED] Topic: | Message: ` +1. **Register** with the proxy via REST API (`/api/subscribe`) +2. **Open** a gRPC stream to receive messages in real-time +3. **Display** received messages in the format: `[RECEIVED] Topic: | Message: ` + +**Keep this terminal open** - it will show incoming messages as they arrive. ## Step 6: Publish Messages -In another terminal window, publish messages: +Now let's send some messages! We'll use a second terminal to publish messages while watching them appear in the subscriber terminal. + +### Step 6a: Open Another Terminal + +Open a **second new terminal window** and navigate to your project directory: + +```bash +# Navigate to the project directory +cd optimump2p-test +``` + +### Step 6b: Send Messages + +Publish messages to the same topic: ```bash # Publish 5 messages to topic "demo" with threshold 0.5 -./script/proxy_client.sh publish demo 0.5 5 +./proxy-client -topic=demo -threshold=0.5 -count=5 ``` +**What this command does:** +- `publish`: Tells the client to send messages +- `demo`: The topic name (must match the subscriber's topic) +- `0.5`: The threshold for message encoding +- `5`: Number of messages to send + +### Step 6c: Watch the Results + The publisher will: -1. Send messages via REST API (`/api/publish`) -2. Display each published message in the format: `[PUBLISH] Message: ` +1. **Send** messages via REST API (`/api/publish`) +2. **Display** each published message in the format: `[PUBLISH] Message: ` + +**In your subscriber terminal** (from Step 5), you should see the messages being received in real-time. + +### Step 6d: Verify Message Flow + +Check that: +- The **publisher terminal** shows: `[PUBLISH] Message: Message 1`, `[PUBLISH] Message: 2`, etc. +- The **subscriber terminal** shows: `[RECEIVED] Topic: demo | Message: Message 1`, etc. + +This confirms that messages are flowing correctly through the OptimumP2P network! ## Step 7: Alternative REST API Usage You can also interact directly with the REST API using curl: -### Subscribe via REST (requires separate gRPC stream for receiving) ```bash curl -X POST http://localhost:8081/api/subscribe \ -H "Content-Type: application/json" \ @@ -118,7 +588,18 @@ curl -X POST http://localhost:8081/api/subscribe \ }' ``` -### Publish via REST +**What this does:** +- **POST request** to the subscription endpoint +- **client_id**: Unique identifier for your client +- **topic**: The topic you want to subscribe to +- **threshold**: Message reliability setting + +**Important note:** This only registers the subscription. To actually receive messages, you'd need to separately open a gRPC stream (which the script handles automatically). + +### Step 7c: Publish via REST API + +Send a message using a direct HTTP request: + ```bash curl -X POST http://localhost:8081/api/publish \ -H "Content-Type: application/json" \ @@ -129,38 +610,125 @@ curl -X POST http://localhost:8081/api/publish \ }' ``` +**What this does:** +- **POST request** to the publish endpoint +- **client_id**: Same client ID as used for subscription +- **topic**: Must match your subscription topic +- **message**: The actual message content to send + +### Step 7d: Test the REST API + +To see this working: + +1. **Keep your subscriber running** from Step 5 (if still open) +2. **Run the publish curl command** from Step 7c +3. **Check your subscriber terminal** - you should see: `[RECEIVED] Topic: demo | Message: Hello from REST API` + +This demonstrates that REST API publishing works with script-based subscribing (and vice versa). + ## Step 8: Multiple Topics -Test topic isolation by using different topic names: +OptimumP2P supports multiple topics running simultaneously. This means different applications or message types can be isolated from each other. Let's test this feature by setting up multiple subscribers and publishers. + +### Step 8a: Open Multiple Terminal Windows + +You'll need **4 separate terminal windows** for this test. Each terminal should be in your project directory: ```bash -# Terminal 1: Subscribe to "weather" -./script/proxy_client.sh subscribe weather 0.7 +# In each new terminal, navigate to your project directory +cd optimump2p-test +``` -# Terminal 2: Subscribe to "news" -./script/proxy_client.sh subscribe news 0.7 +### Step 8b: Set Up First Topic Subscriber -# Terminal 3: Publish to "weather" -./script/proxy_client.sh publish weather 0.5 3 +In **Terminal 1**, subscribe to the "weather" topic: -# Terminal 4: Publish to "news" -./script/proxy_client.sh publish news 0.5 3 +```bash +# This will listen for weather-related messages +./proxy-client -topic=weather -threshold=0.7 -subscribeOnly +``` + +**What this does:** Creates a subscriber that will only receive messages published to the "weather" topic. + +### Step 8c: Set Up Second Topic Subscriber + +In **Terminal 2**, subscribe to the "news" topic: + +```bash +# This will listen for news-related messages +./proxy-client -topic=news -threshold=0.7 -subscribeOnly ``` -Each subscriber will only receive messages from their subscribed topic. +**What this does:** Creates a second subscriber for a completely different topic. This subscriber won't see weather messages. + +### Step 8d: Publish to Weather Topic + +In **Terminal 3**, publish messages to the weather topic: + +```bash +# Send 3 weather messages +./proxy-client -topic=weather -threshold=0.5 -count=3 +``` + +**Expected result:** Only Terminal 1 (weather subscriber) should show these messages. Terminal 2 (news subscriber) should remain quiet. + +### Step 8e: Publish to News Topic + +In **Terminal 4**, publish messages to the news topic: + +```bash +# Send 3 news messages +./proxy-client -topic=news -threshold=0.5 -count=3 +``` + +**Expected result:** Only Terminal 2 (news subscriber) should show these messages. Terminal 1 (weather subscriber) should not see them. + +### Step 8f: Verify Topic Isolation + +Check that each subscriber only received messages from their subscribed topic: + +- **Terminal 1** should show: `[RECEIVED] Topic: weather | Message: ...` +- **Terminal 2** should show: `[RECEIVED] Topic: news | Message: ...` + +This demonstrates that topics are completely isolated from each other. ## Step 9: Load Testing -Test network performance with higher message volumes: +Now let's test how the network handles high message volumes. This helps you understand the performance characteristics of OptimumP2P. + +### Step 9a: Prepare for Load Testing + +First, make sure you have a subscriber running to see the messages: + +```bash +# In a new terminal, subscribe to the performance topic +./proxy-client -topic=performance -threshold=0.7 -subscribeOnly +``` + +### Step 9b: Medium Load Test + +Start with a moderate load test: ```bash -# High-frequency publishing (100 messages with 100ms delay) +# Send 100 messages with 100ms delay between each ./proxy-client -topic=performance -threshold=0.5 -count=100 -delay=100ms +``` + +**What this does:** Sends 100 messages over about 10 seconds (100ms × 100 = 10 seconds). + +### Step 9c: High Load Test + +For a more intensive test: -# Stress test (1000 messages) +```bash +# Send 1000 messages with 10ms delay (very fast) ./proxy-client -topic=stress -threshold=0.5 -count=1000 -delay=10ms ``` +**What this does:** Sends 1000 messages over about 10 seconds (10ms × 1000 = 10 seconds). + +**Note:** Make sure to set up a subscriber for the "stress" topic if you want to see these messages being received. + ## Understanding the Parameters ### Threshold @@ -197,7 +765,7 @@ docker-compose logs -f docker-compose exec proxy-1 nc -zv p2pnode-1 33212 # View container network -docker network inspect optimum-dev-setup-guide_optimum-network +docker network inspect optimump2p-test_optimum-network ``` ## Cleanup diff --git a/docs/hackathon/quick-start/installation.md b/docs/hackathon/quick-start/installation.md index bd51af4..858601c 100644 --- a/docs/hackathon/quick-start/installation.md +++ b/docs/hackathon/quick-start/installation.md @@ -37,16 +37,9 @@ git --version ## Getting the Code -You have two options to get the OptimumP2P setup files: +The OptimumP2P setup files are provided directly in this documentation. You'll create the necessary configuration files as part of the tutorial steps. -### Option 1: Download from this documentation -Create a new folder on your computer and save the docker-compose.yml files from the [Deployment Options](../deployment/) section. - -### Option 2: Clone the development setup repository -```bash -git clone https://github.com/getoptimum/optimum-dev-setup-guide.git -cd optimum-dev-setup-guide -``` +All required configurations and code snippets are included in the [Quick Start Guide](./first-message.md) - no external repositories needed! ## Troubleshooting From ee5718c675a9ddcce8e3b12779243d390a8b5b5e Mon Sep 17 00:00:00 2001 From: singhhp1069 Date: Sun, 10 Aug 2025 15:00:49 +0200 Subject: [PATCH 19/46] fix: main and product page fixes --- docs/hackathon/overview.md | 109 ++++++++++++++++----- docs/learn/overview/deram.md | 8 +- docs/learn/overview/intro.md | 42 +++++---- docs/learn/overview/p2p.md | 105 +++++++++++---------- index.md | 11 +-- yarn.lock | 177 ++++++++++------------------------- 6 files changed, 222 insertions(+), 230 deletions(-) diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index 2ff055c..e4805ff 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -1,60 +1,119 @@ # OptimumP2P Network Configuration Guide -This guide provides everything you need to deploy, configure, and experiment with OptimumP2P. +This guide helps you install, run, and experiment with OptimumP2P — a next-generation gossip protocol built for Web3 networks. +Whether you’re a hacker, builder, or researcher, this guide will walk you through: -## What is OptimumP2P? +* Setup and deployment +* Messaging and client integration +* Configuration and tuning +* Performance testing +* Debugging and troubleshooting -OptimumP2P is a novel gossip algorithm that uses [Random Linear Network Coding (RLNC)](https://x.com/get_optimum/status/1891520664726802439) to enhance traditional gossip protocols like [GossipSub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub). For a comprehensive technical overview, see **[OptimumP2P Technical Overview](../learn/overview/p2p.md)**. +Start with the [OptimumP2P Technical Overview](../learn/overview/p2p.md) — a primer on how RLNC-based gossip works. + +--- + +## 📚 Table of Contents + +

+Expand to view all sections + +- [OptimumP2P Network Configuration Guide](#optimump2p-network-configuration-guide) + - [📚 Table of Contents](#-table-of-contents) + - [Quick Start](#quick-start) + - [1. Install Dependencies](#1-install-dependencies) + - [2. Send Your First Message](#2-send-your-first-message) + - [Deployment Options](#deployment-options) + - [OptimumP2P Nodes](#optimump2p-nodes) + - [Proxy + OptimumP2P Nodes (Recommended)](#proxy--optimump2p-nodes-recommended) + - [Client Integration](#client-integration) + - [CLI](#cli) + - [App Integration](#app-integration) + - [Configuration](#configuration) + - [Performance \& Comparison](#performance--comparison) + - [Docker Images Used](#docker-images-used) + - [Architecture Deep Dive](#architecture-deep-dive) + +
+ +--- ## Quick Start -Get OptimumP2P running in under 5 minutes: +Get a local OptimumP2P network running in minutes: + +### 1. [Install Dependencies](./quick-start/installation.md) -1. **[Installation](./quick-start/installation.md)** - Set up Docker and dependencies -2. **[First Message](./quick-start/first-message.md)** - Publish and receive your first message +* Docker + Docker Compose +* Git (optional) +* Go (for client dev) + +### 2. [Send Your First Message](./quick-start/first-message.md) + +* Start 4 P2P nodes + 2 proxy +* Subscribe to a topic +* Publish messages via REST/gRPC +* Receive live decoded messages + +--- ## Deployment Options -Choose your deployment strategy: +Choose a setup depending on your use case: + +### OptimumP2P Nodes -### P2P Network Only -- **[P2P-Only Deployment](./deployment/p2p-only.md)** - Deploy just the P2P nodes for direct integration +Deploys just the gossip layer (lightweight, direct node-to-node). +[Guide →](./deployment/p2p-only.md) -### Proxy + P2P Network -- **[Proxy + P2P Deployment](./deployment/p2p-with-proxy.md)** - Full stack with REST/WebSocket APIs +### Proxy + OptimumP2P Nodes (Recommended) + +Adds REST and gRPC APIs for clients, UIs, testing. +[Guide →](./deployment/p2p-with-proxy.md) + +--- ## Client Integration -Connect to OptimumP2P using various client methods: +### CLI + +* **[mump2p-cli](./clients/mump2p-cli.md)** — Simple tool to test publish/subscribe + +### App Integration + +* **[gRPC Examples](./clients/grpc-examples.md)** — Full Go clients using bi-directional streaming + +Use these to build chat apps, multiplayer games, decentralized sensors, or MEV relays. + +--- -- **[mump2p-cli](./clients/mump2p-cli.md)** - Command-line client for testing and automation -- **[gRPC Client Examples](./clients/grpc-examples.md)** - Direct gRPC integration examples ## Configuration Fine-tune OptimumP2P for your use case: -- **[Protocol Selection](./configuration/protocol-selection.md)** - Switch between OptimumP2P and GossipSub modes -- **[OptimumP2P Configuration](./configuration/optimump2p.md)** - RLNC parameters, mesh topology, and performance tuning -- **[GossipSub Configuration](./configuration/gossipsub.md)** - Standard GossipSub parameters for comparison +* **[Protocol Selection](./configuration/protocol-selection.md)** - Switch between OptimumP2P and GossipSub modes +* **[OptimumP2P Configuration](./configuration/optimump2p.md)** - RLNC parameters, mesh topology, and performance tuning +* **[GossipSub Configuration](./configuration/gossipsub.md)** - Standard GossipSub parameters for comparison ## Performance & Comparison Benchmark and compare OptimumP2P: -- **[Metrics Collection](./clients/)** - Understanding performance metrics -- **[OptimumP2P vs GossipSub](./clients/)** - Performance comparison methodology +* **[Metrics Collection](./clients/)** - Understanding performance metrics +* **[OptimumP2P vs GossipSub](./clients/)** - Performance comparison methodology ## Docker Images Used The hackathon uses these pre-built Docker images: -- **`getoptimum/p2pnode:latest`** - Core P2P node with OptimumP2P protocol -- **`getoptimum/proxy:latest`** - Proxy service for client APIs +* **`getoptimum/p2pnode:latest`** - Core P2P node with OptimumP2P protocol +* **`getoptimum/proxy:latest`** - Proxy service for client APIs Both images support protocol switching: -- `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) -- `NODE_MODE=gossipsub` - Standard GossipSub for comparison + +* `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) +* `NODE_MODE=gossipsub` - Standard GossipSub for comparison See **[Protocol Selection](./configuration/protocol-selection.md)** for detailed configuration and deployment examples. @@ -62,8 +121,8 @@ See **[Protocol Selection](./configuration/protocol-selection.md)** for detailed For developers and integrators: -- **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** - Complete technical specification +* **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** - Complete technical specification --- -**Ready to get started?** Begin with **[Installation](./quick-start/installation.md)** or dive into the **[Technical Overview](../learn/overview/p2p.md)**. \ No newline at end of file +**Ready to get started?** Begin with **[Installation](./quick-start/installation.md)** or dive into the **[Technical Overview](../learn/overview/p2p.md)**. diff --git a/docs/learn/overview/deram.md b/docs/learn/overview/deram.md index 96db1ed..c3ac898 100644 --- a/docs/learn/overview/deram.md +++ b/docs/learn/overview/deram.md @@ -1,8 +1,8 @@ # Introduction to Optimum DeRAM -Optimum is a highly-effective (low-latency, high-throughput), scalable, and secure -decentralized memory (DeRAM) solution. In essence, it introduces an atomic -read/write memory designed for the Web3 environment, addressing the unique +**Optimum DeRAM (Decentralized Memory)** is a highly effective, low-latency, high-throughput, +and scalable memory abstraction built within the Optimum protocol. +In essence, it introduces an atomic read/write memory designed for the Web3 environment, addressing the unique challenges posed by asynchronous communication, high node churn, decentralized decision-making, and the presence of potentially malicious nodes. @@ -22,3 +22,5 @@ Flexnodes, which collectively provide decentralized storage and communication services. External clients can interact with any Flexnode to perform read/write operations, using this system both for data storage and as a communication socket within the network. + +**More coming soon.** diff --git a/docs/learn/overview/intro.md b/docs/learn/overview/intro.md index b2e5fc6..c208d66 100644 --- a/docs/learn/overview/intro.md +++ b/docs/learn/overview/intro.md @@ -4,29 +4,31 @@ description: Get a quick primer on the constituent components of the Optimum pro # Introduction to Optimum -Optimum is the world’s first decentralized, high-performance memory infrastructure -for any blockchain — designed to scale data access, reduce network strain, and -power the next generation of dApps. Powered by Random Linear Network Coding (RLNC) -— a proven, MIT-developed data encoding technique — Optimum turns sluggish, -redundant networks into fast, efficient, scalable systems. +**Optimum** is the world’s first decentralized, high-performance memory infrastructure +for any blockchain — build to scale data access, reduce network congestion, and +power the next generation of decentralized applications (dApps). +Powered by **Random Linear Network Coding (RLNC)** — a cutting-edge data encoding technique developed at MIT. +By leveraging RLNC, Optimum transforms slow, redundant peer-to-peer networks into fast, efficient, and scalable communication layers. -Optimum is a decentralized network of flexnodes that can be run by anyone and +Optimum is a decentralized network of **flexnodes** that can be run by anyone and permissionlessly connect to any blockchain. -With Optimum, blockchains gain a memory bus and RAM that rivals the performance +With Optimum, blockchains gain a **memory bus and RAM** that rivals the performance of modern computing. At its core, Optimum is building a provably optimal memory infrastructure that transforms blockchains into high-speed, scalable computing networks. The architecture is modular, permissionless, and easy to integrate via -APIs. - -Optimum's products include Optimum P2P and decentralized Random Access Memory - -DeRAM that deliver benefits across the entire blockchain ecosystem: - -* **For validators**: Accelerated data propagation, lower operational costs, - higher APY and MEV income -* **For L1 and L2 blockchains**: Faster block propagation, reduced bandwidth - consumption, and optimized storage -* **For dApp developers**: Improved transaction relay and prioritization, - enabling latency, throughput, and cost-sensitive apps -* **For end users**: Faster transactions and more responsive interfaces, improve - user experience +developer-friendly APIs. + +## Optimum Products + +Optimum's products include [**Optimum P2P**](./p2p.md) and [**DeRAM** (Decentralized Random Access Memory)](./deram.md) - bring measurable improvements across the entire blockchain stack: + +* **For L1 and L2 blockchains**: + Accelerated block propagation, reduced bandwidth usage, and optimized on-chain storage. +* **For Validators**: + Faster data propagation, reduced operational overhead, and increased rewards through higher APY and MEV. +* **For dApp developers**: + Improved transaction relay and prioritization — enabling latency-sensitive, high-throughput, and cost-aware applications. +* **For end users**: + Faster transactions, faster confirmations, and smoother interfaces — enhancing overall user experience. + diff --git a/docs/learn/overview/p2p.md b/docs/learn/overview/p2p.md index c5b7ffa..478d75a 100644 --- a/docs/learn/overview/p2p.md +++ b/docs/learn/overview/p2p.md @@ -1,86 +1,89 @@ # OptimumP2P -OptimumP2P is a novel gossip algorithm that uses [Random Linear Network Coding (RLNC)](https://x.com/get_optimum/status/1891520664726802439) to enhance message dissemination in peer-to-peer networks. It is built on top of [libp2p](https://docs.libp2p.io/) and serves as an enhanced alternative to traditional gossip protocols like [GossipSub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub), providing faster data propagation, improved bandwidth efficiency, and better fault tolerance through network coding techniques. +**OptimumP2P** is a next-generation gossip protocol that uses [Random Linear Network Coding (RLNC)](https://x.com/get_optimum/status/1891520664726802439) to revolutionize message dissemination in peer-to-peer networks. Built on [libp2p](https://docs.libp2p.io/), it offers a high-performance alternative to traditional protocols like [GossipSub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub), delivering faster propagation, better bandwidth efficiency, and better fault tolerance using network coding. + ## How OptimumP2P Works -OptimumP2P is a gossip mechanism based on RLNC, also known as Galois Gossip, that builds upon [libp2p](https://docs.libp2p.io/)'s [GossipSub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub) protocol. Instead of transmitting complete messages between peers, OptimumP2P breaks messages into coded shards that can be independently forwarded and mathematically recombined to reconstruct the original data. +OptimumP2P is a gossip mechanism based on RLNC, also known as **Galois Gossip**, that builds upon [libp2p](https://docs.libp2p.io/)'s [GossipSub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub) protocol. Instead of transmitting complete messages between peers, OptimumP2P breaks messages into coded shards that can be independently forwarded and mathematically recombined to reconstruct the original data. ### Node Architecture -OptimumP2P is implemented as a P2P node that enhances traditional gossip protocols with RLNC capabilities. The node maintains: +Each OptimumP2P node is a standard libp2p host enhanced with RLNC logic. Core components include: -* **[libp2p](https://docs.libp2p.io/) Host**: The underlying network layer for peer connections -* **Mesh Topology**: Maintains peer connections similar to [GossipSub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub) with configurable mesh degrees -* **RLNC Parameters**: Configurable parameters for encoding and forwarding behavior (see [Configuration Parameters](#configuration-parameters)) +* **libp2p Host** – Provides peer discovery, secure communication, and network transport. +* **Mesh Topology** – Maintains a configurable gossip mesh with peer degrees similar to GossipSub. +* **RLNC** – Manages encoding, recoding, and decoding of shards based on tunable parameters. + +> See [Configuration Parameters](#configuration-parameters) for details. ### Random Linear Network Coding (RLNC) Fundamentals -RLNC is the core technology that provides OptimumP2P its performance advantages. The process transforms a single large message into a set of smaller, mathematically-related pieces. +RLNC enables performance gains by dividing messages into linearly coded shards. These shards can be forwarded, recombined, and decoded efficiently without requiring complete message delivery. ![RLNC Coding and Composability](/static/img/rlnc.png) -**Key Principles:** +#### Key Concepts -* **Encoding**: Original data is divided into `k` pieces. These pieces are then used to generate a larger set of `n` coded shards by creating random linear combinations of the original pieces. The coefficients for these combinations are chosen from a finite field to ensure linear independence. -* **Early Forwarding & Composability**: A key feature of RLNC is that nodes do not need to wait to receive all `k` pieces to contribute to the network. As soon as a node receives a shard, it can be combined with other received shards to create and forward a *new, unique* coded shard (a process called recoding). This continuous "mixing" of information allows data to propagate fluidly and rapidly. -* **Decoding**: A receiver only needs to collect *any* `k` linearly independent shards to reconstruct the original message by solving a system of linear equations. This makes the system highly resilient to packet loss, as the specific shards that arrive do not matter, only the total number of unique shards. +* **Encoding**: The original message is split into `k` fragments. These are used to produce `n` coded shards via random linear combinations over a finite field, ensuring uniqueness and redundancy. +* **Recoding (Composability)**: Any node that receives a shard can immediately create a new coded shard from its current shard set — without waiting for the full message. This enables continuous, fast, and fault-tolerant propagation. +* **Decoding**: Nodes only need `k` linearly independent shards to reconstruct the original message using linear algebra (matrix inversion). This ensures high resilience to data loss. -This approach offers several advantages: +#### Benefits * **Lower Latency**: Messages are broken into coded shards, which can be forwarded to the next node before the whole message is received. -* **Loss Tolerance**: Messages can be decoded with any combination of shards, as long as a sufficient number reach the destination. +* **High Loss Tolerance**: Messages can be decoded with any combination of shards, as long as a sufficient number reach the destination. * **Bandwidth Efficiency**: Sharding and recoding reduce the amount of redundant data transmission, lowering overall bandwidth usage. -### Protocol Operation - -When a node publishes a message in OptimumP2P: +## Protocol Operation -1. **Message Preparation**: The original message is prepared for coding by adding length prefixes and padding if necessary -2. **RLNC Encoding**: The message is divided into `k` fragments and encoded using RLNC into multiple shards using configurable parameters: - * `ShredFactor`: Controls how the data is fragmented - * `PublisherShardMultiplier`: Determines how many shards to create initially -3. **Coded Shard Distribution**: The publisher sends different coded shards to different peers in round-robin fashion +### When Publishing When a node receives a shard: -1. **Validation**: The node checks if the shard provides new degrees of freedom (linearly independent information) -2. **Storage**: Valid shards are added to the node's shard set for that message -3. **Decoding Attempt**: If the node has collected `k` or more linearly independent shards, it attempts to decode the original message -4. **Forwarding Logic**: - * **From Publisher**: Coded shards received directly from the publisher are forwarded immediately to all mesh peers - * **From Intermediate Nodes**: If the node has more than a threshold number of shards (`ForwardShardThreshold`), it creates a new recoded shard and forwards it to mesh peers +1. **Message Preparation**: Add length prefix and pad if necessary. +2. **Encoding**: + * Fragment the message using `ShredFactor` + * Generate coded shards: `num_shards = ShredFactor * PublisherShardMultiplier` +3. **Shard Distribution**: Send different coded shards to different peers in round-robin fashion. + +### When Receiving a Shard + +1. **Validation**: Check for linear independence; discard redundant shards. +2. **Storage**: Add to shard set for that message. +3. **Decoding**: Attempt decoding once `k` unique shards are available. +4. **Forwarding**: + * `From Publisher`: Shards are immediately forwarded to all mesh peers. + * `From Peers`: If shard count exceeds `ForwardShardThreshold`, generate and forward a recoded shard. + +--- ### Control Messages -OptimumP2P uses control messages similar to [GossipSub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub) to optimize traffic: +OptimumP2P usages and extends [GossipSub's](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md#control-messages) control messages for optimized mesh performance: -* **IDONTWANT**: Announced when a node has successfully decoded a message, preventing peers from sending more coded shards for that message -* **IHAVE**: Announces that a node has a complete message and can provide coded shards to other nodes -* **IWANT**: Requests additional coded shards for a message that hasn't been fully decoded -* **GRAFT/PRUNE**: Manages mesh topology similar to [GossipSub](https://github.com/libp2p/specs/tree/master/pubsub/gossipsub) +| Message | Purpose | +|-------------|-------------------------------------------------------------------------| +| `IDONTWANT` | Informs peers not to send more shards for a decoded message | +| `IHAVE` | Advertises that a node holds coded shards for a message | +| `IWANT` | Requests additional shards for an undecoded message | +| `GRAFT`/`PRUNE` | Maintains optimal mesh size by adding/removing peers dynamically | ## Configuration Parameters OptimumP2P provides several configurable parameters to tune performance for different network conditions and requirements: -### RLNC Encoding Parameters +### RLNC Encoding -* **ShredFactor**: Controls how the data is fragmented into pieces before encoding. Higher values provide more granular sharding but increase computational overhead. -* **PublisherShardMultiplier**: Determines how many coded shards to create initially when publishing a message. Formula: `coded_shards_created = ShredFactor * PublisherShardMultiplier` -* **ForwardShardThreshold**: Sets the threshold for intermediate nodes to create and forward new recoded shards. Nodes forward when they have more than `ShredFactor * ForwardShardThreshold` shards +* **ShredFactor**: Number of base fragments to split a message into before encoding. Higher values provide more granular sharding but increase computational overhead. +* **PublisherShardMultiplier**: Determines how many coded shards to create initially when publishing a message. Formula: `coded_shards_created = ShredFactor * PublisherShardMultiplier`. +* **ForwardShardThreshold**: Sets the threshold for intermediate nodes to create and forward new recoded shards. Nodes forward when they have more than `ShredFactor * ForwardShardThreshold` shards. ### Mesh Topology Parameters -* **MeshDegreeTarget**: Target number of peers to maintain in the mesh overlay -* **MeshDegreeMin**: Minimum number of mesh peers before triggering grafting -* **MeshDegreeMax**: Maximum number of mesh peers before triggering pruning - -### Performance Tuning - -* **RandomMessageSize**: Default message size used for testing and benchmarking (in bytes) - -These parameters can be adjusted based on network conditions, bandwidth constraints, and latency requirements to optimize OptimumP2P performance for specific use cases. +* **MeshDegreeTarget**: Target number of peers to maintain in the mesh overlay. +* **MeshDegreeMin**: Minimum number of mesh peers before triggering grafting. +* **MeshDegreeMax**: Maximum number of mesh peers before triggering pruning. ## Use Cases @@ -90,9 +93,9 @@ OptimumP2P serves as a foundational, general-purpose data propagation protocol w OptimumP2P supercharges validator and full node performance in bandwidth-constrained and latency-sensitive networks: -* **[Ethereum](https://ethereum.org/)**: Faster mempool propagation, lower uncle rates, and potential integration into both execution and consensus paths -* **[Solana](https://solana.com/)**: Enhances Turbine-style data sharding with fault-tolerant packet loss recovery -* **[Cosmos](https://cosmos.network/) & IBC networks**: Strengthens interchain relaying with lower-latency packet delivery and cross-zone message reliability +* **[Ethereum](https://ethereum.org/)**: Faster mempool propagation, lower uncle rates, and potential integration into both execution and consensus layers. +* **[Solana](https://solana.com/)**: Enhances Turbine-style data sharding with fault-tolerant packet loss recovery. +* **[Cosmos](https://cosmos.network/) & IBC networks**: Low-latency interchain packet routing and zone-to-zone messaging. ### DeFi Chains @@ -128,13 +131,15 @@ These chains rely on fast event propagation for user interactions: ## Security Model -OptimumP2P's security model is built upon the robust foundations of **[libp2p](https://docs.libp2p.io/)**. As such, it inherits a comprehensive suite of security features designed for hostile peer-to-peer environments. For a full overview of these protections, refer to the [libp2p security considerations](https://docs.libp2p.io/concepts/security/security-considerations/). +OptimumP2P inherits libp2p’s robust security foundation, and adds safeguards specific to network coding. -Key inherited security features include: +### Inherited from libp2p * **Authenticated and Encrypted Channels**: All peer-to-peer communication is secured using [Noise](https://noiseprotocol.org/) or [TLS](https://tools.ietf.org/html/rfc8446), preventing eavesdropping and tampering. * **Sybil and Eclipse Attack Mitigation**: The protocol uses [libp2p](https://docs.libp2p.io/)'s peer discovery and management systems, which include defenses against an attacker flooding the network with malicious nodes to gain control or isolate honest peers. +For a full overview of these protections, refer to the [libp2p security considerations](https://docs.libp2p.io/concepts/security/security-considerations/). + ### Network Coding-Specific Security: Pollution Attacks The primary security challenge unique to network coding is the risk of **pollution attacks**. In such an attack, a malicious actor injects corrupted or invalid coded shards into the network, with the goal of preventing honest nodes from successfully decoding the original message. diff --git a/index.md b/index.md index 7c26c88..10f11a8 100644 --- a/index.md +++ b/index.md @@ -12,17 +12,10 @@ hero: alt: Optimum actions: - theme: brand - text: Hackathon Docs - link: /docs/hackathon/overview - - theme: alt text: Get Started link: /docs/learn/overview/intro features: - - title: Hackathon Documentation - details: Complete guide for building applications on OptimumP2P with deployment options, client examples, and configuration. - link: /docs/hackathon/overview - icon: 🚀 - title: Learn Optimum details: Learn more about Optimum, the various components involved, and how it could benefit your project. link: /docs/learn/overview/intro @@ -31,4 +24,8 @@ features: details: Access resources for understanding the inner workings of Optimum and the research behind the technology. link: /docs/research/overview icon: 🔎 + - title: Hackathon Documentation + details: Complete guide for building applications on OptimumP2P with deployment options, client examples, and configuration. + link: /docs/hackathon/overview + icon: 🚀 --- diff --git a/yarn.lock b/yarn.lock index fc4f605..52ee578 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,11 +54,6 @@ resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.20.4.tgz" integrity sha512-OCGa8hKAP6kQKBwi+tu9flTXshz4qeCK5P8J6bI1qq8KYs+/TU1xSotT+E7hO+uyDanGU6dT6soiMSi4A38JgA== -"@algolia/client-common@5.34.1": - version "5.34.1" - resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.34.1.tgz" - integrity sha512-otPWALs72KvmVuP0CN0DI6sqVx1jQWKi+/DgAiP8DysVMgiNlva3GDKTtAK6XVGlT08f4h32FNuL0yQODuCfKA== - "@algolia/client-insights@5.20.4": version "5.20.4" resolved "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.20.4.tgz" @@ -89,16 +84,6 @@ "@algolia/requester-fetch" "5.20.4" "@algolia/requester-node-http" "5.20.4" -"@algolia/client-search@>= 4.9.1 < 6": - version "5.34.1" - resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.34.1.tgz" - integrity sha512-bt5hC9vvjaKvdvsgzfXJ42Sl3qjQqoi/FD8V7HOQgtNFhwSauZOlgLwFoUiw67sM+r7ehF7QDk5WRDgY7fAkIg== - dependencies: - "@algolia/client-common" "5.34.1" - "@algolia/requester-browser-xhr" "5.34.1" - "@algolia/requester-fetch" "5.34.1" - "@algolia/requester-node-http" "5.34.1" - "@algolia/client-search@5.20.4": version "5.20.4" resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.20.4.tgz" @@ -146,13 +131,6 @@ dependencies: "@algolia/client-common" "5.20.4" -"@algolia/requester-browser-xhr@5.34.1": - version "5.34.1" - resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.34.1.tgz" - integrity sha512-567LfFTc9VOiPtuySQohoqaWMeohYWbXK71aMSin+SLMgeKX7hz5LrVmkmMQj9udwWK6/mtHEYZGPYHSuXpLQg== - dependencies: - "@algolia/client-common" "5.34.1" - "@algolia/requester-fetch@5.20.4": version "5.20.4" resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.20.4.tgz" @@ -160,13 +138,6 @@ dependencies: "@algolia/client-common" "5.20.4" -"@algolia/requester-fetch@5.34.1": - version "5.34.1" - resolved "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.34.1.tgz" - integrity sha512-YRbygPgGBEik5U593JvyjgxFjcsyZMR25eIQxNHvSQumdAzt5A4E4Idw3yXnwhrmMdjML54ZXT7EAjnTjWy8Xw== - dependencies: - "@algolia/client-common" "5.34.1" - "@algolia/requester-node-http@5.20.4": version "5.20.4" resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.20.4.tgz" @@ -174,13 +145,6 @@ dependencies: "@algolia/client-common" "5.20.4" -"@algolia/requester-node-http@5.34.1": - version "5.34.1" - resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.34.1.tgz" - integrity sha512-o0mqRYbS82Rt4DE02Od7RL6pNtV7oSxScPuIw8LW4aqO2V5eCF05Pry/SnUgcI/Vb2QCYC66hytBCqzyC/toZA== - dependencies: - "@algolia/client-common" "5.34.1" - "@babel/helper-string-parser@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" @@ -191,7 +155,7 @@ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== -"@babel/parser@^7.23.5", "@babel/parser@^7.25.3": +"@babel/parser@^7.25.3": version "7.28.0" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz" integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== @@ -241,16 +205,16 @@ resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== -"@esbuild/android-arm@0.21.5": - version "0.21.5" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz" - integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== - "@esbuild/android-arm64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + "@esbuild/android-x64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz" @@ -276,16 +240,16 @@ resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== -"@esbuild/linux-arm@0.21.5": - version "0.21.5" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz" - integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== - "@esbuild/linux-arm64@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + "@esbuild/linux-ia32@0.21.5": version "0.21.5" resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz" @@ -399,7 +363,7 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@^9.22.0", "@eslint/js@9.22.0": +"@eslint/js@9.22.0", "@eslint/js@^9.22.0": version "9.22.0" resolved "https://registry.npmjs.org/@eslint/js/-/js-9.22.0.tgz" integrity sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ== @@ -482,7 +446,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -595,7 +559,7 @@ resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.35.0.tgz" integrity sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw== -"@shikijs/core@^2.1.0", "@shikijs/core@2.5.0": +"@shikijs/core@2.5.0", "@shikijs/core@^2.1.0": version "2.5.0" resolved "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz" integrity sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg== @@ -646,7 +610,7 @@ "@shikijs/core" "2.5.0" "@shikijs/types" "2.5.0" -"@shikijs/types@^2.1.0", "@shikijs/types@2.5.0": +"@shikijs/types@2.5.0", "@shikijs/types@^2.1.0": version "2.5.0" resolved "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz" integrity sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw== @@ -666,7 +630,7 @@ dependencies: "@types/ms" "*" -"@types/estree@^1.0.6", "@types/estree@1.0.6": +"@types/estree@1.0.6", "@types/estree@^1.0.6": version "1.0.6" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== @@ -718,6 +682,13 @@ resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== +"@types/node@^24.1.0": + version "24.2.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.2.0.tgz#cde712f88c5190006d6b069232582ecd1f94a760" + integrity sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw== + dependencies: + undici-types "~7.10.0" + "@types/unist@*", "@types/unist@^2.0.0": version "2.0.11" resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz" @@ -733,7 +704,7 @@ resolved "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz" integrity sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA== -"@typescript-eslint/eslint-plugin@^8.26.1", "@typescript-eslint/eslint-plugin@8.26.1": +"@typescript-eslint/eslint-plugin@8.26.1", "@typescript-eslint/eslint-plugin@^8.26.1": version "8.26.1" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz" integrity sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA== @@ -748,7 +719,7 @@ natural-compare "^1.4.0" ts-api-utils "^2.0.1" -"@typescript-eslint/parser@^8.0.0 || ^8.0.0-alpha.0", "@typescript-eslint/parser@^8.26.1", "@typescript-eslint/parser@8.26.1": +"@typescript-eslint/parser@8.26.1", "@typescript-eslint/parser@^8.26.1": version "8.26.1" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz" integrity sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ== @@ -843,17 +814,6 @@ "@vue/compiler-core" "3.5.13" "@vue/shared" "3.5.13" -"@vue/compiler-sfc@2.7.16": - version "2.7.16" - resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz" - integrity sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg== - dependencies: - "@babel/parser" "^7.23.5" - postcss "^8.4.14" - source-map "^0.6.1" - optionalDependencies: - prettier "^1.18.2 || ^2.0.0" - "@vue/compiler-sfc@3.5.13": version "3.5.13" resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz" @@ -937,12 +897,12 @@ "@vue/compiler-ssr" "3.5.13" "@vue/shared" "3.5.13" -"@vue/shared@^3.5.13", "@vue/shared@3.5.13": +"@vue/shared@3.5.13", "@vue/shared@^3.5.13": version "3.5.13" resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz" integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ== -"@vueuse/core@^12.4.0", "@vueuse/core@12.8.2": +"@vueuse/core@12.8.2", "@vueuse/core@^12.4.0": version "12.8.2" resolved "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz" integrity sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ== @@ -978,7 +938,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.14.0: +acorn@^8.14.0: version "8.14.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== @@ -993,7 +953,7 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -algoliasearch@^5.14.2, "algoliasearch@>= 4.9.1 < 6": +algoliasearch@^5.14.2: version "5.20.4" resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.20.4.tgz" integrity sha512-wjfzqruxovJyDqga8M6Xk5XtfuVg3igrWjhjgkRya87+WwfEa1kg+IluujBLzgAiMSd6rO6jqRb7czjgeeSYgQ== @@ -1041,17 +1001,7 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -ansi-styles@^6.0.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ansi-styles@^6.2.1: +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: version "6.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== @@ -1211,6 +1161,11 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@9.2.0: + version "9.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" + integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== + commander@^13.1.0, commander@~13.1.0: version "13.1.0" resolved "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz" @@ -1226,11 +1181,6 @@ commander@^8.3.0: resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== -commander@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" - integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" @@ -1273,7 +1223,7 @@ cssesc@^3.0.0: resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^3.1.0, csstype@^3.1.3: +csstype@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -1386,12 +1336,7 @@ entities@^2.0.0: resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.4.0: - version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -entities@^4.5.0: +entities@^4.4.0, entities@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== @@ -1470,7 +1415,7 @@ eslint-visitor-keys@^4.2.0: resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz" integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== -"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9.22.0: +eslint@^9.22.0: version "9.22.0" resolved "https://registry.npmjs.org/eslint/-/eslint-9.22.0.tgz" integrity sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ== @@ -1642,7 +1587,7 @@ flatted@^3.2.9: resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -focus-trap@^7, focus-trap@^7.6.4: +focus-trap@^7.6.4: version "7.6.4" resolved "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz" integrity sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw== @@ -2043,7 +1988,7 @@ mark.js@8.11.1: resolved "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz" integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== -markdown-it-mathjax3@^4, markdown-it-mathjax3@^4.3.2: +markdown-it-mathjax3@^4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz" integrity sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w== @@ -2144,7 +2089,7 @@ mhchemparser@^4.1.0: resolved "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz" integrity sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ== -micromark-core-commonmark@^2.0.0, micromark-core-commonmark@2.0.2: +micromark-core-commonmark@2.0.2, micromark-core-commonmark@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz" integrity sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w== @@ -2361,7 +2306,7 @@ micromark-util-symbol@^2.0.0: resolved "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz" integrity sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q== -micromark-util-types@^2.0.0, micromark-util-types@2.0.1: +micromark-util-types@2.0.1, micromark-util-types@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz" integrity sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ== @@ -2629,7 +2574,7 @@ postcss-selector-parser@^6.0.15: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss@^8, postcss@^8.4.14, postcss@^8.4.43, postcss@^8.4.48: +postcss@^8.4.43, postcss@^8.4.48: version "8.5.3" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz" integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== @@ -2648,11 +2593,6 @@ prelude-ls@^1.2.1: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -"prettier@^1.18.2 || ^2.0.0": - version "2.8.8" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - prettier@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz" @@ -2770,11 +2710,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -"search-insights@>= 1 < 3": - version "2.17.3" - resolved "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz" - integrity sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ== - select@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz" @@ -2847,11 +2782,6 @@ source-map-js@^1.2.0, source-map-js@^1.2.1: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" @@ -3018,7 +2948,7 @@ typescript-eslint@^8.26.1: "@typescript-eslint/parser" "8.26.1" "@typescript-eslint/utils" "8.26.1" -typescript@*, typescript@^5.2.2, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0": +typescript@^5.2.2: version "5.8.2" resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz" integrity sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ== @@ -3028,6 +2958,11 @@ uc.micro@^2.0.0, uc.micro@^2.1.0: resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz" integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== +undici-types@~7.10.0: + version "7.10.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.10.0.tgz#4ac2e058ce56b462b056e629cc6a02393d3ff350" + integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag== + unist-util-is@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz" @@ -3109,7 +3044,7 @@ vfile@^6.0.0: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -"vite@^5.0.0 || ^6.0.0", vite@^5.4.14: +vite@^5.4.14: version "5.4.14" resolved "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz" integrity sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA== @@ -3151,7 +3086,7 @@ vue-clipboard2@^0.3.3: dependencies: clipboard "^2.0.0" -vue-eslint-parser@^10.0.0, vue-eslint-parser@^10.1.1: +vue-eslint-parser@^10.1.1: version "10.1.1" resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.1.1.tgz" integrity sha512-bh2Z/Au5slro9QJ3neFYLanZtb1jH+W2bKqGHXAoYD4vZgNG3KeotL7JpPv5xzY4UXUXJl7TrIsnzECH63kd3Q== @@ -3171,15 +3106,7 @@ vue-resize@^1.0.1: dependencies: "@babel/runtime" "^7.13.10" -vue@^2.6.0: - version "2.7.16" - resolved "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz" - integrity sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw== - dependencies: - "@vue/compiler-sfc" "2.7.16" - csstype "^3.1.0" - -vue@^3.2.25, vue@^3.5.13, vue@3.5.13: +vue@^3.5.13: version "3.5.13" resolved "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz" integrity sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ== From 903c08e21d7f333b6904890d168bb576cffbf5f2 Mon Sep 17 00:00:00 2001 From: singhhp1069 Date: Sun, 10 Aug 2025 21:59:18 +0200 Subject: [PATCH 20/46] fix: guide for the cli --- .vitepress/config.mts | 186 +++++++++++---- docs/guides/01-getting-started-cli.md | 291 +++++++++++++++++++++++ docs/guides/02-getting-started-docker.md | 247 +++++++++++++++++++ docs/guides/03-parameters.md | 93 ++++++++ docs/guides/04-experiments.md | 171 +++++++++++++ docs/guides/05-cleanup-reset.md | 188 +++++++++++++++ docs/guides/06-faq-glossary.md | 114 +++++++++ docs/guides/07-next-steps.md | 104 ++++++++ docs/guides/overview.md | 61 +++++ docs/hackathon/overview.md | 152 ++++-------- index.md | 4 +- 11 files changed, 1452 insertions(+), 159 deletions(-) create mode 100644 docs/guides/01-getting-started-cli.md create mode 100644 docs/guides/02-getting-started-docker.md create mode 100644 docs/guides/03-parameters.md create mode 100644 docs/guides/04-experiments.md create mode 100644 docs/guides/05-cleanup-reset.md create mode 100644 docs/guides/06-faq-glossary.md create mode 100644 docs/guides/07-next-steps.md create mode 100644 docs/guides/overview.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index a870473..7433aa1 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -227,76 +227,166 @@ function sidebarHome() { // }, ], }, - { - text: "Hackathon Docs", + { + text: "Quick Start", collapsed: false, items: [ { text: "Overview", - link: "/docs/hackathon/overview", + link: "/docs/guides/overview", }, { - text: "Quick Start", + text: "Getting Started", collapsed: true, items: [ { - text: "Installation & Setup", - link: "/docs/hackathon/quick-start/installation", + text: "Using mump2p-cli", + link: "/docs/guides/01-getting-started-cli", }, { - text: "First Message Example", - link: "/docs/hackathon/quick-start/first-message", + text: "Local Setup with Docker", + link: "/docs/guides/02-getting-started-docker", }, ], }, { - text: "Deployment Options", - collapsed: true, - items: [ - { - text: "P2P Network Only", - link: "/docs/hackathon/deployment/p2p-only", - }, - { - text: "P2P Network with Proxy", - link: "/docs/hackathon/deployment/p2p-with-proxy", - }, - ], + text: "Parameters", + link: "/docs/guides/03-parameters", }, { - text: "Client Development", - collapsed: true, - items: [ - { - text: "mump2p-cli", - link: "/docs/hackathon/clients/mump2p-cli", - }, - { - text: "gRPC Client Examples", - link: "/docs/hackathon/clients/grpc-examples", - }, - ], + text: "Common Experiments", + link: "/docs/guides/04-experiments", }, { - text: "Configuration", - collapsed: true, - items: [ - { - text: "Protocol Selection", - link: "/docs/hackathon/configuration/protocol-selection", - }, - { - text: "OptimumP2P Configuration", - link: "/docs/hackathon/configuration/optimump2p", - }, - { - text: "GossipSub Configuration", - link: "/docs/hackathon/configuration/gossipsub", - }, - ], + text: "Cleaning Up and Reset", + link: "/docs/guides/05-cleanup-reset", + }, + { + text: "FAQ Glossary", + link: "/docs/guides/06-faq-glossary", + }, + { + text: "Next Steps", + link: "/docs/guides/07-next-steps", }, + // { + // text: "Deployment Options", + // collapsed: true, + // items: [ + // { + // text: "P2P Network Only", + // link: "/docs/hackathon/deployment/p2p-only", + // }, + // { + // text: "P2P Network with Proxy", + // link: "/docs/hackathon/deployment/p2p-with-proxy", + // }, + // ], + // }, + // { + // text: "Client Development", + // collapsed: true, + // items: [ + // { + // text: "mump2p-cli", + // link: "/docs/hackathon/clients/mump2p-cli", + // }, + // { + // text: "gRPC Client Examples", + // link: "/docs/hackathon/clients/grpc-examples", + // }, + // ], + // }, + // { + // text: "Configuration", + // collapsed: true, + // items: [ + // { + // text: "Protocol Selection", + // link: "/docs/hackathon/configuration/protocol-selection", + // }, + // { + // text: "OptimumP2P Configuration", + // link: "/docs/hackathon/configuration/optimump2p", + // }, + // { + // text: "GossipSub Configuration", + // link: "/docs/hackathon/configuration/gossipsub", + // }, + // ], + // }, ], }, + // { + // text: "Hackathon Docs", + // collapsed: false, + // items: [ + // { + // text: "Overview", + // link: "/docs/hackathon/overview", + // }, + // { + // text: "Quick Start", + // collapsed: true, + // items: [ + // { + // text: "Installation & Setup", + // link: "/docs/hackathon/quick-start/installation", + // }, + // { + // text: "First Message Example", + // link: "/docs/hackathon/quick-start/first-message", + // }, + // ], + // }, + // { + // text: "Deployment Options", + // collapsed: true, + // items: [ + // { + // text: "P2P Network Only", + // link: "/docs/hackathon/deployment/p2p-only", + // }, + // { + // text: "P2P Network with Proxy", + // link: "/docs/hackathon/deployment/p2p-with-proxy", + // }, + // ], + // }, + // { + // text: "Client Development", + // collapsed: true, + // items: [ + // { + // text: "mump2p-cli", + // link: "/docs/hackathon/clients/mump2p-cli", + // }, + // { + // text: "gRPC Client Examples", + // link: "/docs/hackathon/clients/grpc-examples", + // }, + // ], + // }, + // { + // text: "Configuration", + // collapsed: true, + // items: [ + // { + // text: "Protocol Selection", + // link: "/docs/hackathon/configuration/protocol-selection", + // }, + // { + // text: "OptimumP2P Configuration", + // link: "/docs/hackathon/configuration/optimump2p", + // }, + // { + // text: "GossipSub Configuration", + // link: "/docs/hackathon/configuration/gossipsub", + // }, + // ], + // }, + // ], + // }, { text: "Research", collapsed: false, diff --git a/docs/guides/01-getting-started-cli.md b/docs/guides/01-getting-started-cli.md new file mode 100644 index 0000000..75cf159 --- /dev/null +++ b/docs/guides/01-getting-started-cli.md @@ -0,0 +1,291 @@ +# Getting Started with mump2p CLI + +The `mump2p` CLI is the quickest way to interact with [OptimumP2P](https://github.com/getoptimum/optimum-p2p) without running your own infrastructure. + +In the next 5 minutes, you’ll have: + +* A working CLI +* Your first published message +* A subscription feeding you live data + + + +The `mump2p` CLI is your shortcut into `OptimumP2P` — a high-performance, RLNC-enhanced peer-to-peer network. + +Instead of: + +* Hunting for node IPs +* Wrestling with peer discovery +* Tweaking endless configurations + +...you simply point your CLI to our hosted `optimum-proxy` (available in multiple regions) and start sending or receiving messages instantly. +It connects to an `optimum-proxy` and lets you publish and subscribe to real-time topics — with authentication, usage tracking, and advanced delivery options. + + +## Why Optimum Proxy? + +OptimumP2P is a **peer-to-peer network** where nodes exchange messages over a `RLNC-enhanced` pubsub mesh. +If you connect directly to a P2P node, you need to: + +* Know node IP/port. +* Handle peer discovery. +* Many more complex configuration operations. + +The **Optimum Proxy** removes that complexity: + +* Acts as your **single point of entry**. +* Maintains connections to multiple OptimumP2P nodes. +* Reassembles messages from shards using RLNC. +* Enforces thresholds and applies filters. +* Tracks usage and applies fair rate limits. + + +## Why Authentication? + +Authentication in `mump2p-cli` is not just about logging in, it enables: + +* **Access Control**: Only authorized users can publish/subscribe to protected topics. +* **Rate Limits**: Prevents spam and ensures fair use. +* **Usage Tracking**: Monitor your publish/subscription stats. +* **Account Linking**: Associate activity with your user or team. + +Without authentication, you can only use **open/public topics** with strict limits. + +## How It Fits into the Network + +```plaintext +┌──────────────┐ ┌────────────────┐ ┌─────────────────────────────┐ +│ mump2p CLI │───▶ │ Optimum Proxy │───▶ │ OptimumP2P Mesh │ +└──────────────┘ └────────────────┘ └─────────────┬───────────────┘ + / │ \ + / │ \ + ┌────────▼─┐ │ ┌──────────┐ + │ P1:Tokyo │──┼──│P2:Singapore│ + └─────┬────┘ │ └──────┬─────┘ + │ │ │ + ┌─────▼────┐ │ ┌──────▼─────┐ + │P3:Frankf │──┼──│P4:New York │ + └──────────┘ │ └────────────┘ + │ + ┌─────▼─────┐ + │P5:Sydney │ + └─────┬─────┘ + │ + ┌──────▼──────┐ + │ Other Peers │ + └─────────────┘ + + +``` + +* CLI talks to the Proxy via gRPC/WebSocket. +* Proxy connects to the P2P Mesh (multiple nodes across regions). +* Mesh uses RLNC for efficient message delivery and reconstruction. +* Your client receives fully decoded messages in real-time. + + +## 1. Download the CLI + +Always grab the latest release from GitHub: + +### Linux + +```sh +LATEST=$(curl -s https://api.github.com/repos/getoptimum/mump2p-cli/releases/latest | grep "tag_name" | cut -d '"' -f 4) +curl -L -o mump2p https://github.com/getoptimum/mump2p-cli/releases/download/$LATEST/mump2p-linux +chmod +x mump2p + +``` + +### macOS + +```bash +LATEST=$(curl -s https://api.github.com/repos/getoptimum/mump2p-cli/releases/latest | grep "tag_name" | cut -d '"' -f 4) +curl -L -o mump2p https://github.com/getoptimum/mump2p-cli/releases/download/$LATEST/mump2p-darwin +chmod +x mump2p +``` + +You can visit [mump2p-cli release page](https://github.com/getoptimum/mump2p-cli/releases) for the latest version. + +--- + +### 2. Authenticate + +*mump2p-cli currently usage [auth0](https://auth0.com/) to manage authentication/authorization*. + +Login via device authorization flow: + +```sh +./mump2p login +``` + +1. CLI shows a URL and a code. +2. Open the URL in your browser. +3. Enter the code to complete authentication. +4. CLI stores a JWT for future requests. + +#### Check status + +```sh +./mump2p whoami +``` + +You will see the response in terminal as following: + +```sh +Authentication Status: +---------------------- +Client ID: USER_CLIENT_ID +Expires: 11 Aug 25 19:12 CEST +Valid for: 24h0m0s +Is Active: true + +Rate Limits: +------------ +Publish Rate: 2000 per hour +Publish Rate: 12 per second +Max Message Size: 10.00 MB +Daily Quota: 10240.00 MB +``` + + +**Important: By default `Is Active` is `false`. Contact us to activate your account.** + + +#### Other auth commands + +```sh +./mump2p refresh # Refresh token +./mump2p logout # Logout +``` + +### 3. Choose a Proxy Location + +**Available Service URLs:** + + +| Location | URL | +| ------------------- | ------------------- | +| **Tokyo (Default)** | 34.146.222.111:8080 | +| **Tokyo** | 35.221.118.95:8080 | +| **Singapore** | 34.142.205.26:8080 | + + +Use a custom location + +```sh +--service-url="http://34.142.205.26:8080" +``` + +--- + +### 4. Subscribe to a Topic + +#### Basic subscription + +```sh +./mump2p subscribe --topic=demo +``` + +#### Save messages locally + +```sh +./mump2p subscribe --topic=demo --persist=/path/to/ +``` + +#### Forward to webhook + +```sh +./mump2p subscribe --topic=demo --webhook=https://your-server.com/webhook +``` + +--- + +### 5. Publish a Message + +#### Text + +```sh +./mump2p publish --topic=demo --message="Hello from CLI!" +``` + +#### File + +```sh +./mump2p publish --topic=demo --file=/path/to/file.json +``` + +#### With threshold + +```sh +./mump2p publish --topic=demo --message="High reliability" --threshold=0.9 +``` + +--- + +### 6. Check Usage & Limits + +```sh +./mump2p usage +``` + +output: + +```sh + Publish (hour): 0 / 2000 + Publish (second): 0 / 12 + Data Used: 0.0000 MB / 10240.0000 MB + Next Reset: 11 Aug 25 21:10 CEST (24h0m0s from now) + Last Publish: 02 Jul 25 21:54 +0300 + ``` + +Shows: + +* Publish count (per hour/day) +* Quota usage +* Time until reset +* Token expiry + +--- + +### 7. Common Issues + +#### Unauthorized + +```sh +Error: your account is inactive +``` + +→ Contact admin to activate account. + +#### Rate limit exceeded + +```sh +Error: per-hour limit reached +``` + +→ Wait until reset or request higher tier. + +#### Connection refused + +```sh +Error: HTTP publish failed: dial tcp ... +``` + +→ Proxy not reachable. Check --service-url. + +### 8. Important Tips + +* Use descriptive topic names per team. +* Keep `whoami` and `usage` handy. +* For high-volume topics, increase webhook queue size. +* Start with hosted proxy, then try local deployment for full control. + +--- + +#### Important Links + +* [mump2p CLI Source Code](https://github.com/getoptimum/mump2p-cli) +* [Developer Guide](https://github.com/getoptimum/mump2p-cli/blob/main/docs/guide.md) +* [Release Page](https://github.com/getoptimum/mump2p-cli/releases) +* [Available Service URLs](https://github.com/getoptimum/mump2p-cli?tab=readme-ov-file#3-service-url--connectivity-issues) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md new file mode 100644 index 0000000..5e541ef --- /dev/null +++ b/docs/guides/02-getting-started-docker.md @@ -0,0 +1,247 @@ +# Getting Started with Docker (Local Deployment) + +Running **OptimumP2P** locally with Docker gives you **full control** over configuration, topology, and experiments. +You can run the network in two primary ways: + +1. **OptimumProxy + OptimumP2P** — Clients connect to an **Optimum Proxy**, which manages P2P connections for them. +2. **Direct OptimumP2P** — Clients connect directly to **OptimumP2P nodes** (each node must run the gRPC API). + +While the [mump2p-cli (Hosted Proxy)](./01-getting-started-cli.md) lets you get started instantly, +local deployment offers: + +* **Custom Configuration** — Tune thresholds, shard factors, and mesh sizes. +* **Full Control** — Decide how many nodes, their topology, and resource allocation. +* **Private Testing** — Run in isolated networks without using public proxies. +* **Advanced Experiments** — Simulate network conditions, failure scenarios, and scaling. + +## 1. Requirements + +* **Docker** +* **Docker Compose** +* **Go v1.24+** +* At least **2 GB free RAM** for running multiple nodes locally + +## 2. Components + +| Component | Purpose | Docker Images | +|-----------------|---------|---------------| +| **OptimumP2P Node** | RLNC-enabled mesh peer, encodes/decodes message shards, handles peer discovery and subscriptions. Optional gRPC API for direct clients. | `getoptimum/p2pnode:latest` | +| **Optimum Proxy** | Bridges clients and the mesh, manages subscriptions, shard reassembly, threshold logic, and node selection. | `getoptimum/proxy:latest` | + + +## Architecture Overview + +### **Option A — OptimumProxy + OptimumP2P** (recommended) + + +```plaintext +[Client (CLI / gRPC)] → [Optimum Proxy] → [OptimumP2P Mesh] +``` + +* Simplifies client configuration — only the Proxy address is needed. +* Proxy handles shard reassembly, threshold logic, and node selection. +* Easier scaling and centralized policy control. + +### 2. Option B — Direct OptimumP2P (advanced/low-latency) + + +```plaintext +[Client (gRPC)] → [OptimumP2P Node] ↔ [OptimumP2P Mesh] +``` + +* Fewer network hops = potentially lower latency. +* Clients must know node addresses and manage failover. +* Best for specialized or performance-critical workloads. + +This guide covers: + +* Setting up Docker Compose for both approach. +* Running and verifying the network. +* Connecting via CLI (`mump2p-cli`) or `gRPC clients` (Go examples included). +* Adjusting key parameters for your environment. + + + +## 2. Key Components + +### **OptimumP2P Node** + +* Participates in the RLNC-enabled mesh. +* Encodes/decodes message shards. +* Handles peer discovery and topic subscriptions. +* Optional: exposes a gRPC API for **Direct P2P** clients. + +### **Optimum Proxy** + +* Accepts gRPC or WebSocket connections from clients. +* Publishes/subscribes to P2P topics on behalf of connected clients. +* Handles authentication, filtering, and threshold logic. +* Shields clients from knowing internal P2P node details. + +--- + +## 3. Deployment Options + +### **Option A — Proxy + P2P** (Recommended) + +**Architecture:** +[Client (CLI / gRPC)] → [Gateway (Proxy)] → [P2P Mesh] + +yaml +Copy +Edit + +* Clients **do not** need to know about individual P2P nodes. +* The gateway manages which nodes to use per topic. +* Easier to scale and secure. + +--- + +### **Option B — Direct P2P** (Advanced) + +**Architecture:** +[Client (gRPC)] → [P2P Node] ↔ [P2P Mesh] + +yaml +Copy +Edit + +* Clients connect directly to a node’s gRPC API. +* Lower hop count, but requires more client configuration. +* Each client must know at least one node’s IP/port. + +--- + +## 4. Example Docker Compose Setup + +### **Proxy + P2P Mode** + +```yaml +version: "3.8" + +services: + gateway: + image: optimum-gateway:latest + environment: + - OPTIMUM_THRESHOLD=0.7 + - OPTIMUM_SHARD_FACTOR=8 + - MESH_TARGET=12 + - NODE_DISCOVERY=true + ports: + - "8081:8081" # gRPC/WebSocket API + depends_on: + - node1 + - node2 + + node1: + image: optimum-p2p-node:latest + environment: + - NODE_ID=node1 + - MESH_TARGET=12 + + node2: + image: optimum-p2p-node:latest + environment: + - NODE_ID=node2 + - MESH_TARGET=12 +Direct P2P Mode +yaml +Copy +Edit +version: "3.8" + +services: + node1: + image: optimum-p2p-node:latest + environment: + - NODE_ID=node1 + - MESH_TARGET=12 + ports: + - "50051:50051" # gRPC API for direct clients + + node2: + image: optimum-p2p-node:latest + environment: + - NODE_ID=node2 + - MESH_TARGET=12 +5. Starting the Network +bash +Copy +Edit +docker compose up -d +Check running containers: + +bash +Copy +Edit +docker compose ps +Verify gateway health (Proxy mode): + +bash +Copy +Edit +curl http://localhost:8081/api/v1/health +6. Connecting a Client +You can connect via CLI or via gRPC client code. + +Using mump2p-cli +Proxy mode: +bash +Copy +Edit +./mump2p subscribe --topic=demo --proxy=http://localhost:8081 +./mump2p publish --topic=demo --message="Hello from Proxy mode" --proxy=http://localhost:8081 +Direct P2P mode: +bash +Copy +Edit +./mump2p subscribe --topic=demo --proxy=grpc://localhost:50051 +./mump2p publish --topic=demo --message="Hello from Direct P2P" --proxy=grpc://localhost:50051 +Using a gRPC Client (Go Example) +Proxy connection: +bash +Copy +Edit +go run proxy_client.go --subscribe --topic=demo --proxy=localhost:8081 +Direct node connection: +bash +Copy +Edit +go run p2p_client.go --subscribe --topic=demo --node=localhost:50051 +Notes: + +proxy_client.go → Connects to Optimum Gateway. + +p2p_client.go → Connects directly to a P2P node. + +7. Configuration Parameters +Parameter Description +OPTIMUM_THRESHOLD Decoding threshold (0.0–1.0). +OPTIMUM_SHARD_FACTOR Number of shards generated per message. +MESH_TARGET Target number of peers per topic mesh. +NODE_DISCOVERY Whether the gateway auto-discovers P2P nodes. + +Edit in docker-compose.yml before starting. + +8. Stopping the Network +bash +Copy +Edit +docker compose down +Remove volumes and images: + +bash +Copy +Edit +docker compose down -v --rmi all +9. Next Step +Once your network is running, continue to 04 — Understanding Key Parameters to tune thresholds, shard counts, and mesh size for your workload. + +pgsql +Copy +Edit + +--- + +This keeps both **Proxy + P2P** and **Direct P2P** side-by-side, +and explicitly shows **CLI** and **Go gRPC client** commands for each mode. diff --git a/docs/guides/03-parameters.md b/docs/guides/03-parameters.md new file mode 100644 index 0000000..184f19d --- /dev/null +++ b/docs/guides/03-parameters.md @@ -0,0 +1,93 @@ +# Understanding Key Parameters + + +OptimumP2P supports **two gossip protocols**: + +1. **GossipSub** — the standard libp2p pub/sub protocol. +2. **OptimumP2P (RLNC)** — an enhanced gossip protocol using Random Linear Network Coding for faster, more resilient message propagation. + +Both protocols share similar topology concepts but differ in message encoding, redundancy, and forwarding logic. +This chapter explains: + +- Core gossip concepts. +- All tunable parameters for **both** protocols. +- How these parameters behave in **Proxy + P2P** vs **Direct P2P** modes. +- Pre-built tuning profiles. +- How to validate and experiment with changes. + +--- + +## 1. Core Concepts + +| Term | Description | +|------------|-------------| +| **Mesh** | The set of peers directly connected for a topic. | +| **Gossip** | Metadata exchange (who has what) with non-mesh peers. | +| **Fanout** | Temporary publishing links for unsubscribed topics. | +| **Degree** | Target number of mesh peers per topic. | +| **Shard** | A coded fragment of a message (OptimumP2P only). | +| **Threshold** | Fraction of shards required to reconstruct a message (OptimumP2P only). | + +--- + +## 2. Side-by-Side Parameters + +### 2.1 Topology Parameters + +| Setting | GossipSub Env Var | OptimumP2P Env Var | Default (GSub) | Default (Optimum) | Purpose | +|---------|------------------|--------------------|----------------|-------------------|---------| +| Mesh Target | `GOSSIPSUB_MESH_TARGET` | `OPTIMUM_MESH_TARGET` | 6 | 6 | Target peer connections per topic. | +| Mesh Min | `GOSSIPSUB_MESH_MIN` | `OPTIMUM_MESH_MIN` | 4 | 3 | Min peers before adding new ones. | +| Mesh Max | `GOSSIPSUB_MESH_MAX` | `OPTIMUM_MESH_MAX` | 12 | 12 | Max peers before pruning. | + +--- + +### 2.2 Message Size & Ports + +| Setting | GossipSub Env Var | OptimumP2P Env Var | Default | Purpose | +|---------|------------------|--------------------|---------|---------| +| Protocol Port | `GOSSIPSUB_PORT` | `OPTIMUM_PORT` | 6060 (GSub) / 7070 (Optimum) | P2P gossip communication port. | +| Max Message Size (bytes) | `GOSSIPSUB_MAX_MSG_SIZE` | `OPTIMUM_MAX_MSG_SIZE` | 1,048,576 (1MB) | Limit to prevent excessive memory usage. | + +--- + +### 2.3 RLNC-Specific Parameters (OptimumP2P Only) + +| Setting | Env Var | Default | Purpose | +|---------|---------|---------|---------| +| Shard Factor | `OPTIMUM_SHARD_FACTOR` | 4 | Number of coded shards per message. | +| Publisher Shard Multiplier | `OPTIMUM_SHARD_MULT` | 1.5 | Multiplies shard count when publishing for redundancy. | +| Forward Threshold | `OPTIMUM_THRESHOLD` | 0.75 | Fraction of shards needed before forwarding. | + +--- + +### 2.4 Timing (GossipSub Only) + +| Setting | Env Var | Default | Purpose | +|---------|---------|---------|---------| +| Heartbeat Interval | *(config file only)* | 1s | How often mesh maintenance runs. | +| Fanout TTL | *(config file only)* | 60s | Lifetime of fanout state. | +| Seen TTL | *(config file only)* | 120s | Duration to remember seen messages. | + +--- + +## 3. Parameter Impact by Deployment Mode + +| Parameter | Proxy + P2P | Direct P2P | +|-----------|-------------|------------| +| Mesh Target | Proxy benefits from denser mesh for faster shard aggregation; minor client effect. | Client performance depends entirely on connected node’s mesh density. | +| Shard Factor | Higher improves redundancy for proxy distribution; affects uplink load to proxy. | Client receives all shards directly; high values may saturate slow links. | +| Threshold | Proxy can forward early once threshold met; low thresholds speed delivery. | Client must wait to receive threshold shards; low values reduce latency but risk decode failures. | +| Max Message Size | Large values okay if proxy does decoding; in direct mode may strain client memory. | Client must handle full payload; keep conservative if on limited hardware. | + +--- + +## 4. Tuning Profiles + +### Low Latency +```yaml +# OptimumP2P +OPTIMUM_SHARD_FACTOR=4 +OPTIMUM_SHARD_MULT=1.2 +OPTIMUM_THRESHOLD=0.6 +OPTIMUM_MESH_TARGET=6 diff --git a/docs/guides/04-experiments.md b/docs/guides/04-experiments.md new file mode 100644 index 0000000..2ba6785 --- /dev/null +++ b/docs/guides/04-experiments.md @@ -0,0 +1,171 @@ +# Common Experiments + +This chapter gives you practical test scenarios to **measure and validate** OptimumP2P’s performance. +You’ll explore latency, reliability, and throughput under different network conditions — both for **GossipSub** and **OptimumP2P (RLNC)**. + +These experiments assume you have: + +- A **running network** (Proxy + P2P or Direct P2P). +- **Client access** via gRPC, REST, or CLI. +- The ability to **change parameters** (env vars or config files). +- Basic **monitoring tools** (logs, metrics, Grafana, or Prometheus). + +--- + +## 1. Experiment: Shard Factor Sweep + +**Goal:** See how coded shard count affects delivery reliability and CPU usage. + +**Setup:** +1. Start your network with these shard factor values: + - `OPTIMUM_SHARD_FACTOR=2` + - `OPTIMUM_SHARD_FACTOR=4` + - `OPTIMUM_SHARD_FACTOR=8` + - `OPTIMUM_SHARD_FACTOR=16` +2. Keep all other parameters identical. + +**Procedure:** +- Publish the same 1MB message to the same topic. +- Introduce artificial packet loss (e.g., `tc netem loss 20%`). +- Measure: + - Time to first full decode. + - Percentage of peers that successfully decoded. + - CPU load on sender and receiver. + +**Expected Result:** +- **Low values (2–4)**: Low CPU, but reduced reliability under loss. +- **High values (8–16)**: High reliability, but more CPU and bandwidth. + +--- + +## 2. Experiment: Forward Threshold Tuning + +**Goal:** Measure latency vs reliability when forwarding coded shards early. + +**Setup:** +- Keep `OPTIMUM_SHARD_FACTOR=8`. +- Test with: + - `OPTIMUM_THRESHOLD=0.5` + - `OPTIMUM_THRESHOLD=0.75` + - `OPTIMUM_THRESHOLD=0.9` + +**Procedure:** +- Publish bursts of small messages (50–100KB). +- Measure: + - End-to-end latency. + - % of decodes completed at each peer. + - Total shard traffic on the network. + +**Expected Result:** +- **Low threshold (0.5)**: Lower latency, slightly more failed decodes under loss. +- **High threshold (0.9)**: Slower, but highly reliable. + +--- + +## 3. Experiment: Mesh Density Impact + +**Goal:** Compare sparse vs dense peer connections. + +**Setup:** +- Keep shard factor and threshold constant. +- Change: + - Sparse mesh: `*_MESH_TARGET=4` + - Dense mesh: `*_MESH_TARGET=12` + +**Procedure:** +- Publish 100 messages to the topic. +- Log: + - Average peer-to-peer hop count. + - Message duplication count. + - Latency from first to last peer. + +**Expected Result:** +- Sparse mesh reduces bandwidth, increases hops. +- Dense mesh improves redundancy, may increase duplicates. + +--- + +## 4. Experiment: GossipSub vs OptimumP2P + +**Goal:** See if RLNC improves your specific network scenario. + +**Setup:** +- Run two identical networks: + - **GossipSub** — `NODE_MODE=gossipsub`, default mesh params. + - **OptimumP2P** — `NODE_MODE=optimum`, same mesh params, RLNC enabled. + +**Procedure:** +- Publish the same 100 messages to both networks. +- Measure: + - First-receiver latency. + - All-receivers latency. + - Total bytes transmitted. + - Reliability under induced packet loss. + +**Expected Result:** +- OptimumP2P should win on **lossy networks** due to redundancy. +- On perfect links, GossipSub may match latency but use less CPU. + +--- + +## 5. Experiment: Proxy + P2P vs Direct P2P + +**Goal:** Understand whether a proxy speeds up or slows down delivery in your use case. + +**Setup:** +- Same number of P2P nodes in both deployments. +- One with `gateway` (proxy) in front of clients. +- One where clients connect directly to P2P nodes. + +**Procedure:** +- Subscribe 10 clients to the same topic. +- Publish 50 messages from different P2P nodes. +- Measure: + - Average time from publish to all clients. + - Total client bandwidth usage. + - Proxy CPU load (if using gateway). + +**Expected Result:** +- Proxy improves aggregation and reduces uplink load from publisher. +- Direct P2P may reduce single-hop latency but increase total traffic. + +--- + +## 6. Experiment: Load Test + +**Goal:** Find the throughput limit before degradation. + +**Setup:** +- Use a load generator (e.g., `mump2p-cli` in a loop or a custom gRPC publisher). +- Keep parameters constant. + +**Procedure:** +- Gradually increase message rate from 10 msg/s to 1,000 msg/s. +- Watch: + - Message loss rate. + - Latency growth. + - Node CPU/memory. + +**Expected Result:** +- At some rate, latency spikes and reliability drops. +- Use results to size your cluster for production. + +--- + +## 7. Monitoring Checklist for All Experiments + +During each test: +- **Check logs** for errors (`grep error` or `grep shard`). +- **Check metrics**: + - `peer_count` + - `message_delivered_total` + - `shard_decoded_total` + - `delivery_latency_seconds` +- **Check system health**: + - CPU / Memory via `docker stats` + - Network usage via `iftop` or `nload` + +--- + +## Next Step +Move on to [06 — Monitoring & Debugging](06-monitoring-debugging.md) to learn how to interpret metrics and fix issues uncovered during testing. diff --git a/docs/guides/05-cleanup-reset.md b/docs/guides/05-cleanup-reset.md new file mode 100644 index 0000000..9e0318b --- /dev/null +++ b/docs/guides/05-cleanup-reset.md @@ -0,0 +1,188 @@ +# Cleanup & Reset and Important Commands + +## Overview + +After running tests, experiments, or demos with OptimumP2P, you’ll often want to clean up your environment to: + +- Free up system resources +- Avoid stale peers, topics, and bootstrap states +- Start fresh for new tests +- Reset configuration without leftover data + +This page covers: + +1. **Stopping Containers** +2. **Removing Local Data** +3. **Resetting Identity & State** +4. **Cleaning up Networks** +5. **Preparing for a Fresh Deployment** + +--- + +## 1. Stopping Containers + +### Stop All Running Containers +If you’re running with Docker Compose: +```bash +docker compose down +If you’re running containers individually: + +bash +Copy +Edit +docker stop $(docker ps -q --filter "ancestor=getoptimum/p2pnode:latest") +2. Removing Local Data +OptimumP2P stores persistent state such as: + +Identity keys (libp2p peer ID) + +Topic subscription cache + +RLNC shard cache + +Message history + +Prometheus WAL (if used) + +If you mounted a local directory (e.g. /tmp/p2pnode-data): + +bash +Copy +Edit +rm -rf /tmp/p2pnode-data +If you used Docker volumes: + +bash +Copy +Edit +docker volume ls +docker volume rm +3. Resetting Identity & State +Each node’s identity determines its PeerID. +If you want a node to appear as a brand new peer in the network, delete its identity directory. + +Example: + +bash +Copy +Edit +rm -rf ~/.optimum/identity +Or if using Docker Compose: + +yaml +Copy +Edit +services: + p2pnode: + volumes: + - ./identity:/identity +To reset: + +bash +Copy +Edit +rm -rf ./identity/* +4. Cleaning up Networks +Docker may keep custom bridge networks around, which can cause conflicts when re-deploying. + +List networks: + +bash +Copy +Edit +docker network ls +Remove unused networks: + +bash +Copy +Edit +docker network prune +Warning: This removes all unused networks, not just OptimumP2P ones. + +5. Preparing for a Fresh Deployment +When restarting a clean environment: + +Remove all containers + +bash +Copy +Edit +docker compose down --volumes --remove-orphans +Delete local data directories + +bash +Copy +Edit +rm -rf ./data +Re-generate configuration + +Update docker-compose.yml if needed + +Change CLUSTER_ID to avoid collision with old peers + +Reset bootstrap peers if you want a new network + +Restart deployment + +bash +Copy +Edit +docker compose up -d +6. Special Cases +Resetting Only the Gateway +If you want to keep the P2P network intact but reset the gateway: + +bash +Copy +Edit +docker compose stop gateway +docker compose rm -f gateway +rm -rf ./gateway-data +docker compose up -d gateway +Resetting Only a Single Node +bash +Copy +Edit +docker stop p2pnode-2 +docker rm p2pnode-2 +rm -rf ./p2pnode-2-data +docker compose up -d p2pnode-2 +7. Verification After Reset +After restarting: + +Check health: + +bash +Copy +Edit +curl http://localhost:9090/health +List peers: + +bash +Copy +Edit +curl http://localhost:9090/peers +List topics: + +bash +Copy +Edit +curl http://localhost:9090/topics +A fresh node should: + +Have 0 topics initially + +Connect to only configured bootstrap peers + +Have a new PeerID if identity was reset + +Quick Reset Command (nuclear option) +If you want to remove everything related to OptimumP2P from Docker in one go: + +bash +Copy +Edit +docker compose down --volumes --remove-orphans && \ +docker system prune -af --volumes && \ +rm -rf ./data ./identity ./gateway-data +⚠️ Warning: This will delete all Docker images, containers, volumes, and networks not currently in use. \ No newline at end of file diff --git a/docs/guides/06-faq-glossary.md b/docs/guides/06-faq-glossary.md new file mode 100644 index 0000000..ddf3d5f --- /dev/null +++ b/docs/guides/06-faq-glossary.md @@ -0,0 +1,114 @@ +# FAQ & Glossary + +This section gives you: +- **Quick answers** to common developer questions about OptimumP2P +- A **glossary** of important terms so you can follow discussions and logs without confusion + +--- + +## Frequently Asked Questions (FAQ) + +### 1. What’s the difference between **P2P-only** and **Proxy + P2P**? +- **P2P-only** — Clients connect directly to the P2P network over gRPC. +- **Proxy + P2P** — Clients connect to a gateway proxy, which manages subscriptions and publishes to the P2P mesh. + *Use Proxy + P2P if:* + - You want simplified client integration (especially from web or REST-based clients) + - You have multiple P2P nodes and want centralized control + +--- + +### 2. Do OptimumP2P and GossipSub nodes talk to each other? +No — each runs its own protocol and forms a separate mesh. +If you want both in the same experiment, you’ll need **separate bootstrap nodes**. + +--- + +### 3. Can I change parameters at runtime? +Most parameters are set at startup. For dynamic changes: +- Use the HTTP API where supported (e.g., topic subscriptions) +- Restart the node for mesh/shard/threshold changes + +--- + +### 4. Why am I seeing duplicate messages? +Possible causes: +- Multiple subscriptions to the same topic from one client +- Threshold too low, causing early forward from multiple peers +- Application logic not deduplicating payloads + +--- + +### 5. How do I test with a real-world loss scenario? +Use Linux traffic control (`tc`) or Docker network emulation: +```bash +tc qdisc add dev eth0 root netem loss 10% +Then observe recovery via RLNC redundancy. + +6. What ports should I expose? +Typical defaults: + +OptimumP2P protocol: 7070 + +GossipSub protocol: 6060 + +gRPC Sidecar API: 33212 + +HTTP API: 9090 +Expose only what your topology requires. + +7. Can I run OptimumP2P on the same machine as my app? +Yes. Use: + +localhost for API calls + +Docker bridge or host networking to connect to other peers + +8. What happens if the bootstrap node goes down? +Existing peers remain connected, but: + +New peers can’t join until another bootstrap is available + +It’s recommended to have multiple bootstrap nodes for redundancy + +9. How do I monitor shard decoding? +Check logs for: + +bash +Copy +Edit +grep -E "(shard|decode|threshold)" node.log +Or use /metrics Prometheus endpoint for shard counters. + +10. Is there a message size limit? +Yes — controlled by: + +OPTIMUM_MAX_MSG_SIZE for OptimumP2P + +GOSSIPSUB_MAX_MSG_SIZE for GossipSub +Default: 1MB per message. + +Glossary +Term Definition +Topic A named channel for publishing/subscribing messages +Shard A coded fragment of a message in RLNC +Threshold Minimum fraction of shards needed to decode a message +Mesh Subset of peers directly connected for a given topic +Gossip Metadata exchange about available messages between non-mesh peers +Bootstrap Node A known peer used to join the network +PeerID Unique identifier for a node in the P2P network +RLNC Random Linear Network Coding — coding method for redundancy & efficiency +Gateway A proxy between clients and P2P nodes, often used for REST or centralized control +Fanout Temporary peer set for publishing when not subscribed to a topic +GRAFT / PRUNE GossipSub control messages to add/remove peers from a mesh +IHAVE / IWANT GossipSub messages for announcing/requesting message IDs + +See Also +04 — Understanding Key Parameters + +06 — Monitoring & Debugging + +09 — Next Steps + +yaml +Copy +Edit diff --git a/docs/guides/07-next-steps.md b/docs/guides/07-next-steps.md new file mode 100644 index 0000000..00452fc --- /dev/null +++ b/docs/guides/07-next-steps.md @@ -0,0 +1,104 @@ +# Next Steps + +You’ve installed OptimumP2P, sent your first messages, tuned key parameters, and explored monitoring. +Now it’s time to take your deployment further — integrating it into your projects, scaling for real-world scenarios, and experimenting with advanced setups. + +--- + +## 1. Integrate with Your Application + +Depending on your architecture, you can connect your app to OptimumP2P in one of two main ways: + +- **Direct P2P Client** + - Use gRPC to connect directly to P2P nodes. + - Best for low-latency, high-throughput scenarios. + - Requires your app to manage peer discovery and reconnections. + +- **Gateway (Proxy + P2P)** + - Connect via REST or gRPC to a gateway that bridges to the P2P mesh. + - Best for web clients, services without native P2P support, or multi-node orchestration. + - Lets you centralize authentication, logging, and metrics. + +📚 See: [Client Integration Guide](../clients/) + +--- + +## 2. Experiment with Advanced Configurations + +- **RLNC Tuning** + - Increase `OPTIMUM_SHARD_FACTOR` for higher fault tolerance. + - Lower `OPTIMUM_THRESHOLD` for faster forwarding. + - Observe trade-offs between redundancy, latency, and bandwidth. + +- **Mesh Topology** + - Test sparse (`MESH_TARGET=4`) vs dense (`MESH_TARGET=10`) topologies. + - Use multiple bootstrap nodes to reduce single points of failure. + +- **Protocol Comparisons** + - Run identical workloads on OptimumP2P and GossipSub. + - Measure latency, message loss recovery, and CPU/memory usage. + +--- + +## 3. Add Metrics and Dashboards + +- Enable the `/metrics` endpoint. +- Integrate with **Prometheus** for collection. +- Build **Grafana dashboards** to visualize: + - Peer counts + - Shard forwarding/decoding + - Message throughput + - Latency distributions + +📚 See: [06 — Monitoring & Debugging](06-monitoring-debugging.md) + +--- + +## 4. Deploy in a Distributed Environment + +- Test across multiple regions for realistic latency. +- Use cloud instances (AWS, GCP, Azure) with Docker Compose or Kubernetes. +- Secure nodes using: + - Private bootstrap peers + - TLS for gRPC + - Firewall rules for P2P ports + +--- + +## 5. Integrate into Hackathon or Production Workflows + +- For **hackathons**: + - Prepare a minimal setup with clear CLI commands for teammates. + - Focus on quick feedback loops and easy parameter changes. + +- For **production**: + - Automate deployment with Terraform or Ansible. + - Implement rolling updates for zero downtime. + - Add continuous monitoring and alerting. + +--- + +## 6. Contribute to OptimumP2P + +- Submit improvements or bug reports. +- Share performance results from different configurations. +- Contribute new client libraries or example integrations. + +--- + +## 7. Plan for Upcoming Features + +Watch for: +- **DeRAM Integration** — Optimized memory handling for large datasets. +- **Blockchain-Specific Modules** — Direct integration with Ethereum, Solana, and others. +- **Advanced Tuning Tools** — Real-time mesh and shard adjustments. + +📬 Stay updated by following announcements in the OptimumP2P developer community. + +--- + +## See Also + +- [04 — Understanding Key Parameters](04-parameters.md) +- [05 — Common Experiments](05-experiments.md) +- [08 — FAQ & Glossary](08-faq-glossary.md) diff --git a/docs/guides/overview.md b/docs/guides/overview.md new file mode 100644 index 0000000..762512e --- /dev/null +++ b/docs/guides/overview.md @@ -0,0 +1,61 @@ +# Overview + +This developer guide is your complete reference for installing, configuring, and operating **OptimumP2P**. + +This guide walks you through everything you need to **understand**, **deploy**, **run**, and **experiment** with OptimumP2P. +It’s designed for beginners but complete enough for advanced developers to jump in and integrate. + +If you want deep technical theory, see the **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** — this guide stays hands-on. + +Whether you are an application developer, or a systems engineer or a hackathon participant, this guide will help you: + +1. **Install and run** OptimumP2P in different environments. +2. **Connect clients** via gRPC, REST, or CLI. +3. **Tune parameters** for performance or reliability. +4. **Run experiments** to validate system behavior. +5. **Monitor and debug** your deployment. + +## Key Concepts + +Before diving in, you should be familiar with these terms and how they relate to OptimumP2P’s architecture: + +| Term | Description | +|--------------|-------------| +| **Topic** | A named channel for publishing and subscribing to messages. Peers in the same topic exchange messages relevant only to that topic. | +| **Message** | The original data you publish to a topic (e.g., text, JSON, binary). | +| **Shard** | A coded fragment of a message produced by RLNC (Random Linear Network Coding). Shards allow messages to be reconstructed even if some are lost. | +| **Threshold**| The fraction of shards required to successfully decode a message. For example, a threshold of 0.7 means only 70% of shards are needed. | +| **RLNC** | Random Linear Network Coding — a technique that mixes message fragments mathematically for redundancy and efficiency. | +| **Mesh** | The set of directly connected peers in a topic. The mesh topology affects redundancy, latency, and fault tolerance. | +| **Bootstrap Node** | A known peer address used to join the P2P network. Without one, a new node cannot discover other peers. | +| **Optimum Proxy** | A bridge between clients and the P2P mesh. It manages subscriptions, publications, and threshold logic on behalf of clients. | +| **Direct P2P Mode** | Clients connect directly to P2P nodes via gRPC without going through a proxy. This can reduce latency but requires more configuration. | +| **Mesh Parameters** | Settings such as `MESH_TARGET` that define how many peers a node tries to keep in its topic mesh. | +| **Fanout** | A temporary set of peers a publisher sends messages to when it is not part of the topic mesh. | +| **Control Messages** | Special messages like GRAFT, PRUNE, IHAVE, IWANT used for GossipSub mesh management. OptimumP2P integrates similar control flows for RLNC. | +| **Node Discovery** | The process by which proxies or nodes automatically learn about other nodes to connect to. | +| **gRPC API** | The RPC interface provided by either a P2P node or a proxy for client communication. | + +--- + + +## What This Guide Covers + +This guide is organized into self-contained chapters: + +1. **[Getting Started with CLI](01-getting-started-cli.md)** — Use `mump2p-cli` to connect to a hosted Optimum Proxy with no setup required. +2. **[Getting Started with Docker](02-getting-started-docker.md)** — Run your own local proxy and P2P nodes for full control. +3. **[Understanding Key Parameters](03-parameters.md)** — Tune thresholds, shards, and mesh settings for your workload. +4. **[Common Experiments](04-experiments.md)** — Test performance and reliability under different conditions. +5. **[Cleanup & Reset](05-cleanup-reset.md)** — Safely remove or reset your test setup. +6. **[FAQ & Glossary](06-faq-glossary.md)** — Quick answers and key term definitions. +7. **[Next Steps](07-next-steps.md)** — Ideas for integration and advanced usage. + + +## Who This Guide Is For + +* **Application developers** who want to integrate fast, resilient messaging. +* **Infrastructure engineers** deploying distributed systems. +* **Hackathon teams** experimenting with real-time messaging. +* **Researchers** testing RLNC in real-world scenarios. + diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md index e4805ff..fcef6f6 100644 --- a/docs/hackathon/overview.md +++ b/docs/hackathon/overview.md @@ -1,128 +1,62 @@ -# OptimumP2P Network Configuration Guide +# OptimumP2P Quickstart & Developer Guide -This guide helps you install, run, and experiment with OptimumP2P — a next-generation gossip protocol built for Web3 networks. -Whether you’re a hacker, builder, or researcher, this guide will walk you through: +This guide walks you through everything you need to **understand**, **deploy**, **run**, and **experiment** with OptimumP2P. +It’s designed for beginners but complete enough for advanced developers to jump in and integrate. -* Setup and deployment -* Messaging and client integration -* Configuration and tuning -* Performance testing -* Debugging and troubleshooting +If you want deep technical theory, see the **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** — this guide stays hands-on. -Start with the [OptimumP2P Technical Overview](../learn/overview/p2p.md) — a primer on how RLNC-based gossip works. ---- +## Table of Contents -## 📚 Table of Contents +1. [What You’ll Build](#-what-youll-build): A high-level look at the system you’ll set up and the end goal. +2. [Prerequisites](#-prerequisites) +3. [Installation & Setup](#-installation--setup) +4. [Deploying the Network](#-deploying-the-network) +5. [Sending & Receiving Your First Message](#-sending--receiving-your-first-message) +6. [Multiple Topics & Isolation](#-multiple-topics--isolation) +7. [Load Testing](#-load-testing) +8. [Key Parameters Explained](#-key-parameters-explained) +9. [Monitoring & Debugging](#-monitoring--debugging) +10. [Cleanup & Reset](#-cleanup--reset) +11. [FAQ & Glossary](#-faq--glossary) +12. [Next Steps](#-next-steps) +13. [More Coming Soon](#-more-coming-soon) -
-Expand to view all sections -- [OptimumP2P Network Configuration Guide](#optimump2p-network-configuration-guide) - - [📚 Table of Contents](#-table-of-contents) - - [Quick Start](#quick-start) - - [1. Install Dependencies](#1-install-dependencies) - - [2. Send Your First Message](#2-send-your-first-message) - - [Deployment Options](#deployment-options) - - [OptimumP2P Nodes](#optimump2p-nodes) - - [Proxy + OptimumP2P Nodes (Recommended)](#proxy--optimump2p-nodes-recommended) - - [Client Integration](#client-integration) - - [CLI](#cli) - - [App Integration](#app-integration) - - [Configuration](#configuration) - - [Performance \& Comparison](#performance--comparison) - - [Docker Images Used](#docker-images-used) - - [Architecture Deep Dive](#architecture-deep-dive) +## What You’ll Build -
+By the end of this guide, you will have: ---- +* A **local OptimumP2P network** with 4 P2P nodes + 2 proxy servers +* The ability to **send and receive messages in real-time** over gRPC +* Support for **multiple topics** with complete isolation +* Tools for **load testing, debugging, and monitoring** -## Quick Start +## Prerequisites -Get a local OptimumP2P network running in minutes: +Before starting, make sure you have: -### 1. [Install Dependencies](./quick-start/installation.md) +* **Docker** ([Install here](https://www.docker.com/products/docker-desktop)) +* **Docker Compose** (comes with Docker Desktop) +* **Git** (optional, but recommended) +* **Go 1.24+** ([Install here](https://go.dev/dl/)) — only needed if running the Go client -* Docker + Docker Compose -* Git (optional) -* Go (for client dev) +**Check your setup:** -### 2. [Send Your First Message](./quick-start/first-message.md) +```bash +docker --version +docker-compose --version +go version +``` -* Start 4 P2P nodes + 2 proxy -* Subscribe to a topic -* Publish messages via REST/gRPC -* Receive live decoded messages +## Installation & Setup ---- +### **Create a working directory** -## Deployment Options +```sh +mkdir optimump2p-hackathon && cd optimump2p-hackathon +``` -Choose a setup depending on your use case: +1. **Prepare identity folder** -### OptimumP2P Nodes - -Deploys just the gossip layer (lightweight, direct node-to-node). -[Guide →](./deployment/p2p-only.md) - -### Proxy + OptimumP2P Nodes (Recommended) - -Adds REST and gRPC APIs for clients, UIs, testing. -[Guide →](./deployment/p2p-with-proxy.md) - ---- - -## Client Integration - -### CLI - -* **[mump2p-cli](./clients/mump2p-cli.md)** — Simple tool to test publish/subscribe - -### App Integration - -* **[gRPC Examples](./clients/grpc-examples.md)** — Full Go clients using bi-directional streaming - -Use these to build chat apps, multiplayer games, decentralized sensors, or MEV relays. - ---- - - -## Configuration - -Fine-tune OptimumP2P for your use case: - -* **[Protocol Selection](./configuration/protocol-selection.md)** - Switch between OptimumP2P and GossipSub modes -* **[OptimumP2P Configuration](./configuration/optimump2p.md)** - RLNC parameters, mesh topology, and performance tuning -* **[GossipSub Configuration](./configuration/gossipsub.md)** - Standard GossipSub parameters for comparison - -## Performance & Comparison - -Benchmark and compare OptimumP2P: - -* **[Metrics Collection](./clients/)** - Understanding performance metrics -* **[OptimumP2P vs GossipSub](./clients/)** - Performance comparison methodology - -## Docker Images Used - -The hackathon uses these pre-built Docker images: - -* **`getoptimum/p2pnode:latest`** - Core P2P node with OptimumP2P protocol -* **`getoptimum/proxy:latest`** - Proxy service for client APIs - -Both images support protocol switching: - -* `NODE_MODE=optimum` - RLNC-enhanced OptimumP2P (recommended) -* `NODE_MODE=gossipsub` - Standard GossipSub for comparison - -See **[Protocol Selection](./configuration/protocol-selection.md)** for detailed configuration and deployment examples. - -## Architecture Deep Dive - -For developers and integrators: - -* **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** - Complete technical specification - ---- - -**Ready to get started?** Begin with **[Installation](./quick-start/installation.md)** or dive into the **[Technical Overview](../learn/overview/p2p.md)**. +The identity folder stores node peer IDs. diff --git a/index.md b/index.md index 10f11a8..0d9e8a9 100644 --- a/index.md +++ b/index.md @@ -24,8 +24,8 @@ features: details: Access resources for understanding the inner workings of Optimum and the research behind the technology. link: /docs/research/overview icon: 🔎 - - title: Hackathon Documentation + - title: Quickstart & Developer Guide details: Complete guide for building applications on OptimumP2P with deployment options, client examples, and configuration. - link: /docs/hackathon/overview + link: /docs/guides/overview icon: 🚀 --- From 2c66cdc195d9eac6e76ae5e7f321934cf647a9ae Mon Sep 17 00:00:00 2001 From: singhhp1069 Date: Mon, 11 Aug 2025 15:07:26 +0200 Subject: [PATCH 21/46] docs: fix the pending docs --- .vitepress/config.mts | 126 +-- docs/guides/01-getting-started-cli.md | 13 +- docs/guides/02-getting-started-docker.md | 587 +++++++++---- docs/guides/03-parameters.md | 191 +++-- docs/guides/04-experiments.md | 209 ++--- docs/guides/05-cleanup-reset.md | 188 ---- docs/guides/05-faq-glossary.md | 12 + docs/guides/06-faq-glossary.md | 114 --- docs/guides/06-next-steps.md | 66 ++ docs/guides/07-next-steps.md | 104 --- docs/guides/overview.md | 5 +- docs/hackathon/clients/grpc-examples.md | 717 ---------------- docs/hackathon/clients/mump2p-cli.md | 207 ----- docs/hackathon/configuration/gossipsub.md | 124 --- docs/hackathon/configuration/optimump2p.md | 246 ------ .../configuration/protocol-selection.md | 271 ------ docs/hackathon/deployment/p2p-only.md | 289 ------- docs/hackathon/deployment/p2p-with-proxy.md | 455 ---------- docs/hackathon/overview.md | 62 -- docs/hackathon/quick-start/first-message.md | 809 ------------------ docs/hackathon/quick-start/installation.md | 80 -- index.md | 8 +- 22 files changed, 711 insertions(+), 4172 deletions(-) delete mode 100644 docs/guides/05-cleanup-reset.md create mode 100644 docs/guides/05-faq-glossary.md delete mode 100644 docs/guides/06-faq-glossary.md create mode 100644 docs/guides/06-next-steps.md delete mode 100644 docs/guides/07-next-steps.md delete mode 100644 docs/hackathon/clients/grpc-examples.md delete mode 100644 docs/hackathon/clients/mump2p-cli.md delete mode 100644 docs/hackathon/configuration/gossipsub.md delete mode 100644 docs/hackathon/configuration/optimump2p.md delete mode 100644 docs/hackathon/configuration/protocol-selection.md delete mode 100644 docs/hackathon/deployment/p2p-only.md delete mode 100644 docs/hackathon/deployment/p2p-with-proxy.md delete mode 100644 docs/hackathon/overview.md delete mode 100644 docs/hackathon/quick-start/first-message.md delete mode 100644 docs/hackathon/quick-start/installation.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 7433aa1..1e00258 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -157,7 +157,7 @@ function nav() { { text: "Menu", items: [ - { text: "Get Started", link: "/docs/how-to-guides/overview" }, + // { text: "Get Started", link: "/docs/how-to-guides/overview" }, { text: "Learn", link: "/docs/learn/overview/intro" }, { text: "Resources", @@ -257,136 +257,16 @@ function sidebarHome() { text: "Common Experiments", link: "/docs/guides/04-experiments", }, - { - text: "Cleaning Up and Reset", - link: "/docs/guides/05-cleanup-reset", - }, { text: "FAQ Glossary", - link: "/docs/guides/06-faq-glossary", + link: "/docs/guides/05-faq-glossary", }, { text: "Next Steps", - link: "/docs/guides/07-next-steps", + link: "/docs/guides/06-next-steps", }, - // { - // text: "Deployment Options", - // collapsed: true, - // items: [ - // { - // text: "P2P Network Only", - // link: "/docs/hackathon/deployment/p2p-only", - // }, - // { - // text: "P2P Network with Proxy", - // link: "/docs/hackathon/deployment/p2p-with-proxy", - // }, - // ], - // }, - // { - // text: "Client Development", - // collapsed: true, - // items: [ - // { - // text: "mump2p-cli", - // link: "/docs/hackathon/clients/mump2p-cli", - // }, - // { - // text: "gRPC Client Examples", - // link: "/docs/hackathon/clients/grpc-examples", - // }, - // ], - // }, - // { - // text: "Configuration", - // collapsed: true, - // items: [ - // { - // text: "Protocol Selection", - // link: "/docs/hackathon/configuration/protocol-selection", - // }, - // { - // text: "OptimumP2P Configuration", - // link: "/docs/hackathon/configuration/optimump2p", - // }, - // { - // text: "GossipSub Configuration", - // link: "/docs/hackathon/configuration/gossipsub", - // }, - // ], - // }, ], }, - // { - // text: "Hackathon Docs", - // collapsed: false, - // items: [ - // { - // text: "Overview", - // link: "/docs/hackathon/overview", - // }, - // { - // text: "Quick Start", - // collapsed: true, - // items: [ - // { - // text: "Installation & Setup", - // link: "/docs/hackathon/quick-start/installation", - // }, - // { - // text: "First Message Example", - // link: "/docs/hackathon/quick-start/first-message", - // }, - // ], - // }, - // { - // text: "Deployment Options", - // collapsed: true, - // items: [ - // { - // text: "P2P Network Only", - // link: "/docs/hackathon/deployment/p2p-only", - // }, - // { - // text: "P2P Network with Proxy", - // link: "/docs/hackathon/deployment/p2p-with-proxy", - // }, - // ], - // }, - // { - // text: "Client Development", - // collapsed: true, - // items: [ - // { - // text: "mump2p-cli", - // link: "/docs/hackathon/clients/mump2p-cli", - // }, - // { - // text: "gRPC Client Examples", - // link: "/docs/hackathon/clients/grpc-examples", - // }, - // ], - // }, - // { - // text: "Configuration", - // collapsed: true, - // items: [ - // { - // text: "Protocol Selection", - // link: "/docs/hackathon/configuration/protocol-selection", - // }, - // { - // text: "OptimumP2P Configuration", - // link: "/docs/hackathon/configuration/optimump2p", - // }, - // { - // text: "GossipSub Configuration", - // link: "/docs/hackathon/configuration/gossipsub", - // }, - // ], - // }, - // ], - // }, { text: "Research", collapsed: false, diff --git a/docs/guides/01-getting-started-cli.md b/docs/guides/01-getting-started-cli.md index 75cf159..f5f0364 100644 --- a/docs/guides/01-getting-started-cli.md +++ b/docs/guides/01-getting-started-cli.md @@ -14,11 +14,11 @@ The `mump2p` CLI is your shortcut into `OptimumP2P` — a high-performance, RLNC Instead of: -* Hunting for node IPs -* Wrestling with peer discovery -* Tweaking endless configurations +* Manually locating and connecting to active OptimumP2P nodes +* Handling low-level peer discovery and connection logic +* Managing complex network and encoding configurations -...you simply point your CLI to our hosted `optimum-proxy` (available in multiple regions) and start sending or receiving messages instantly. +The `mump2p` CLI connects you directly to our hosted `optimum-proxy` (available in multiple regions) and start sending or receiving messages instantly. It connects to an `optimum-proxy` and lets you publish and subscribe to real-time topics — with authentication, usage tracking, and advanced delivery options. @@ -39,6 +39,7 @@ The **Optimum Proxy** removes that complexity: * Enforces thresholds and applies filters. * Tracks usage and applies fair rate limits. +With `mump2p`, you connect only to the proxy — it does the rest. ## Why Authentication? @@ -55,7 +56,7 @@ Without authentication, you can only use **open/public topics** with strict limi ```plaintext ┌──────────────┐ ┌────────────────┐ ┌─────────────────────────────┐ -│ mump2p CLI │───▶ │ Optimum Proxy │───▶ │ OptimumP2P Mesh │ +│ mump2p CLI │───▶ │ Optimum Proxy │───▶ │ OptimumP2P Network │ └──────────────┘ └────────────────┘ └─────────────┬───────────────┘ / │ \ / │ \ @@ -74,8 +75,6 @@ Without authentication, you can only use **open/public topics** with strict limi ┌──────▼──────┐ │ Other Peers │ └─────────────┘ - - ``` * CLI talks to the Proxy via gRPC/WebSocket. diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index 5e541ef..324c633 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -3,8 +3,29 @@ Running **OptimumP2P** locally with Docker gives you **full control** over configuration, topology, and experiments. You can run the network in two primary ways: -1. **OptimumProxy + OptimumP2P** — Clients connect to an **Optimum Proxy**, which manages P2P connections for them. -2. **Direct OptimumP2P** — Clients connect directly to **OptimumP2P nodes** (each node must run the gRPC API). +**1. OptimumProxy + OptimumP2P** — Clients connect to an **Optimum Proxy**, which manages P2P connections for them. + + +```plaintext +[Client (CLI / gRPC)] → [Optimum Proxy] → [OptimumP2P Mesh] +``` + +* Simplifies client configuration — only the Proxy address is needed. +* Proxy handles shard reassembly, threshold logic, and node selection. +* Easier scaling and centralized policy control. + +**2. Direct OptimumP2P** — Clients connect directly to **OptimumP2P nodes** (each node must run the gRPC API). + + + +```plaintext +[Client (gRPC)] → [OptimumP2P Node] ↔ [OptimumP2P Mesh] +``` + +* Fewer network hops = potentially lower latency. +* Clients must know node addresses and manage failover. +* Best for specialized or performance-critical workloads. + While the [mump2p-cli (Hosted Proxy)](./01-getting-started-cli.md) lets you get started instantly, local deployment offers: @@ -14,44 +35,62 @@ local deployment offers: * **Private Testing** — Run in isolated networks without using public proxies. * **Advanced Experiments** — Simulate network conditions, failure scenarios, and scaling. -## 1. Requirements +## 1. Before You Start +### Requirements + * **Docker** * **Docker Compose** * **Go v1.24+** * At least **2 GB free RAM** for running multiple nodes locally -## 2. Components +### Components -| Component | Purpose | Docker Images | -|-----------------|---------|---------------| +| Component | Purpose | Docker Images | +| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | | **OptimumP2P Node** | RLNC-enabled mesh peer, encodes/decodes message shards, handles peer discovery and subscriptions. Optional gRPC API for direct clients. | `getoptimum/p2pnode:latest` | -| **Optimum Proxy** | Bridges clients and the mesh, manages subscriptions, shard reassembly, threshold logic, and node selection. | `getoptimum/proxy:latest` | +| **Optimum Proxy** | Bridges clients and the mesh, manages subscriptions, shard reassembly, threshold logic, and node selection. | `getoptimum/proxy:latest` | -## Architecture Overview -### **Option A — OptimumProxy + OptimumP2P** (recommended) +### Directory layout - -```plaintext -[Client (CLI / gRPC)] → [Optimum Proxy] → [OptimumP2P Mesh] +Create a clean working folder: + +```sh +mkdir -p ~/optimum-local/{proxy-p2p,direct-p2p,identity} +cd ~/optimum-local ``` -* Simplifies client configuration — only the Proxy address is needed. -* Proxy handles shard reassembly, threshold logic, and node selection. -* Easier scaling and centralized policy control. +We’ll keep identity in `./identity` folder so you can reuse keys across restarts. -### 2. Option B — Direct OptimumP2P (advanced/low-latency) - -```plaintext -[Client (gRPC)] → [OptimumP2P Node] ↔ [OptimumP2P Mesh] + +## 2. Pick Your Mode + +| Recommended mode | Why | +| ----------------------------- | ----------------------------------------------------------------------------------------- | +| **OptimumProxy + OptimumP2P** | One endpoint for clients, proxy handles matching, decoding thresholds, fanout, and policy | +| **Direct OptimumP2P** | Fewer hops, you control connection/retry logic and node selection | + + +### 3. Generate a Bootstrap Identity (once) + +For stable bootstrapping, generate a persistent identity: + + +```sh +# Create identity dir +mkdir -p ./identity + +# Generate a key (container provides the helper) +docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key +# Print the libp2p Peer ID from that key +export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest peer-id) +echo "BOOTSTRAP_PEER_ID=${BOOTSTRAP_PEER_ID}" ``` -* Fewer network hops = potentially lower latency. -* Clients must know node addresses and manage failover. -* Best for specialized or performance-critical workloads. +We’ll reference `${BOOTSTRAP_PEER_ID}` in `docker-compose` files so all peers can discover the bootstrap node. This guide covers: @@ -60,188 +99,392 @@ This guide covers: * Connecting via CLI (`mump2p-cli`) or `gRPC clients` (Go examples included). * Adjusting key parameters for your environment. +## 3 Mode A — OptimumProxy + OptimumP2P (Recommended) +### Create the docker-compose file -## 2. Key Components +Save as `./proxy-p2p/docker-compose.yml`: -### **OptimumP2P Node** +```yaml +services: + proxy: + image: 'getoptimum/proxy:latest' + platform: linux/amd64 + environment: + - PROXY_PORT=:8080 # internal port, mapped below + - CLUSTER_ID=proxy-1 + - ENABLE_AUTH=false # set true in prod; see "Auth" below + - LOG_LEVEL=debug + # list of P2P node sidecar (gRPC) addresses (container DNS names) + - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212 + depends_on: + - p2pnode-1 + - p2pnode-2 + ports: + - "8081:8080" # HTTP/WebSocket API (POST /publish, WS /ws, GET /health) + - "50051:50051" # (optional) proxy gRPC, if exposed by your proxy build + networks: + testnet: + ipv4_address: 172.28.0.10 + + p2pnode-1: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + volumes: + - ../identity:/identity + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum # or gossipsub + - IDENTITY_DIR=/identity + # Ports + - SIDECAR_PORT=33212 # client/proxy gRPC port + - API_PORT=9090 # node REST API + - OPTIMUM_PORT=7070 # inter-node P2P + # Mesh & RLNC + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + ports: + - "33221:33212" # sidecar gRPC (host) + - "9091:9090" # node API (host) + - "7071:7070" # P2P (host; optional if single host only) + networks: + testnet: + ipv4_address: 172.28.0.11 + + p2pnode-2: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + environment: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-2 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + # Bootstrap to node-1 (libp2p multiaddr) + - BOOTSTRAP_PEERS=/ip4/172.28.0.11/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + ports: + - "33222:33212" + - "9092:9090" + - "7072:7070" + networks: + testnet: + ipv4_address: 172.28.0.12 + +networks: + testnet: + driver: bridge + ipam: + config: + - subnet: 172.28.0.0/16 +``` -* Participates in the RLNC-enabled mesh. -* Encodes/decodes message shards. -* Handles peer discovery and topic subscriptions. -* Optional: exposes a gRPC API for **Direct P2P** clients. +*Why fixed IPs?* -### **Optimum Proxy** +It makes the bootstrap address deterministic `(/ip4/172.28.0.11/tcp/7070/p2p/)`. +You can use the default bridge and service names, but then set `BOOTSTRAP_PEERS` to a reachable address. -* Accepts gRPC or WebSocket connections from clients. -* Publishes/subscribes to P2P topics on behalf of connected clients. -* Handles authentication, filtering, and threshold logic. -* Shields clients from knowing internal P2P node details. +See the [Parameter Section](./03-parameters.md) for config options and port usage. ---- +### Start the Network -## 3. Deployment Options +```sh +cd ~/optimum-local/proxy-p2p +export BOOTSTRAP_PEER_ID= +docker compose up -d +``` -### **Option A — Proxy + P2P** (Recommended) +### Validate everything is healthy -**Architecture:** -[Client (CLI / gRPC)] → [Gateway (Proxy)] → [P2P Mesh] +```sh +docker compose ps +docker compose logs -f proxy | sed -n '1,120p +``` -yaml -Copy -Edit +#### Health checks -* Clients **do not** need to know about individual P2P nodes. -* The gateway manages which nodes to use per topic. -* Easier to scale and secure. +```sh +# Proxy +curl -s http://localhost:8081/api/version ---- +TODO:: update with the correct version and health endpoint after fixing https://github.com/getoptimum/optimum-proxy/issues/145 -### **Option B — Direct P2P** (Advanced) +# Nodes +curl -s http://localhost:9091/api/v1/health +curl -s http://localhost:9092/api/v1/health -**Architecture:** -[Client (gRPC)] → [P2P Node] ↔ [P2P Mesh] +# Peers seen by node-2 (should include node-1) +curl -s http://localhost:9092/api/v1/node-state | jq '.peers' +``` -yaml -Copy -Edit +You should see the mesh forming and node-2 discovering node-1 via the bootstrap address. + -* Clients connect directly to a node’s gRPC API. -* Lower hop count, but requires more client configuration. -* Each client must know at least one node’s IP/port. +### Send & receive (Proxy mode) using mump2p-cli ---- +If you haven’t already installed `mump2p`, see the [**Getting Started with mump2p-cli**](./01-getting-started-cli.md) chapter. -## 4. Example Docker Compose Setup +**Subscribe:** -### **Proxy + P2P Mode** +```sh +./mump2p subscribe --topic=demo --service-url=http://localhost:8081 +``` -```yaml -version: "3.8" +**Publish (in a new terminal):** -services: - gateway: - image: optimum-gateway:latest - environment: - - OPTIMUM_THRESHOLD=0.7 - - OPTIMUM_SHARD_FACTOR=8 - - MESH_TARGET=12 - - NODE_DISCOVERY=true - ports: - - "8081:8081" # gRPC/WebSocket API - depends_on: - - node1 - - node2 +```sh +./mump2p publish --topic=demo --message="Hello via Proxy" --service-url=http://localhost:8081 +``` - node1: - image: optimum-p2p-node:latest - environment: - - NODE_ID=node1 - - MESH_TARGET=12 +You should see your subscriber print the message immediately. - node2: - image: optimum-p2p-node:latest - environment: - - NODE_ID=node2 - - MESH_TARGET=12 -Direct P2P Mode -yaml -Copy -Edit -version: "3.8" +### Use Proxy using REST API and WebSocket (optional) + +TODO:: + +```sh +curl -X POST https://xxx/api/publish \ + -H "Authorization: Bearer YOUR_JWT_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "client_id": "your-client-id", + "topic": "example-topic", + "message": "Hello, world!" +}' +``` + +```sh +curl -X POST https://xxx/api/subscribe \ + -H "Authorization: Bearer YOUR_JWT_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{ + "client_id": "unique-client-id", + "topic": "example-topic", + "threshold": 0.7 +}' +``` + +```sh +wscat -c "wss://xxx/api/ws?client_id=unique-client-id" \ + -H "Authorization: Bearer YOUR_JWT_TOKEN" +``` + +### Use Proxy using gRPC Steam + +TODO:: + +```go +// proxy_client.go +package main + +import ( + "context" + "fmt" + "log" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +func main() { + conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { log.Fatal(err) } + defer conn.Close() + + // TODO: replace with your generated gRPC client for proxy stream. + // Example: + // client := pb.NewProxyStreamClient(conn) + // stream, _ := client.Stream(context.Background()) + // stream.Send(&pb.Subscribe{Topic: "demo"}) + // for { msg, _ := stream.Recv(); fmt.Println("MSG", msg) } + + fmt.Println("Connected to proxy gRPC at localhost:50051 (implement client logic here).") + <-context.Background().Done() +} +``` + +## 4 Mode B — Direct OptimumP2P (Advanced / Low Latency) + +In this mode, clients connect `straight to node sidecar gRPC`. You’ll manage client-side reconnection, backoff, and which node to hit. + +### Create the docker-compose file + +Save as `./direct-p2p/docker-compose.yml`: + +```yaml services: - node1: - image: optimum-p2p-node:latest + p2pnode-1: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 + volumes: + - ../identity:/identity environment: - - NODE_ID=node1 - - MESH_TARGET=12 + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - NODE_MODE=optimum + - IDENTITY_DIR=/identity + - SIDECAR_PORT=33212 + - API_PORT=9090 + - OPTIMUM_PORT=7070 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 ports: - - "50051:50051" # gRPC API for direct clients - - node2: - image: optimum-p2p-node:latest + - "33221:33212" + - "9091:9090" + - "7071:7070" + networks: + testnet: + ipv4_address: 172.28.0.11 + + p2pnode-2: + image: 'getoptimum/p2pnode:latest' + platform: linux/amd64 environment: - - NODE_ID=node2 - - MESH_TARGET=12 -5. Starting the Network -bash -Copy -Edit -docker compose up -d -Check running containers: + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-2 + - NODE_MODE=optimum + - SIDECAR_PORT=33212 + - API_PORT=9090 + - OPTIMUM_PORT=7070 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.11/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} + ports: + - "33222:33212" + - "9092:9090" + - "7072:7070" + networks: + testnet: + ipv4_address: 172.28.0.12 + +networks: + testnet: + driver: bridge + ipam: + config: + - subnet: 172.28.0.0/16 +``` -bash -Copy -Edit +### Start and validate + +```sh +cd ~/optimum-local/direct-p2p +export BOOTSTRAP_PEER_ID= +docker compose up -d docker compose ps -Verify gateway health (Proxy mode): - -bash -Copy -Edit -curl http://localhost:8081/api/v1/health -6. Connecting a Client -You can connect via CLI or via gRPC client code. - -Using mump2p-cli -Proxy mode: -bash -Copy -Edit -./mump2p subscribe --topic=demo --proxy=http://localhost:8081 -./mump2p publish --topic=demo --message="Hello from Proxy mode" --proxy=http://localhost:8081 -Direct P2P mode: -bash -Copy -Edit -./mump2p subscribe --topic=demo --proxy=grpc://localhost:50051 -./mump2p publish --topic=demo --message="Hello from Direct P2P" --proxy=grpc://localhost:50051 -Using a gRPC Client (Go Example) -Proxy connection: -bash -Copy -Edit -go run proxy_client.go --subscribe --topic=demo --proxy=localhost:8081 -Direct node connection: -bash -Copy -Edit -go run p2p_client.go --subscribe --topic=demo --node=localhost:50051 -Notes: - -proxy_client.go → Connects to Optimum Gateway. - -p2p_client.go → Connects directly to a P2P node. - -7. Configuration Parameters -Parameter Description -OPTIMUM_THRESHOLD Decoding threshold (0.0–1.0). -OPTIMUM_SHARD_FACTOR Number of shards generated per message. -MESH_TARGET Target number of peers per topic mesh. -NODE_DISCOVERY Whether the gateway auto-discovers P2P nodes. - -Edit in docker-compose.yml before starting. - -8. Stopping the Network -bash -Copy -Edit -docker compose down -Remove volumes and images: +curl -s http://localhost:9091/api/v1/health +curl -s http://localhost:9092/api/v1/health +``` + +### Minimal Direct P2P sidecar gRPC stream client + +TODO:: + +```go +// p2p_client.go (skeleton) +package main + +import ( + "context" + "fmt" + "log" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/keepalive" +) + +func main() { + conn, err := grpc.Dial( + "localhost:33221", + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 2*time.Minute, Timeout: 20*time.Second, + }), + ) + if err != nil { log.Fatal(err) } + defer conn.Close() + + // TODO: replace with your generated client and stream. + // client := pb.NewCommandStreamClient(conn) + // stream, _ := client.ListenCommands(context.Background()) + // stream.Send(&pb.Request{Command: SubscribeCmd, Topic: "demo"}) + // for { resp, _ := stream.Recv(); fmt.Printf("MSG: %s\n", resp.GetData()) } + + fmt.Println("Connected to node sidecar at localhost:33221 (implement client logic here).") + <-context.Background().Done() +} +``` + +See the example code in our GitHub repository(TODO::). For all available configuration variables, observability and validations check the [Parameters Section](./03-parameters.md). + +## Troubleshooting + +### No peers / mesh empty + +* Check `BOOTSTRAP_PEERS` uses a reachable address of a running node. +* If using static IPs, confirm the `testnet` subnet and container IPs match the compose file. +* Look for `bootstrap` lines in docker compose logs `p2pnode`. + +### “connection refused” from client -bash -Copy -Edit -docker compose down -v --rmi all -9. Next Step -Once your network is running, continue to 04 — Understanding Key Parameters to tune thresholds, shard counts, and mesh size for your workload. +* Ensure you’re pointing to the host-mapped ports (e.g., 33221, 8081). +* Run docker compose ps and confirm port bindings. +* Firewalls: allow inbound localhost traffic. -pgsql -Copy -Edit +### Proxy can’t reach nodes ---- +* Inside the proxy container, resolve and ping node hosts: -This keeps both **Proxy + P2P** and **Direct P2P** side-by-side, -and explicitly shows **CLI** and **Go gRPC client** commands for each mode. +```sh +docker compose exec proxy sh -lc 'nc -zv p2pnode-1 33212' +``` + +* Make sure `P2P_NODES` hostnames match the `service names` in compose. + +### Port conflicts + +* Change host mappings in ports: (e.g., 33223:33212, 9093:9090, 7073:7070). + +### Protocol mismatch + +* All nodes in a mesh must use the same NODE_MODE (optimum or gossipsub). + +### Stop and Clean + +Stop: + +```sh +docker compose down +``` + +Full reset (containers, volumes, images created by this compose file): + +```sh +docker compose down -v --rmi local +``` diff --git a/docs/guides/03-parameters.md b/docs/guides/03-parameters.md index 184f19d..e5af9e7 100644 --- a/docs/guides/03-parameters.md +++ b/docs/guides/03-parameters.md @@ -1,93 +1,144 @@ -# Understanding Key Parameters +# Understanding Key Parameters in OptimumP2P +OptimumP2P nodes can operate in **two distinct protocol modes**, configured via: -OptimumP2P supports **two gossip protocols**: +```sh +NODE_MODE=optimum # RLNC-enhanced gossip +NODE_MODE=gossipsub # Standard libp2p gossip +``` -1. **GossipSub** — the standard libp2p pub/sub protocol. -2. **OptimumP2P (RLNC)** — an enhanced gossip protocol using Random Linear Network Coding for faster, more resilient message propagation. +Each mode has its own parameter set, with some shared configurations. -Both protocols share similar topology concepts but differ in message encoding, redundancy, and forwarding logic. -This chapter explains: +We support **two protocol modes** to let developers and researchers compare **performance, reliability, and bandwidth trade-offs** in real-world scenarios — without changing the rest of their infrastructure. -- Core gossip concepts. -- All tunable parameters for **both** protocols. -- How these parameters behave in **Proxy + P2P** vs **Direct P2P** modes. -- Pre-built tuning profiles. -- How to validate and experiment with changes. +## OptimumP2P (RLNC) Mode — `NODE_MODE=optimum` ---- +OptimumP2P extends the gossip protocol with **Random Linear Network Coding**: -## 1. Core Concepts +* Messages are split into **shards** +* Shards can be forwarded early once a threshold is reached +* Improves delivery resilience in lossy or high-latency environments -| Term | Description | -|------------|-------------| -| **Mesh** | The set of peers directly connected for a topic. | -| **Gossip** | Metadata exchange (who has what) with non-mesh peers. | -| **Fanout** | Temporary publishing links for unsubscribed topics. | -| **Degree** | Target number of mesh peers per topic. | -| **Shard** | A coded fragment of a message (OptimumP2P only). | -| **Threshold** | Fraction of shards required to reconstruct a message (OptimumP2P only). | +Example Docker service: ---- - -## 2. Side-by-Side Parameters - -### 2.1 Topology Parameters - -| Setting | GossipSub Env Var | OptimumP2P Env Var | Default (GSub) | Default (Optimum) | Purpose | -|---------|------------------|--------------------|----------------|-------------------|---------| -| Mesh Target | `GOSSIPSUB_MESH_TARGET` | `OPTIMUM_MESH_TARGET` | 6 | 6 | Target peer connections per topic. | -| Mesh Min | `GOSSIPSUB_MESH_MIN` | `OPTIMUM_MESH_MIN` | 4 | 3 | Min peers before adding new ones. | -| Mesh Max | `GOSSIPSUB_MESH_MAX` | `OPTIMUM_MESH_MAX` | 12 | 12 | Max peers before pruning. | - ---- - -### 2.2 Message Size & Ports +```yaml +p2pnode-1: + image: 'getoptimum/p2pnode:latest' + environment: + - NODE_MODE=optimum + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=3 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} +``` + +### Parameters + +| Parameter | Default | Purpose | +| ---------------------- | ------------- | ---------------------------------------------- | +| `OPTIMUM_PORT ` | 7070 | TCP port used for RLNC gossip. | +| `OPTIMUM_MAX_MSG_SIZE` | 1048576 (1MB) | Max allowed message size (full payload). | +| `OPTIMUM_MESH_TARGET` | 6 | Desired peers in mesh. | +| `OPTIMUM_MESH_MIN` | 3 | Minimum peers before adding more. | +| `OPTIMUM_MESH_MAX` | 12 | Max peers before pruning. | +| `OPTIMUM_SHARD_FACTOR` | 4 | Number of shards per message. | +| `OPTIMUM_SHARD_MULT` | 1.5 | Redundancy multiplier (extra shards). | +| `OPTIMUM_THRESHOLD` | 0.75 | Fraction of shards required to forward/decode. | +| `BOOTSTRAP_PEERS` | (none) | List of peer multiaddrs to connect at startup. | + + +## GossipSub Mode — `NODE_MODE=gossipsub` + +GossipSub is the **standard libp2p pub/sub** protocol: + +* Maintains topic-specific peer meshes +* Exchanges message availability metadata with non-mesh peers +* Widely used for blockchain gossip + +Example Docker service: -| Setting | GossipSub Env Var | OptimumP2P Env Var | Default | Purpose | -|---------|------------------|--------------------|---------|---------| -| Protocol Port | `GOSSIPSUB_PORT` | `OPTIMUM_PORT` | 6060 (GSub) / 7070 (Optimum) | P2P gossip communication port. | -| Max Message Size (bytes) | `GOSSIPSUB_MAX_MSG_SIZE` | `OPTIMUM_MAX_MSG_SIZE` | 1,048,576 (1MB) | Limit to prevent excessive memory usage. | +```yaml +p2pnode-1: + image: 'getoptimum/p2pnode:latest' + environment: + - NODE_MODE=gossipsub + - LOG_LEVEL=debug + - CLUSTER_ID=p2pnode-1 + - GOSSIPSUB_PORT=6060 + - GOSSIPSUB_MAX_MSG_SIZE=1048576 + - GOSSIPSUB_MESH_TARGET=6 + - GOSSIPSUB_MESH_MIN=4 + - GOSSIPSUB_MESH_MAX=12 + - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/6060/p2p/${BOOTSTRAP_PEER_ID} +``` ---- -### 2.3 RLNC-Specific Parameters (OptimumP2P Only) +### Parameters -| Setting | Env Var | Default | Purpose | -|---------|---------|---------|---------| -| Shard Factor | `OPTIMUM_SHARD_FACTOR` | 4 | Number of coded shards per message. | -| Publisher Shard Multiplier | `OPTIMUM_SHARD_MULT` | 1.5 | Multiplies shard count when publishing for redundancy. | -| Forward Threshold | `OPTIMUM_THRESHOLD` | 0.75 | Fraction of shards needed before forwarding. | +| Parameter | Default | Purpose | +| ------------------------ | ------------- | ---------------------------------------------- | +| `GOSSIPSUB_PORT` | 6060 | TCP port for gossip pub/sub. | +| `GOSSIPSUB_MAX_MSG_SIZE` | 1048576 (1MB) | Max allowed message size. | +| `GOSSIPSUB_MESH_TARGET` | 6 | Desired peers in mesh. | +| `GOSSIPSUB_MESH_MIN` | 4 | Minimum peers before adding more. | +| `GOSSIPSUB_MESH_MAX` | 12 | Max peers before pruning. | +| `BOOTSTRAP_PEERS` | (none) | List of peer multiaddrs to connect at startup. | ---- -### 2.4 Timing (GossipSub Only) +You can refer to the [GossipSub parameter specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md#parameters) for a detailed explanation of the standard pub/sub settings. -| Setting | Env Var | Default | Purpose | -|---------|---------|---------|---------| -| Heartbeat Interval | *(config file only)* | 1s | How often mesh maintenance runs. | -| Fanout TTL | *(config file only)* | 60s | Lifetime of fanout state. | -| Seen TTL | *(config file only)* | 120s | Duration to remember seen messages. | ---- +### Shared Parameters (Both `optimum` and `gossipsub` mode) -## 3. Parameter Impact by Deployment Mode +| Parameter | Default | Purpose | +| -------------- | --------- | -------------------------------------------------- | +| `LOG_LEVEL` | debug | Log verbosity (debug, info, warn, error). | +| `CLUSTER_ID` | (none) | Logical group name for metrics and identification. | +| `SIDECAR_PORT` | 33212 | gRPC sidecar port for proxy ↔ P2P communication. | +| `API_PORT` | 9090 | HTTP API port for node management. | +| `IDENTITY_DIR` | /identity | Directory containing node’s private key. | -| Parameter | Proxy + P2P | Direct P2P | -|-----------|-------------|------------| -| Mesh Target | Proxy benefits from denser mesh for faster shard aggregation; minor client effect. | Client performance depends entirely on connected node’s mesh density. | -| Shard Factor | Higher improves redundancy for proxy distribution; affects uplink load to proxy. | Client receives all shards directly; high values may saturate slow links. | -| Threshold | Proxy can forward early once threshold met; low thresholds speed delivery. | Client must wait to receive threshold shards; low values reduce latency but risk decode failures. | -| Max Message Size | Large values okay if proxy does decoding; in direct mode may strain client memory. | Client must handle full payload; keep conservative if on limited hardware. | +## OptimumProxy Configuration Parameters ---- +When using **Proxy + P2P deployment**, the proxy service connects clients to P2P nodes and optionally enforces authentication. -## 4. Tuning Profiles +Example Docker service: -### Low Latency ```yaml -# OptimumP2P -OPTIMUM_SHARD_FACTOR=4 -OPTIMUM_SHARD_MULT=1.2 -OPTIMUM_THRESHOLD=0.6 -OPTIMUM_MESH_TARGET=6 +proxy-1: + image: 'getoptimum/proxy:latest' + environment: + - PROXY_HTTP_PORT=:8080 + - PROXY_GRPC_PORT=:50051 + - CLUSTER_ID=proxy-1 + - ENABLE_AUTH=false + - LOG_LEVEL=debug + - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212 +``` + +| Parameter | Default | Purpose | +| --------------------------------- | ------- | ---------------------------------------------------------- | +| `PROXY_HTTP_PORT` | :8080 | HTTP API port for clients. | +| `PROXY_GRPC_PORT` | :50051 | gRPC API port for clients. | +| `ENABLE_AUTH` | false | Enable Auth0 authentication. | +| `AUTH0_DOMAIN` / `AUTH0_AUDIENCE` | (none) | Auth0 settings (required if `ENABLE_AUTH`=true). | +| `P2P_NODES` | (none) | Comma-separated list of host:port for sidecar connections. | +| `SUBSCRIBER_THRESHOLD` | 0.1 | % of connected subscribers needed to forward a message. | + +## Parameter Impact in Deployment Modes + + +| Parameter | Proxy + P2P | Direct P2P | +| ------------------------------------- | ----------- | ---------- | +| Mesh Size (`*_MESH_TARGET`) | explainer | explainer | +| Shard Factor (`OPTIMUM_SHARD_FACTOR)` | explainer | explainer | +| Threshold (`OPTIMUM_THRESHOLD`) | explainer | explainer | +| Max Message Size (`*_MAX_MSG_SIZE`) | explainer | explainer | +| Bootstrap Peers (`BOOTSTRAP_PEERS`) | explainer | explainer | diff --git a/docs/guides/04-experiments.md b/docs/guides/04-experiments.md index 2ba6785..668200d 100644 --- a/docs/guides/04-experiments.md +++ b/docs/guides/04-experiments.md @@ -1,171 +1,126 @@ # Common Experiments -This chapter gives you practical test scenarios to **measure and validate** OptimumP2P’s performance. -You’ll explore latency, reliability, and throughput under different network conditions — both for **GossipSub** and **OptimumP2P (RLNC)**. +Once your OptimumP2P network is running (see [Parameters](./03-parameters.md)), you can try different experiments to understand **performance, reliability, and scaling behavior**. -These experiments assume you have: +> **Before You Begin:** +> Make sure you’ve read: +> +> * [Node Modes & Config Parameters](./03-parameters.md) — to understand what each env var controls. +> * [mump2p CLI](./01-getting-started-cli.md) and [gRPC Client Setup](./02-getting-started-docker.md) — for sending and receiving test messages. -- A **running network** (Proxy + P2P or Direct P2P). -- **Client access** via gRPC, REST, or CLI. -- The ability to **change parameters** (env vars or config files). -- Basic **monitoring tools** (logs, metrics, Grafana, or Prometheus). +Each experiment below lists the **goal**, a quick **how-to**, and **what to observe**. ---- +You can run them using: -## 1. Experiment: Shard Factor Sweep +* **mump2p CLI** (see [CLI Guide](./01-getting-started-cli.md)) +* **gRPC client** (with `MessageTraceGossipSub` or `MessageTraceOptimumP2P` for protocol metrics) -**Goal:** See how coded shard count affects delivery reliability and CPU usage. -**Setup:** -1. Start your network with these shard factor values: - - `OPTIMUM_SHARD_FACTOR=2` - - `OPTIMUM_SHARD_FACTOR=4` - - `OPTIMUM_SHARD_FACTOR=8` - - `OPTIMUM_SHARD_FACTOR=16` -2. Keep all other parameters identical. -**Procedure:** -- Publish the same 1MB message to the same topic. -- Introduce artificial packet loss (e.g., `tc netem loss 20%`). -- Measure: - - Time to first full decode. - - Percentage of peers that successfully decoded. - - CPU load on sender and receiver. +## 1. Shard Factor Sweep -**Expected Result:** -- **Low values (2–4)**: Low CPU, but reduced reliability under loss. -- **High values (8–16)**: High reliability, but more CPU and bandwidth. +**Goal:** See how the number of coded shards affects reliability and CPU usage in `NODE_MODE=optimum`. ---- +**How:** -## 2. Experiment: Forward Threshold Tuning +* Vary `OPTIMUM_SHARD_FACTOR` (e.g., 2, 4, 8, 16). +* Keep all other parameters the same. +* Publish the same message in each run. -**Goal:** Measure latency vs reliability when forwarding coded shards early. +**Observe:** -**Setup:** -- Keep `OPTIMUM_SHARD_FACTOR=8`. -- Test with: - - `OPTIMUM_THRESHOLD=0.5` - - `OPTIMUM_THRESHOLD=0.75` - - `OPTIMUM_THRESHOLD=0.9` +* Delivery success rate. +* Decode latency. +* CPU load. -**Procedure:** -- Publish bursts of small messages (50–100KB). -- Measure: - - End-to-end latency. - - % of decodes completed at each peer. - - Total shard traffic on the network. -**Expected Result:** -- **Low threshold (0.5)**: Lower latency, slightly more failed decodes under loss. -- **High threshold (0.9)**: Slower, but highly reliable. +## 2. Forward Threshold Tuning ---- +**Goal:** Measure latency vs reliability trade-off when forwarding coded shards early. -## 3. Experiment: Mesh Density Impact +**How:** -**Goal:** Compare sparse vs dense peer connections. +* Fix `OPTIMUM_SHARD_FACTOR=8`. +* Test `OPTIMUM_THRESHOLD` at 0.5, 0.75, 0.9. +* Publish bursts of small messages. -**Setup:** -- Keep shard factor and threshold constant. -- Change: - - Sparse mesh: `*_MESH_TARGET=4` - - Dense mesh: `*_MESH_TARGET=12` +**Observe:** -**Procedure:** -- Publish 100 messages to the topic. -- Log: - - Average peer-to-peer hop count. - - Message duplication count. - - Latency from first to last peer. +* End-to-end latency. +* Percentage of successful decodes. -**Expected Result:** -- Sparse mesh reduces bandwidth, increases hops. -- Dense mesh improves redundancy, may increase duplicates. ---- +## 3. Mesh Density Impact -## 4. Experiment: GossipSub vs OptimumP2P +**Goal:** Compare performance with sparse vs dense peer meshes. -**Goal:** See if RLNC improves your specific network scenario. +**How:** -**Setup:** -- Run two identical networks: - - **GossipSub** — `NODE_MODE=gossipsub`, default mesh params. - - **OptimumP2P** — `NODE_MODE=optimum`, same mesh params, RLNC enabled. +* Change `*_MESH_TARGET` (e.g., 4 vs 12). +* Run the same publish/subscribe test. -**Procedure:** -- Publish the same 100 messages to both networks. -- Measure: - - First-receiver latency. - - All-receivers latency. - - Total bytes transmitted. - - Reliability under induced packet loss. +**Observe:** -**Expected Result:** -- OptimumP2P should win on **lossy networks** due to redundancy. -- On perfect links, GossipSub may match latency but use less CPU. +* Average hop count. +* Delivery latency. +* Duplicate message rate. ---- -## 5. Experiment: Proxy + P2P vs Direct P2P +## 4. GossipSub vs OptimumP2P -**Goal:** Understand whether a proxy speeds up or slows down delivery in your use case. +**Goal:** Compare standard libp2p gossip to RLNC-enhanced gossip in the same environment. -**Setup:** -- Same number of P2P nodes in both deployments. -- One with `gateway` (proxy) in front of clients. -- One where clients connect directly to P2P nodes. - -**Procedure:** -- Subscribe 10 clients to the same topic. -- Publish 50 messages from different P2P nodes. -- Measure: - - Average time from publish to all clients. - - Total client bandwidth usage. - - Proxy CPU load (if using gateway). +**How:** -**Expected Result:** -- Proxy improves aggregation and reduces uplink load from publisher. -- Direct P2P may reduce single-hop latency but increase total traffic. +* Run one cluster with `NODE_MODE=gossipsub`. +* Run another with `NODE_MODE=optimum`. +* Publish the same workload. ---- +**Observe:** -## 6. Experiment: Load Test +* First-receiver latency. +* All-receivers latency. +* Bandwidth usage. +* Loss resilience. -**Goal:** Find the throughput limit before degradation. -**Setup:** -- Use a load generator (e.g., `mump2p-cli` in a loop or a custom gRPC publisher). -- Keep parameters constant. +## 5. Proxy + P2P vs Direct P2P -**Procedure:** -- Gradually increase message rate from 10 msg/s to 1,000 msg/s. -- Watch: - - Message loss rate. - - Latency growth. - - Node CPU/memory. +**Goal:** See if using OptimumProxy improves delivery for your setup. -**Expected Result:** -- At some rate, latency spikes and reliability drops. -- Use results to size your cluster for production. +**How:** ---- +* Deploy once with Proxy in front of P2P nodes. +* Deploy once with clients connecting directly to nodes. +* Run the same test in both setups. -## 7. Monitoring Checklist for All Experiments +**Observe:** -During each test: -- **Check logs** for errors (`grep error` or `grep shard`). -- **Check metrics**: - - `peer_count` - - `message_delivered_total` - - `shard_decoded_total` - - `delivery_latency_seconds` -- **Check system health**: - - CPU / Memory via `docker stats` - - Network usage via `iftop` or `nload` +* Client receive time. +* Bandwidth usage. +* Proxy CPU load. ---- -## Next Step -Move on to [06 — Monitoring & Debugging](06-monitoring-debugging.md) to learn how to interpret metrics and fix issues uncovered during testing. +## 6. Load Test + +**Goal:** Find the throughput limit of your network. + +**How:** + +* Gradually increase message rate (e.g., 10 → 1,000 msg/s). +* Use multiple publishers if needed. + +**Observe:** + +* Latency growth. +* Message loss rate. +* Node CPU/memory usage. + + +> **Tip:** Enable protocol traces in the gRPC client to get hop-by-hop delivery info: +> +> * `MessageTraceGossipSub` for GossipSub mode. +> * `MessageTraceOptimumP2P` for OptimumP2P mode. + +TODO:: github ref, and cite the gRPC client part. +For metrics collection guidance, see [github sample implementations](github.com). diff --git a/docs/guides/05-cleanup-reset.md b/docs/guides/05-cleanup-reset.md deleted file mode 100644 index 9e0318b..0000000 --- a/docs/guides/05-cleanup-reset.md +++ /dev/null @@ -1,188 +0,0 @@ -# Cleanup & Reset and Important Commands - -## Overview - -After running tests, experiments, or demos with OptimumP2P, you’ll often want to clean up your environment to: - -- Free up system resources -- Avoid stale peers, topics, and bootstrap states -- Start fresh for new tests -- Reset configuration without leftover data - -This page covers: - -1. **Stopping Containers** -2. **Removing Local Data** -3. **Resetting Identity & State** -4. **Cleaning up Networks** -5. **Preparing for a Fresh Deployment** - ---- - -## 1. Stopping Containers - -### Stop All Running Containers -If you’re running with Docker Compose: -```bash -docker compose down -If you’re running containers individually: - -bash -Copy -Edit -docker stop $(docker ps -q --filter "ancestor=getoptimum/p2pnode:latest") -2. Removing Local Data -OptimumP2P stores persistent state such as: - -Identity keys (libp2p peer ID) - -Topic subscription cache - -RLNC shard cache - -Message history - -Prometheus WAL (if used) - -If you mounted a local directory (e.g. /tmp/p2pnode-data): - -bash -Copy -Edit -rm -rf /tmp/p2pnode-data -If you used Docker volumes: - -bash -Copy -Edit -docker volume ls -docker volume rm -3. Resetting Identity & State -Each node’s identity determines its PeerID. -If you want a node to appear as a brand new peer in the network, delete its identity directory. - -Example: - -bash -Copy -Edit -rm -rf ~/.optimum/identity -Or if using Docker Compose: - -yaml -Copy -Edit -services: - p2pnode: - volumes: - - ./identity:/identity -To reset: - -bash -Copy -Edit -rm -rf ./identity/* -4. Cleaning up Networks -Docker may keep custom bridge networks around, which can cause conflicts when re-deploying. - -List networks: - -bash -Copy -Edit -docker network ls -Remove unused networks: - -bash -Copy -Edit -docker network prune -Warning: This removes all unused networks, not just OptimumP2P ones. - -5. Preparing for a Fresh Deployment -When restarting a clean environment: - -Remove all containers - -bash -Copy -Edit -docker compose down --volumes --remove-orphans -Delete local data directories - -bash -Copy -Edit -rm -rf ./data -Re-generate configuration - -Update docker-compose.yml if needed - -Change CLUSTER_ID to avoid collision with old peers - -Reset bootstrap peers if you want a new network - -Restart deployment - -bash -Copy -Edit -docker compose up -d -6. Special Cases -Resetting Only the Gateway -If you want to keep the P2P network intact but reset the gateway: - -bash -Copy -Edit -docker compose stop gateway -docker compose rm -f gateway -rm -rf ./gateway-data -docker compose up -d gateway -Resetting Only a Single Node -bash -Copy -Edit -docker stop p2pnode-2 -docker rm p2pnode-2 -rm -rf ./p2pnode-2-data -docker compose up -d p2pnode-2 -7. Verification After Reset -After restarting: - -Check health: - -bash -Copy -Edit -curl http://localhost:9090/health -List peers: - -bash -Copy -Edit -curl http://localhost:9090/peers -List topics: - -bash -Copy -Edit -curl http://localhost:9090/topics -A fresh node should: - -Have 0 topics initially - -Connect to only configured bootstrap peers - -Have a new PeerID if identity was reset - -Quick Reset Command (nuclear option) -If you want to remove everything related to OptimumP2P from Docker in one go: - -bash -Copy -Edit -docker compose down --volumes --remove-orphans && \ -docker system prune -af --volumes && \ -rm -rf ./data ./identity ./gateway-data -⚠️ Warning: This will delete all Docker images, containers, volumes, and networks not currently in use. \ No newline at end of file diff --git a/docs/guides/05-faq-glossary.md b/docs/guides/05-faq-glossary.md new file mode 100644 index 0000000..9482154 --- /dev/null +++ b/docs/guides/05-faq-glossary.md @@ -0,0 +1,12 @@ +# FAQ & Glossary + +This section gives you: + +* **Quick answers** to common developer questions about OptimumP2P +* A **glossary** of important terms so you can follow discussions and logs without confusion + +--- + +## Frequently Asked Questions (FAQ) + +TODO:: diff --git a/docs/guides/06-faq-glossary.md b/docs/guides/06-faq-glossary.md deleted file mode 100644 index ddf3d5f..0000000 --- a/docs/guides/06-faq-glossary.md +++ /dev/null @@ -1,114 +0,0 @@ -# FAQ & Glossary - -This section gives you: -- **Quick answers** to common developer questions about OptimumP2P -- A **glossary** of important terms so you can follow discussions and logs without confusion - ---- - -## Frequently Asked Questions (FAQ) - -### 1. What’s the difference between **P2P-only** and **Proxy + P2P**? -- **P2P-only** — Clients connect directly to the P2P network over gRPC. -- **Proxy + P2P** — Clients connect to a gateway proxy, which manages subscriptions and publishes to the P2P mesh. - *Use Proxy + P2P if:* - - You want simplified client integration (especially from web or REST-based clients) - - You have multiple P2P nodes and want centralized control - ---- - -### 2. Do OptimumP2P and GossipSub nodes talk to each other? -No — each runs its own protocol and forms a separate mesh. -If you want both in the same experiment, you’ll need **separate bootstrap nodes**. - ---- - -### 3. Can I change parameters at runtime? -Most parameters are set at startup. For dynamic changes: -- Use the HTTP API where supported (e.g., topic subscriptions) -- Restart the node for mesh/shard/threshold changes - ---- - -### 4. Why am I seeing duplicate messages? -Possible causes: -- Multiple subscriptions to the same topic from one client -- Threshold too low, causing early forward from multiple peers -- Application logic not deduplicating payloads - ---- - -### 5. How do I test with a real-world loss scenario? -Use Linux traffic control (`tc`) or Docker network emulation: -```bash -tc qdisc add dev eth0 root netem loss 10% -Then observe recovery via RLNC redundancy. - -6. What ports should I expose? -Typical defaults: - -OptimumP2P protocol: 7070 - -GossipSub protocol: 6060 - -gRPC Sidecar API: 33212 - -HTTP API: 9090 -Expose only what your topology requires. - -7. Can I run OptimumP2P on the same machine as my app? -Yes. Use: - -localhost for API calls - -Docker bridge or host networking to connect to other peers - -8. What happens if the bootstrap node goes down? -Existing peers remain connected, but: - -New peers can’t join until another bootstrap is available - -It’s recommended to have multiple bootstrap nodes for redundancy - -9. How do I monitor shard decoding? -Check logs for: - -bash -Copy -Edit -grep -E "(shard|decode|threshold)" node.log -Or use /metrics Prometheus endpoint for shard counters. - -10. Is there a message size limit? -Yes — controlled by: - -OPTIMUM_MAX_MSG_SIZE for OptimumP2P - -GOSSIPSUB_MAX_MSG_SIZE for GossipSub -Default: 1MB per message. - -Glossary -Term Definition -Topic A named channel for publishing/subscribing messages -Shard A coded fragment of a message in RLNC -Threshold Minimum fraction of shards needed to decode a message -Mesh Subset of peers directly connected for a given topic -Gossip Metadata exchange about available messages between non-mesh peers -Bootstrap Node A known peer used to join the network -PeerID Unique identifier for a node in the P2P network -RLNC Random Linear Network Coding — coding method for redundancy & efficiency -Gateway A proxy between clients and P2P nodes, often used for REST or centralized control -Fanout Temporary peer set for publishing when not subscribed to a topic -GRAFT / PRUNE GossipSub control messages to add/remove peers from a mesh -IHAVE / IWANT GossipSub messages for announcing/requesting message IDs - -See Also -04 — Understanding Key Parameters - -06 — Monitoring & Debugging - -09 — Next Steps - -yaml -Copy -Edit diff --git a/docs/guides/06-next-steps.md b/docs/guides/06-next-steps.md new file mode 100644 index 0000000..be8f268 --- /dev/null +++ b/docs/guides/06-next-steps.md @@ -0,0 +1,66 @@ +# Next Steps + +You’ve installed OptimumP2P, sent your first messages, tuned key parameters, and explored monitoring. +Now it’s time to take your deployment further — integrating it into your projects, scaling for real-world scenarios, and experimenting with advanced setups. + + +## 1. Integrate with Your Application + +Depending on your architecture, you can connect your app to OptimumP2P in one of two main ways: + +* **Direct P2P Client** + * Use gRPC to connect directly to P2P nodes. + * Best for low-latency, high-throughput scenarios. + * Requires your app to manage peer discovery and reconnections. + +* **Proxy + P2P** + * Connect via REST or gRPC to a proxy that bridges to the P2P mesh. + * Best for web clients, services without native P2P support, or multi-node orchestration. + * Lets you centralize authentication, logging, and metrics. + +See: [Client Integration Guide](./02-getting-started-docker.md) + + +## 2. Experiment with Advanced Configurations + +* **RLNC Tuning** + * Increase `OPTIMUM_SHARD_FACTOR` for higher fault tolerance. + * Lower `OPTIMUM_THRESHOLD` for faster forwarding. + * Observe trade-offs between redundancy, latency, and bandwidth. + +* **Mesh Topology** + * Test sparse (`MESH_TARGET=4`) vs dense (`MESH_TARGET=10`) topologies. + * Use multiple bootstrap nodes to reduce single points of failure. + +* **Protocol Comparisons** + * Run identical workloads on OptimumP2P and GossipSub. + * Measure latency, message loss recovery, and CPU/memory usage. + + +## 3. Deploy in a Distributed Environment + +* Test across multiple regions for realistic latency. +* Use cloud instances (AWS, GCP, Azure) with Docker Compose or Kubernetes. +* Secure nodes using: + * Private bootstrap peers + * TLS for gRPC + * Firewall rules for P2P ports + +## 4. Contribute to OptimumP2P + +* Submit improvements or bug reports. +* Share performance results from different configurations. +* Contribute new client libraries or example integrations. + + +## 5. Plan for Upcoming Features + +Watch for: + +* **DeRAM Integration** — Optimized memory handling for large datasets. +* **Blockchain-Specific Integration** — Direct integration with Ethereum, Solana, and others. +* many more.. + + +Stay updated by following announcements in the OptimumP2P developer community. + diff --git a/docs/guides/07-next-steps.md b/docs/guides/07-next-steps.md deleted file mode 100644 index 00452fc..0000000 --- a/docs/guides/07-next-steps.md +++ /dev/null @@ -1,104 +0,0 @@ -# Next Steps - -You’ve installed OptimumP2P, sent your first messages, tuned key parameters, and explored monitoring. -Now it’s time to take your deployment further — integrating it into your projects, scaling for real-world scenarios, and experimenting with advanced setups. - ---- - -## 1. Integrate with Your Application - -Depending on your architecture, you can connect your app to OptimumP2P in one of two main ways: - -- **Direct P2P Client** - - Use gRPC to connect directly to P2P nodes. - - Best for low-latency, high-throughput scenarios. - - Requires your app to manage peer discovery and reconnections. - -- **Gateway (Proxy + P2P)** - - Connect via REST or gRPC to a gateway that bridges to the P2P mesh. - - Best for web clients, services without native P2P support, or multi-node orchestration. - - Lets you centralize authentication, logging, and metrics. - -📚 See: [Client Integration Guide](../clients/) - ---- - -## 2. Experiment with Advanced Configurations - -- **RLNC Tuning** - - Increase `OPTIMUM_SHARD_FACTOR` for higher fault tolerance. - - Lower `OPTIMUM_THRESHOLD` for faster forwarding. - - Observe trade-offs between redundancy, latency, and bandwidth. - -- **Mesh Topology** - - Test sparse (`MESH_TARGET=4`) vs dense (`MESH_TARGET=10`) topologies. - - Use multiple bootstrap nodes to reduce single points of failure. - -- **Protocol Comparisons** - - Run identical workloads on OptimumP2P and GossipSub. - - Measure latency, message loss recovery, and CPU/memory usage. - ---- - -## 3. Add Metrics and Dashboards - -- Enable the `/metrics` endpoint. -- Integrate with **Prometheus** for collection. -- Build **Grafana dashboards** to visualize: - - Peer counts - - Shard forwarding/decoding - - Message throughput - - Latency distributions - -📚 See: [06 — Monitoring & Debugging](06-monitoring-debugging.md) - ---- - -## 4. Deploy in a Distributed Environment - -- Test across multiple regions for realistic latency. -- Use cloud instances (AWS, GCP, Azure) with Docker Compose or Kubernetes. -- Secure nodes using: - - Private bootstrap peers - - TLS for gRPC - - Firewall rules for P2P ports - ---- - -## 5. Integrate into Hackathon or Production Workflows - -- For **hackathons**: - - Prepare a minimal setup with clear CLI commands for teammates. - - Focus on quick feedback loops and easy parameter changes. - -- For **production**: - - Automate deployment with Terraform or Ansible. - - Implement rolling updates for zero downtime. - - Add continuous monitoring and alerting. - ---- - -## 6. Contribute to OptimumP2P - -- Submit improvements or bug reports. -- Share performance results from different configurations. -- Contribute new client libraries or example integrations. - ---- - -## 7. Plan for Upcoming Features - -Watch for: -- **DeRAM Integration** — Optimized memory handling for large datasets. -- **Blockchain-Specific Modules** — Direct integration with Ethereum, Solana, and others. -- **Advanced Tuning Tools** — Real-time mesh and shard adjustments. - -📬 Stay updated by following announcements in the OptimumP2P developer community. - ---- - -## See Also - -- [04 — Understanding Key Parameters](04-parameters.md) -- [05 — Common Experiments](05-experiments.md) -- [08 — FAQ & Glossary](08-faq-glossary.md) diff --git a/docs/guides/overview.md b/docs/guides/overview.md index 762512e..333692a 100644 --- a/docs/guides/overview.md +++ b/docs/guides/overview.md @@ -47,9 +47,8 @@ This guide is organized into self-contained chapters: 2. **[Getting Started with Docker](02-getting-started-docker.md)** — Run your own local proxy and P2P nodes for full control. 3. **[Understanding Key Parameters](03-parameters.md)** — Tune thresholds, shards, and mesh settings for your workload. 4. **[Common Experiments](04-experiments.md)** — Test performance and reliability under different conditions. -5. **[Cleanup & Reset](05-cleanup-reset.md)** — Safely remove or reset your test setup. -6. **[FAQ & Glossary](06-faq-glossary.md)** — Quick answers and key term definitions. -7. **[Next Steps](07-next-steps.md)** — Ideas for integration and advanced usage. +5. **[FAQ & Glossary](05-faq-glossary.md)** — Quick answers and key term definitions. +6. **[Next Steps](06-next-steps.md)** — Ideas for integration and advanced usage. ## Who This Guide Is For diff --git a/docs/hackathon/clients/grpc-examples.md b/docs/hackathon/clients/grpc-examples.md deleted file mode 100644 index 6151df1..0000000 --- a/docs/hackathon/clients/grpc-examples.md +++ /dev/null @@ -1,717 +0,0 @@ -# gRPC Client Examples - -This guide demonstrates how to build and use gRPC clients for direct integration with OptimumP2P networks, covering both P2P-only and Proxy deployment scenarios. - -## Overview - -OptimumP2P provides two gRPC client integration patterns: - -1. **P2P Direct Client** - Connect directly to P2P node sidecar (for P2P-only deployments) -2. **Proxy Client** - Connect through the Proxy service (for Proxy + P2P deployments) - -## P2P Direct Client - -The P2P direct client connects to individual P2P node sidecar gRPC endpoints for direct protocol interaction. - -### Creating the P2P Client - -The P2P client code is provided below. Create the following directory structure: - -``` -grpc_p2p_client/ -├── p2p_client.go # Main client implementation -├── proto/ # Protocol buffer definitions -├── grpc/ # Generated gRPC code -└── go.mod # Go module dependencies -``` - -### Client Features - -- Direct gRPC connection to P2P node sidecar -- Real-time message publishing and subscribing -- Message trace collection for both GossipSub and OptimumP2P protocols -- Graceful shutdown handling - -### Building the P2P Client - -#### Step 1: Create the directory and initialize Go module - -```bash -mkdir grpc_p2p_client -cd grpc_p2p_client -go mod init p2p_client -``` - -#### Step 2: Add dependencies - -```bash -go get google.golang.org/grpc -go get google.golang.org/protobuf -``` - -#### Step 3: Create protobuf definition - -Create `proto/p2p_stream.proto`: - -```bash -mkdir proto -``` - -Create `proto/p2p_stream.proto` with this content: - -```protobuf -syntax = "proto3"; - -package proto; - -option go_package = "optimum-gateway/proto;proto"; - -service CommandStream { - rpc ListenCommands (stream Request) returns (stream Response) {} - rpc Health (Void) returns (HealthResponse) {} - rpc ListTopics(Void) returns (TopicList) {} -} - -message Void {} - -message HealthResponse { - bool status = 1; - string nodeMode = 2; - float memoryUsed = 3; - float cpuUsed = 4; - float diskUsed = 5; -} - -enum ResponseType { - Unknown = 0; - Message = 1; - MessageTraceOptimumP2P = 2; - MessageTraceGossipSub = 3; -} - -message Request { - int32 command = 1; - bytes data = 2; - string topic = 3; -} - -message Response { - ResponseType command = 1; - bytes data = 2; - bytes metadata = 3; -} - -message TopicList { - repeated string topics = 1; -} -``` - -#### Step 4: Generate protobuf code - -```bash -mkdir grpc -protoc --go_out=grpc --go-grpc_out=grpc proto/p2p_stream.proto -``` - -#### Step 5: Create the client code - -Create `p2p_client.go` with this content: - -```go -package main - -import ( - "context" - "crypto/rand" - "encoding/hex" - "encoding/json" - "flag" - "fmt" - "io" - "log" - "math" - "os" - "os/signal" - "strings" - "sync/atomic" - "syscall" - "time" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/keepalive" - "google.golang.org/grpc/status" - - protobuf "p2p_client/grpc" -) - -type P2PMessage struct { - MessageID string - Topic string - Message []byte - SourceNodeID string -} - -type Command int32 - -const ( - CommandUnknown Command = iota - CommandPublishData - CommandSubscribeToTopic - CommandUnSubscribeToTopic -) - -var ( - addr = flag.String("addr", "localhost:33212", "sidecar gRPC address") - mode = flag.String("mode", "subscribe", "mode: subscribe | publish") - topic = flag.String("topic", "", "topic name") - message = flag.String("msg", "", "message data (for publish)") - - count = flag.Int("count", 1, "number of messages to publish (for publish mode)") - sleep = flag.Duration("sleep", 0, "optional delay between publishes (e.g., 1s, 500ms)") - - keepaliveTime = flag.Duration("keepalive-interval", 2*time.Minute, "gRPC keepalive ping interval") - keepaliveTimeout = flag.Duration("keepalive-timeout", 20*time.Second, "gRPC keepalive ping timeout") -) - -func main() { - flag.Parse() - if *topic == "" { - log.Fatalf("−topic is required") - } - - conn, err := grpc.NewClient(*addr, - grpc.WithTransportCredentials(insecure.NewCredentials()), - grpc.WithInitialWindowSize(1024*1024*1024), - grpc.WithInitialConnWindowSize(1024*1024*1024), - grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt), - grpc.MaxCallSendMsgSize(math.MaxInt), - ), - grpc.WithKeepaliveParams(keepalive.ClientParameters{ - Time: *keepaliveTime, - Timeout: *keepaliveTimeout, - PermitWithoutStream: false, - })) - if err != nil { - log.Fatalf("failed to connect to node %v", err) - } - defer conn.Close() - - client := protobuf.NewCommandStreamClient(conn) - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - stream, err := client.ListenCommands(ctx) - if err != nil { - log.Fatalf("ListenCommands: %v", err) - } - - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt, syscall.SIGTERM) - go func() { - <-c - fmt.Println("\nshutting down…") - cancel() - os.Exit(0) - }() - - switch *mode { - case "subscribe": - subReq := &protobuf.Request{ - Command: int32(CommandSubscribeToTopic), - Topic: *topic, - } - if err := stream.Send(subReq); err != nil { - log.Fatalf("send subscribe: %v", err) - } - fmt.Printf("Subscribed to topic %q, waiting for messages…\n", *topic) - - var receivedCount int32 - msgChan := make(chan *protobuf.Response, 10000) - - go func() { - for { - resp, err := stream.Recv() - if err == io.EOF { - close(msgChan) - return - } - if err != nil { - if st, ok := status.FromError(err); ok { - msg := st.Message() - if strings.Contains(msg, "ENHANCE_YOUR_CALM") || strings.Contains(msg, "too_many_pings") { - log.Printf("Connection closed due to keepalive ping limit.") - close(msgChan) - return - } - } - log.Printf("recv error: %v", err) - close(msgChan) - return - } - msgChan <- resp - } - }() - - for { - select { - case <-ctx.Done(): - log.Printf("Context canceled. Total messages received: %d", atomic.LoadInt32(&receivedCount)) - return - case resp, ok := <-msgChan: - if !ok { - log.Printf("Stream closed. Total messages received: %d", atomic.LoadInt32(&receivedCount)) - return - } - go func(resp *protobuf.Response) { - handleResponse(resp, &receivedCount) - }(resp) - } - } - - case "publish": - if *message == "" && *count == 1 { - log.Fatalf("−msg is required in publish mode") - } - for i := 0; i < *count; i++ { - var data []byte - if *count == 1 { - data = []byte(*message) - } else { - randomBytes := make([]byte, 4) - if _, err := rand.Read(randomBytes); err != nil { - log.Fatalf("failed to generate random bytes: %v", err) - } - randomSuffix := hex.EncodeToString(randomBytes) - data = []byte(fmt.Sprintf("P2P message %d - %s", i+1, randomSuffix)) - } - - pubReq := &protobuf.Request{ - Command: int32(CommandPublishData), - Topic: *topic, - Data: data, - } - if err := stream.Send(pubReq); err != nil { - log.Fatalf("send publish: %v", err) - } - fmt.Printf("Published %q to %q\n", string(data), *topic) - - if *sleep > 0 { - time.Sleep(*sleep) - } - } - - default: - log.Fatalf("unknown mode %q", *mode) - } -} - -func handleResponse(resp *protobuf.Response, counter *int32) { - switch resp.GetCommand() { - case protobuf.ResponseType_Message: - var p2pMessage P2PMessage - if err := json.Unmarshal(resp.GetData(), &p2pMessage); err != nil { - log.Printf("Error unmarshalling message: %v", err) - return - } - n := atomic.AddInt32(counter, 1) - fmt.Printf("[%d] Received message: %q\n", n, string(p2pMessage.Message)) - case protobuf.ResponseType_MessageTraceGossipSub: - case protobuf.ResponseType_MessageTraceOptimumP2P: - case protobuf.ResponseType_Unknown: - default: - log.Println("Unknown response command:", resp.GetCommand()) - } -} -``` - -#### Step 6: Build the client - -```bash -go build -o p2p-client ./p2p_client.go -``` - -### Usage Examples - -#### Subscribe to a Topic - -```bash -# Basic subscription -./p2p-client -mode=subscribe -topic=test-topic -addr=localhost:33212 -``` - -#### Publish Messages - -```bash -# Publish a single message -./p2p-client -mode=publish -topic=test-topic -msg="Hello World" -addr=localhost:33212 - -# Publish multiple random messages with delay -./p2p-client -mode=publish -topic=test-topic -addr=localhost:33212 \ - -count=100 -sleep=200ms -``` - -### Using a Convenience Script (Optional) - -You can create a helper script `p2p_client.sh` for easier usage: - -```bash -#!/usr/bin/env bash -set -e - -P2P_CLIENT_DIR="./grpc_p2p_client" - -cd "$P2P_CLIENT_DIR" - -go build -o p2p-client ./p2p_client.go - -if [ -z "${1:-}" ]; then - echo "Usage: $0 (subscribe )|(publish [options])" >&2 - exit 1 -fi - -ADDR="$1" -shift - -case "${1:-}" in - subscribe) - TOPIC="$2" - shift 2 - ./p2p-client -mode=subscribe -topic="$TOPIC" --addr="$ADDR" "$@" - ;; - publish) - TOPIC="$2" - MESSAGE="$3" - shift 3 - if [[ "$MESSAGE" == "random" ]]; then - ./p2p-client -mode=publish -topic="$TOPIC" --addr="$ADDR" "$@" - else - ./p2p-client -mode=publish -topic="$TOPIC" -msg="$MESSAGE" --addr="$ADDR" "$@" - fi - ;; - *) - echo "Usage: $0 (subscribe )|(publish [options])" >&2 - exit 1 - ;; -esac -``` - -Then use it like: - -```bash -# Subscribe to topic -./p2p_client.sh 127.0.0.1:33221 subscribe test-topic - -# Publish a message -./p2p_client.sh 127.0.0.1:33221 publish test-topic "Hello World" - -# Publish multiple random messages -./p2p_client.sh 127.0.0.1:33221 publish test-topic "random" -count=100 -sleep=200ms -``` - -### P2P Client Configuration - -| Parameter | Description | Default | Example | -|-----------|-------------|---------|---------| -| `-addr` | P2P node sidecar gRPC address | `localhost:33212` | `127.0.0.1:33221` | -| `-mode` | Operation mode | `subscribe` | `subscribe`, `publish` | -| `-topic` | Topic name for pub/sub | Required | `test-topic` | -| `-msg` | Message content (publish mode) | `""` | `"Hello World"` | -| `-count` | Number of messages to publish | `1` | `100` | -| `-sleep` | Delay between messages | `1s` | `200ms`, `2s` | - -### Message Structure - -The P2P client handles messages using this structure: - -```go -type P2PMessage struct { - MessageID string // Unique identifier for the message - Topic string // Topic name where the message was published - Message []byte // Actual message data - SourceNodeID string // ID of the node that sent the message -} -``` - -### Response Types - -The client receives different response types for metrics collection: - -- `ResponseType_Message` - Actual message content -- `ResponseType_MessageTraceGossipSub` - GossipSub protocol metrics -- `ResponseType_MessageTraceOptimumP2P` - OptimumP2P protocol metrics -- `ResponseType_Unknown` - Unknown response type - -## Proxy Client - -The Proxy client connects through the Proxy service, which provides REST API registration and gRPC streaming for message delivery. - -### Creating the Proxy Client - -The Proxy client code is provided in the [Quick Start Guide](../quick-start/first-message.md#step-4-create-the-proxy-client). Follow those steps to create the complete proxy client with all necessary files. - -### Client Features - -- REST API registration with threshold-based subscription -- gRPC streaming for real-time message delivery -- Automatic message publishing with configurable rate -- Load balancing across multiple proxy instances - -### Building the Proxy Client - -Refer to the [Quick Start Guide Steps 4a-4g](../quick-start/first-message.md#step-4-create-the-proxy-client) for complete build instructions. - -### Usage Examples - -#### Subscribe Only Mode - -```bash -# Basic subscription with threshold -./proxy-client -topic=demo -threshold=0.7 -subscribeOnly=true -``` - -#### Publish and Subscribe Mode - -```bash -# Publish 10 messages with 2-second delay -./proxy-client -topic=demo -threshold=0.5 -count=10 -delay=2s - -# High-frequency publishing -./proxy-client -topic=performance -threshold=0.5 -count=1000 -delay=100ms -``` - -### Using the Convenience Script - -Refer to the [Quick Start Guide](../quick-start/first-message.md) for examples of using the proxy client directly with command-line flags like: - -```bash -# Subscribe to topic with threshold -./proxy-client -topic=demo -threshold=0.7 -subscribeOnly - -# Publish messages with threshold and count -./proxy-client -topic=demo -threshold=0.5 -count=10 -``` - -### Proxy Client Configuration - -| Parameter | Description | Default | Example | -|-----------|-------------|---------|---------| -| `-topic` | Topic name for pub/sub | `demo` | `test-topic` | -| `-threshold` | Delivery threshold (0.0 to 1.0) | `0.1` | `0.7` | -| `-subscribeOnly` | Only subscribe, no publishing | `false` | `true` | -| `-count` | Number of messages to publish | `5` | `100` | -| `-delay` | Delay between message publishing | `2s` | `100ms`, `5s` | - -### Proxy Endpoints - -The Proxy client uses these endpoints: - -- **REST API**: `http://localhost:8081` (Proxy 1) / `http://localhost:8082` (Proxy 2) -- **gRPC Stream**: `localhost:50051` (default) - -### REST API Integration - -The client first registers via REST API before establishing gRPC streaming: - -```bash -# Example REST API call for subscription -curl -X POST http://localhost:8081/api/subscribe \ - -H "Content-Type: application/json" \ - -d '{ - "client_id": "test_client_001", - "topic": "demo", - "threshold": 0.7 - }' -``` - -## Performance Comparison Usage - -Both clients support metrics collection for comparing GossipSub vs OptimumP2P performance: - -### P2P Direct Client Metrics - -The P2P client receives protocol-specific trace messages: - -```go -switch resp.GetCommand() { -case protobuf.ResponseType_MessageTraceGossipSub: - // GossipSub protocol metrics -case protobuf.ResponseType_MessageTraceOptimumP2P: - // OptimumP2P protocol metrics -} -``` - -### Proxy Client Metrics - -The Proxy client provides simpler message delivery metrics suitable for application-level performance testing. - -### Example Performance Test - -```bash -# Terminal 1: Start OptimumP2P subscriber -./p2p-client -addr=127.0.0.1:33221 -mode=subscribe -topic=perf-test - -# Terminal 2: Start GossipSub subscriber -./p2p-client -addr=127.0.0.1:33222 -mode=subscribe -topic=perf-test - -# Terminal 3: Publish test messages -./p2p-client -addr=127.0.0.1:33221 -mode=publish -topic=perf-test -count=1000 -sleep=10ms -``` - -## Integration Examples - -### Go Application Integration - -```go -package main - -import ( - "context" - "log" - "math" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - protobuf "p2p_client/grpc" -) - -func main() { - // Connect to P2P node - conn, err := grpc.NewClient("localhost:33212", - grpc.WithTransportCredentials(insecure.NewCredentials()), - grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt), - grpc.MaxCallSendMsgSize(math.MaxInt), - )) - if err != nil { - log.Fatal(err) - } - defer conn.Close() - - client := protobuf.NewCommandStreamClient(conn) - stream, err := client.ListenCommands(context.Background()) - if err != nil { - log.Fatal(err) - } - - // Subscribe to topic - subReq := &protobuf.Request{ - Command: 2, // CommandSubscribeToTopic - Topic: "my-topic", - } - - if err := stream.Send(subReq); err != nil { - log.Fatal(err) - } - - // Listen for messages - for { - resp, err := stream.Recv() - if err != nil { - log.Fatal(err) - } - // Handle response... - } -} -``` - -### Protocol Buffer Definitions - -Both clients use Protocol Buffers for gRPC communication. The definitions are provided in the code sections above: - -- P2P Client: See the protobuf definition in the "Building the P2P Client" section -- Proxy Client: See the [Quick Start Guide](../quick-start/first-message.md#step-4d-create-protobuf-definition) - -## Troubleshooting - -### Connection Issues - -#### Error: `connection refused` - -``` -failed to connect to node dial tcp 127.0.0.1:33212: connect: connection refused -``` - -**Solutions:** -- Verify P2P nodes are running: `docker-compose ps` -- Check port mapping in docker-compose.yml -- Ensure correct sidecar port (typically 33212) - -### Message Delivery Issues - -#### No messages received - -**Troubleshooting:** -1. Verify topic names match exactly between publisher and subscriber -2. Check P2P node logs: `docker-compose logs p2pnode-1` -3. Ensure nodes are properly connected in mesh topology -4. Verify protocol mode consistency (all nodes using same protocol) - -#### Partial message delivery - -**For Proxy Client:** -- Adjust threshold parameter (lower values = faster delivery, less reliability) -- Check proxy connectivity to P2P nodes - -**For P2P Client:** -- Verify direct connection to healthy P2P node -- Check RLNC configuration parameters - -### Build Issues - -#### Proto generation errors - -```bash -# Regenerate gRPC code if needed -cd grpc_p2p_client -protoc --go_out=grpc --go-grpc_out=grpc proto/*.proto -``` - -#### Module dependency issues - -```bash -# Update Go modules -go mod tidy -go mod download -``` - -## Advanced Usage - -### Long-Running Subscriptions - -For production deployments, consider: - -1. **Connection monitoring**: Implement reconnection logic for network failures -2. **Message persistence**: Store received messages for reliability -3. **Load balancing**: Connect to multiple P2P nodes for redundancy -4. **Metrics collection**: Track message delivery rates and latency - -### Custom Message Formats - -Both clients support custom message formats. Modify the message structure in: - -- P2P Client: `P2PMessage` struct in `p2p_client.go` -- Proxy Client: Message handling in `proxy_client.go` - -### Integration with Other Languages - -The Protocol Buffer definitions can be used to generate client code for other languages: - -```bash -# Python -protoc --python_out=. --grpc_python_out=. proto/*.proto - -# JavaScript/Node.js -protoc --js_out=import_style=commonjs:. --grpc-web_out=import_style=commonjs,mode=grpcwebtext:. proto/*.proto - -# Java -protoc --java_out=. --grpc-java_out=. proto/*.proto -``` - -## See Also - -- [mump2p CLI Guide](./mump2p-cli.md) - Command-line client for OptimumP2P -- [P2P-Only Deployment](../deployment/p2p-only.md) - Setting up P2P nodes without proxy -- [Proxy + P2P Deployment](../deployment/p2p-with-proxy.md) - Full stack with proxy services -- [OptimumP2P Configuration](../configuration/optimump2p.md) - Protocol configuration parameters -- [GossipSub Configuration](../configuration/gossipsub.md) - Baseline protocol configuration \ No newline at end of file diff --git a/docs/hackathon/clients/mump2p-cli.md b/docs/hackathon/clients/mump2p-cli.md deleted file mode 100644 index 453a540..0000000 --- a/docs/hackathon/clients/mump2p-cli.md +++ /dev/null @@ -1,207 +0,0 @@ -# mump2p — OptimumP2P CLI Client - -**mump2p is the primary client entry point for interacting with OptimumP2P** — a high-performance RLNC-enhanced pubsub protocol. This command-line interface provides the easiest way to publish and subscribe to messages using the OptimumP2P protocol. - -**Source:** [https://github.com/getoptimum/mump2p-cli](https://github.com/getoptimum/mump2p-cli) - -## Installation - -Download the appropriate binary for your system from the [GitHub releases page](https://github.com/getoptimum/mump2p-cli/releases): - -- `mump2p-mac` for macOS -- `mump2p-linux` for Linux - -Make the binary executable (Mac/Linux): - -```sh -chmod +x mump2p-mac -# For convenience, you may want to rename and move to your PATH -mv mump2p-mac /usr/local/bin/mump2p -``` - ---- - -## Authentication - -### Login - -Before you can publish or subscribe to messages, you need to authenticate: - -```sh -./mump2p login -``` - -This will start the device authorization flow: - -1. A URL and a code will be displayed in your terminal -2. Open the URL in your browser -3. Enter the code when prompted -4. Complete the authentication process in the browser -5. The CLI will automatically receive and store your authentication token - -### Check Authentication Status - -To verify your current authentication status: - -```sh -./mump2p whoami -``` - -This will display: - -- Your client ID -- Token expiration time -- Token validity status -- Rate limits associated with your account - -**Important: After logging in, please share the email ID you used to sign up in the group, so we can activate your access.** - -### Refresh Token - -If your token is about to expire, you can refresh it: - -```sh -./mump2p refresh -``` - -### Logout - -To remove your stored authentication token: - -```sh -./mump2p logout -``` - ---- - -## Service URLs - -The CLI connects to different proxy servers around the world. By default, it uses the first available proxy, but you can specify a different one using the `--service-url` flag. - -For a complete list of available proxys and their locations, see: [Available Service URLs](https://github.com/getoptimum/mump2p-cli#available-service-urls) in the README. - -**Example using a specific proxy:** -```sh -./mump2p publish --topic=test --message="Hello" --service-url="http://35.221.118.95:8080" -./mump2p subscribe --topic=test --service-url="http://34.142.205.26:8080" -``` - ---- - -## Publishing Messages - -### Publish a Text Message - -To publish a simple text message to a topic: - -```sh -./mump2p publish --topic=your-topic-name --message="Your message content" -``` - -### Publish a File - -To publish the contents of a file: - -```sh -./mump2p publish --topic=your-topic-name --file=/path/to/your/file.json -``` - -Rate limits will be automatically applied based on your authentication token. - -## Subscribing to Messages - -### Basic Subscription - -To subscribe to a topic in real-time: - -```sh -./mump2p subscribe --topic=your-topic-name -``` - -This will open a WebSocket connection and display incoming messages in real-time. Press `Ctrl+C` to exit. - -### Save Messages to a File - -To persist messages to a local file while subscribing: - -```sh -./mump2p subscribe --topic=your-topic-name --persist=/path/to/save/ -``` - -If you provide just a directory path, messages will be saved to a file named `messages.log` in that directory. - -### Forward Messages to a Webhook - -To forward messages to an HTTP webhook: - -```sh -./mump2p subscribe --topic=your-topic-name --webhook=https://your-server.com/webhook -``` - -**Note: The webhook endpoint must be configured to accept POST requests.** - -#### Advanced Webhook Options - -For more control over webhook behavior: - -```sh -./mump2p subscribe --topic=your-topic-name \ - --webhook=https://your-server.com/webhook \ - --webhook-queue-size=200 \ - --webhook-timeout=5 - ``` - -Options: - -- `--webhook-queue-size`: Maximum number of messages to queue before dropping (default: `100`) -- `--webhook-timeout`: Timeout in seconds for each webhook POST request (default: `3`) - -### Combine Persistence and Webhook - -You can both save messages locally and forward them to a webhook: - -```sh -./mump2p subscribe --topic=your-topic-name \ - --persist=/path/to/messages.log \ - --webhook=https://your-server.com/webhook -``` - ---- - -## Checking Usage and Limits - -To see your current usage statistics and rate limits: - -```sh -./mump2p usage -``` - -This will display: - -- Number of publish operations (per hour and per second) -- Data usage (bytes, KB, or MB depending on amount) -- Quota limits -- Time until usage counters reset -- Timestamps of your last publish and subscribe operations - -## Tips for Effective Use - -1. **Topic Names:** Choose descriptive and unique topic names to avoid message conflicts -2. **Message Size:** Be aware of your maximum message size limit when publishing files -3. **Token Refresh:** For long-running operations, refresh your token before it expires -4. **Persistent Subscriptions:** Use the --persist option when you need a record of messages -5. **Webhook Reliability:** Increase the queue size for high-volume topics to prevent message drops - -## Troubleshooting - -- **Authentication Errors:** Run mump2p whoami to check token status, and mump2p login to re-authenticate -- **Rate Limit Errors:** Use mump2p usage to check your current usage against limits -- **Connection Issues:** Verify your internet connection and firewall settings -- **Webhook Failures:** Check that your webhook endpoint is accessible and properly configured to accept POST requests - -## See Also - -- [gRPC Client Examples](./grpc-examples.md) - Direct gRPC integration examples for advanced use cases -- [Proxy + P2P Deployment](../deployment/p2p-with-proxy.md) - Full stack deployment with REST/WebSocket APIs -- [P2P-Only Deployment](../deployment/p2p-only.md) - Direct P2P integration -- [OptimumP2P Configuration](../configuration/optimump2p.md) - Protocol configuration parameters \ No newline at end of file diff --git a/docs/hackathon/configuration/gossipsub.md b/docs/hackathon/configuration/gossipsub.md deleted file mode 100644 index 41b0e08..0000000 --- a/docs/hackathon/configuration/gossipsub.md +++ /dev/null @@ -1,124 +0,0 @@ -# GossipSub Configuration - -Understanding GossipSub configuration is essential for optimizing your P2P network performance. This page explains the core GossipSub parameters and how to configure them in Optimum P2P. - -## What is GossipSub? - -GossipSub is a pubsub protocol designed for decentralized networks that builds on the concept of a "mesh" - a subset of peers that directly exchange messages, plus "gossip" to peers outside the mesh about available messages. - -### Key Concepts - -- **Mesh**: Direct connections between peers for message forwarding -- **Gossip**: Metadata exchange about available messages with non-mesh peers -- **Fanout**: Temporary connections for publishing when not subscribed to a topic -- **Degree**: The number of peer connections each node maintains - -## Core GossipSub Parameters - -Based on the [libp2p GossipSub v1.0 specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md#parameters), here are the fundamental parameters: - -### Network Topology Parameters - -| Parameter | Purpose | Default | Description | -|-----------|---------|---------|-------------| -| `D` | Desired mesh degree | 6 | Target number of peers in topic mesh | -| `D_low` | Lower bound for mesh degree | 4 | Minimum connections before adding peers | -| `D_high` | Upper bound for mesh degree | 12 | Maximum connections before pruning peers | -| `D_lazy` | Gossip emission degree | 6 | Number of peers for gossip emission | - -### Timing Parameters - -| Parameter | Purpose | Default | Description | -|-----------|---------|---------|-------------| -| `heartbeat_interval` | Mesh maintenance frequency | 1 second | How often to run maintenance | -| `fanout_ttl` | Fanout topic lifetime | 60 seconds | TTL for non-subscribed topic state | -| `seen_ttl` | Message deduplication cache | 2 minutes | How long to remember seen messages | - -### Message Cache Parameters - -| Parameter | Purpose | Default | Description | -|-----------|---------|---------|-------------| -| `mcache_len` | Message history windows | 5 | Number of history windows to keep | -| `mcache_gossip` | Gossip history windows | 3 | Windows to use for gossip emission | - -## Optimum P2P GossipSub Configuration - -Optimum P2P implements GossipSub with configurable parameters through environment variables: - -### Environment Variables - -- **`GOSSIPSUB_PORT`**: Port for GossipSub protocol communication - - Purpose: Network port for GossipSub peer-to-peer communication - - Default: `6060` - - Usage: Internal P2P networking, separate from API ports - - Example: `GOSSIPSUB_PORT=6060` - -- **`GOSSIPSUB_MAX_MSG_SIZE`**: Maximum message size in bytes - - Purpose: Limits individual message size to prevent memory issues - - Default: `1048576` (1MB) - - Usage: Larger values allow bigger payloads but use more memory - - Example: `GOSSIPSUB_MAX_MSG_SIZE=1048576` - -- **`GOSSIPSUB_MESH_TARGET`**: Target number of mesh connections - - Purpose: Ideal number of direct peer connections (corresponds to `D`) - - Default: `6` - - Impact: Higher values increase redundancy but use more bandwidth - - Example: `GOSSIPSUB_MESH_TARGET=6` - -- **`GOSSIPSUB_MESH_MIN`**: Minimum mesh connections - - Purpose: Lower threshold before attempting to add peers (corresponds to `D_low`) - - Default: `4` - - Note: Should be less than `GOSSIPSUB_MESH_TARGET` - - Example: `GOSSIPSUB_MESH_MIN=4` - -- **`GOSSIPSUB_MESH_MAX`**: Maximum mesh connections - - Purpose: Upper threshold before pruning excess peers (corresponds to `D_high`) - - Default: `12` - - Note: Should be greater than `GOSSIPSUB_MESH_TARGET` - - Example: `GOSSIPSUB_MESH_MAX=12` - -### Configuration Example - -```yaml -# docker-compose.yml -services: - p2pnode-1: - environment: - - GOSSIPSUB_PORT=6060 - - GOSSIPSUB_MAX_MSG_SIZE=1048576 - - GOSSIPSUB_MESH_TARGET=6 - - GOSSIPSUB_MESH_MIN=4 - - GOSSIPSUB_MESH_MAX=12 -``` - -## GossipSub vs Optimum Protocol - -Optimum P2P runs two protocols simultaneously: - -1. **Standard GossipSub**: For baseline pub/sub functionality -2. **Optimum Protocol**: Enhanced with RLNC (Random Linear Network Coding) - -Both protocols have their own configuration parameters: - -| Aspect | GossipSub | Optimum | -|--------|-----------|---------| -| Purpose | Standard pub/sub mesh | RLNC-enhanced messaging | -| Port | `GOSSIPSUB_PORT` | `OPTIMUM_PORT` | -| Mesh Target | `GOSSIPSUB_MESH_TARGET` | `OPTIMUM_MESH_TARGET` | -| Message Size | `GOSSIPSUB_MAX_MSG_SIZE` | `OPTIMUM_MAX_MSG_SIZE` | - -### Control Messages - -GossipSub uses four types of control messages: - -- **GRAFT**: Add peer to mesh (invite to join topic mesh) -- **PRUNE**: Remove peer from mesh (remove from topic mesh) -- **IHAVE**: Announce available messages (gossip metadata) -- **IWANT**: Request specific messages (response to IHAVE) - - -## References - -- [libp2p GossipSub v1.0 Specification](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md) -- [libp2p PubSub Interface](https://github.com/libp2p/specs/blob/master/pubsub/README.md) -- [Optimum P2P Configuration Guide](/docs/hackathon/deployment/p2p-with-proxy.md#p2p-node-configuration) \ No newline at end of file diff --git a/docs/hackathon/configuration/optimump2p.md b/docs/hackathon/configuration/optimump2p.md deleted file mode 100644 index c842de5..0000000 --- a/docs/hackathon/configuration/optimump2p.md +++ /dev/null @@ -1,246 +0,0 @@ -# OptimumP2P Configuration - -This page covers all OptimumP2P-specific configuration parameters, their impact on network performance, and how to configure them for different deployment scenarios. - -## Configuration Mapping - -OptimumP2P configuration can be set via YAML config files or Docker environment variables. The following tables map the configuration fields to their corresponding Docker environment variables: - -### RLNC Core Parameters - -| Config Field | Environment Variable | Default | Description | -|--------------|---------------------|---------|-------------| -| `rlnc_shard_factor` | `OPTIMUM_SHARD_FACTOR` | `4` | Number of coded shards per message | -| `publisher_shard_multiplier` | `OPTIMUM_SHARD_MULT` | `1.5` | Coded shard multiplier for publishing | -| `forward_shard_threshold` | `OPTIMUM_THRESHOLD` | `0.75` | Fraction needed before forwarding | - -### Mesh Topology Parameters - -| Config Field | Environment Variable | Default | Description | -|--------------|---------------------|---------|-------------| -| `mesh_degree_target` | `OPTIMUM_MESH_TARGET` | `6` | Target peer connections | -| `mesh_degree_min` | `OPTIMUM_MESH_MIN` | `3` | Min before grafting | -| `mesh_degree_max` | `OPTIMUM_MESH_MAX` | `12` | Max before pruning | - -### Protocol Selection - -| Config Field | Environment Variable | Default | Description | -|--------------|---------------------|---------|-------------| -| `enable_optimum_p2p` | `NODE_MODE=optimum` | `true` | Enable RLNC protocol | -| `enable_gossipsub` | `NODE_MODE=gossipsub` | `false` | Enable GossipSub baseline | - -### Message and Network Settings - -| Config Field | Environment Variable | Default | Description | -|--------------|---------------------|---------|-------------| -| `random_message_size_bytes` | `OPTIMUM_MAX_MSG_SIZE` | `1048576` | Max message size (1MB) | -| `app_port` | `API_PORT` | `9090` | HTTP API port | - -## RLNC Parameter Details - -### Shard Factor (coded shards) - -**Parameter**: `OPTIMUM_SHARD_FACTOR` -**Config Field**: `rlnc_shard_factor` -**Default**: `4` - -Controls how many coded shards each message is divided into for network coding. This is the fundamental parameter that determines RLNC granularity. - -**Technical Impact**: -- **Higher values**: More coded shards provide better redundancy and fault tolerance but increase computational overhead -- **Lower values**: Fewer coded shards reduce processing time and bandwidth usage but may reduce fault tolerance -- **Network effect**: Directly affects the minimum number of coded shards needed for message reconstruction - -### Publisher Shard Multiplier - -**Parameter**: `OPTIMUM_SHARD_MULT` -**Config Field**: `publisher_shard_multiplier` -**Default**: `1.5` - -Controls redundancy when publishing messages. Total coded shards created = `rlnc_shard_factor × publisher_shard_multiplier`. - -**Technical Impact**: -- **Higher values**: More initial coded shards improve delivery guarantees but increase bandwidth usage -- **Lower values**: Fewer coded shards reduce network load but may impact reliability in lossy networks - -### Forward Shard Threshold - -**Parameter**: `OPTIMUM_THRESHOLD` -**Config Field**: `forward_shard_threshold` -**Default**: `0.75` - -Determines when nodes forward received coded shards. Nodes forward when they have more than `rlnc_shard_factor × threshold` coded shards. - -**Technical Impact**: -- **Higher values** (0.8-0.9): More reliable forwarding, increased latency -- **Lower values** (0.5-0.6): Faster propagation, reduced latency, potential reliability trade-offs - -## Docker Configuration Examples - -### OptimumP2P Mode (Enhanced) -```yaml -environment: - - NODE_MODE=optimum - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 -``` - -### GossipSub Mode (Baseline) -```yaml -environment: - - NODE_MODE=gossipsub - - GOSSIPSUB_MESH_TARGET=6 - - GOSSIPSUB_MESH_MIN=4 - - GOSSIPSUB_MESH_MAX=12 -``` - -## Performance Tuning - -### High Throughput Setup -Optimized for maximum message throughput: -```yaml -- OPTIMUM_SHARD_FACTOR=8 -- OPTIMUM_SHARD_MULT=2.0 -- OPTIMUM_THRESHOLD=0.5 -- OPTIMUM_MESH_TARGET=8 -``` - -### Low Latency Setup -Optimized for minimum delivery latency: -```yaml -- OPTIMUM_SHARD_FACTOR=4 -- OPTIMUM_SHARD_MULT=1.2 -- OPTIMUM_THRESHOLD=0.6 -- OPTIMUM_MESH_TARGET=6 -``` - -### High Reliability Setup -Optimized for maximum fault tolerance: -```yaml -- OPTIMUM_SHARD_FACTOR=16 -- OPTIMUM_SHARD_MULT=2.5 -- OPTIMUM_THRESHOLD=0.8 -- OPTIMUM_MESH_TARGET=10 -``` - -## Configuration File Format - -Sample YAML configuration matching the actual config structure: - -```yaml -# === General App Settings === -app_port: 23422 -cluster_id: "production_cluster" -file_storage_directory: /tmp -silent_mode_enabled: false - -# === Protocol Settings === -enable_gossipsub: false -enable_optimum_p2p: true - -# === PubSub Mesh Settings === -mesh_degree_target: 6 -mesh_degree_min: 5 -mesh_degree_max: 12 -rlnc_shard_factor: 32 # number of coded shards each message is divided into - -# === Message Generation === -random_message_size_bytes: 3145728 # 3MB -publisher_shard_multiplier: 1.5 # coded shards multiplier for publishing -forward_shard_threshold: 0.75 # forward threshold for coded shards - -# === Bootstrap Nodes === -bootstrap_nodes_optimum_p2p: - - /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample - -bootstrap_nodes_gossipsub: - - /ip4/127.0.0.1/tcp/10000/p2p/12D3KooWExample -``` - -## Protocol Mode Switching - -OptimumP2P supports running both protocols for comparison: - -**OptimumP2P Mode** (`NODE_MODE=optimum`): -- Uses RLNC with coded shards for enhanced propagation -- Provides early forwarding capabilities -- Better bandwidth efficiency through network coding -- Enhanced fault tolerance via coded shard redundancy - -**GossipSub Mode** (`NODE_MODE=gossipsub`): -- Standard libp2p GossipSub implementation -- Direct message forwarding without coding -- Lower computational overhead -- Baseline for performance comparison - -## Monitoring Configuration - -Verify your configuration is applied correctly: - -```bash -# Check applied configuration -curl http://localhost:9090/config - -# Monitor mesh formation and peer connections -curl http://localhost:9090/debug/peers - -# Check protocol mode in logs -docker logs p2pnode-1 | grep -E "(optimum|gossipsub|coded.*shard)" - -# Monitor coded shard processing -docker logs p2pnode-1 | grep -E "(shard|forward|decode)" -``` - -## Configuration Constraints - -**Enforced by code**: -- `mesh_degree_min <= mesh_degree_target <= mesh_degree_max` -- `random_message_size_bytes > 0` -- `cluster_id` must not be empty or "sample_cluster" - -**Recommended best practices**: -- `forward_shard_threshold` between 0.0 and 1.0 (values outside this range may cause unexpected behavior) -- `rlnc_shard_factor > 0` (value of 0 disables RLNC functionality) -- `publisher_shard_multiplier >= 1.0` (values < 1.0 reduce redundancy) - -## Complete Docker Compose Example - -```yaml -services: - p2pnode-1: - image: getoptimum/p2pnode:latest - environment: - # Protocol selection - - NODE_MODE=optimum - - CLUSTER_ID=p2pnode-1 - - # RLNC coded shard parameters - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - # Mesh topology - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - # Network settings - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - SIDECAR_PORT=33212 - - API_PORT=9090 - - # Bootstrap configuration - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} -``` - -## See Also - -- **[GossipSub Configuration](./gossipsub.md)** - Standard protocol parameters for comparison -- **[P2P-Only Deployment](../deployment/p2p-only.md)** - Complete setup with configuration -- **[Proxy + P2P Deployment](../deployment/p2p-with-proxy.md)** - Full stack configuration -- **[OptimumP2P Technical Overview](../../learn/overview/p2p.md)** - Protocol fundamentals and RLNC details \ No newline at end of file diff --git a/docs/hackathon/configuration/protocol-selection.md b/docs/hackathon/configuration/protocol-selection.md deleted file mode 100644 index 2c21da3..0000000 --- a/docs/hackathon/configuration/protocol-selection.md +++ /dev/null @@ -1,271 +0,0 @@ -# Protocol Selection Guide - -The `getoptimum/p2pnode:latest` Docker image supports running two different gossip protocols: - -* **OptimumP2P** (`NODE_MODE=optimum`) - RLNC-enhanced gossip protocol (recommended) -* **GossipSub** (`NODE_MODE=gossipsub`) - Standard libp2p gossip protocol for comparison - -This guide explains how to configure and deploy each protocol mode. - -## Overview - -Both protocols use the same Docker image but operate with different: - -* **Network ports** - OptimumP2P uses port 7070, GossipSub uses port 6060 -* **Configuration parameters** - Each protocol has protocol-specific environment variables -* **Bootstrap peers** - Must match the protocol and port of target nodes -* **Performance characteristics** - OptimumP2P provides enhanced throughput and fault tolerance - -## OptimumP2P Mode (Recommended) - -### Basic Configuration - -```yaml -services: - p2pnode-optimum: - image: 'getoptimum/p2pnode:latest' - environment: - - NODE_MODE=optimum - - CLUSTER_ID=my-cluster - - OPTIMUM_PORT=7070 - - IDENTITY_DIR=/identity - # Bootstrap peer using OptimumP2P protocol and port - - BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - ports: - - "7070:7070" # OptimumP2P protocol port - - "33212:33212" # gRPC sidecar port - - "9090:9090" # HTTP API port -``` - -### OptimumP2P Parameters - -| Parameter | Environment Variable | Default | Description | -|-----------|---------------------|---------|-------------| -| Listen Port | `OPTIMUM_PORT` | `7070` | P2P protocol listening port | -| Max Message Size | `OPTIMUM_MAX_MSG_SIZE` | `1048576` | Maximum message size (bytes) | -| Mesh Target | `OPTIMUM_MESH_TARGET` | `6` | Target number of mesh peers | -| Mesh Min | `OPTIMUM_MESH_MIN` | `3` | Minimum mesh peers before grafting | -| Mesh Max | `OPTIMUM_MESH_MAX` | `12` | Maximum mesh peers before pruning | -| Shard Factor | `OPTIMUM_SHARD_FACTOR` | `4` | Number of coded shards per message | -| Shard Multiplier | `OPTIMUM_SHARD_MULT` | `1.5` | Publisher shard creation multiplier | -| Forward Threshold | `OPTIMUM_THRESHOLD` | `0.75` | Threshold for forwarding recoded shards | - -### Performance Benefits - -OptimumP2P provides several advantages over standard GossipSub: - -* **Lower Latency** - Coded shards can be forwarded before complete message reception -* **Bandwidth Efficiency** - RLNC reduces redundant data transmission -* **Fault Tolerance** - Messages decode from any sufficient combination of shards -* **Loss Recovery** - Built-in redundancy handles packet loss gracefully - -## GossipSub Mode (Baseline) - -### Basic Configuration - -```yaml -services: - p2pnode-gossipsub: - image: 'getoptimum/p2pnode:latest' - environment: - - NODE_MODE=gossipsub - - CLUSTER_ID=my-cluster - - GOSSIPSUB_PORT=6060 - - IDENTITY_DIR=/identity - # Bootstrap peer using GossipSub protocol and port - - BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/6060/p2p/${BOOTSTRAP_PEER_ID} - ports: - - "6060:6060" # GossipSub protocol port - - "33212:33212" # gRPC sidecar port - - "9090:9090" # HTTP API port -``` - -### GossipSub Parameters - -| Parameter | Environment Variable | Default | Description | -|-----------|---------------------|---------|-------------| -| Listen Port | `GOSSIPSUB_PORT` | `6060` | P2P protocol listening port | -| Max Message Size | `GOSSIPSUB_MAX_MSG_SIZE` | `1048576` | Maximum message size (bytes) | -| Mesh Target | `GOSSIPSUB_MESH_TARGET` | `6` | Target number of mesh peers | -| Mesh Min | `GOSSIPSUB_MESH_MIN` | `4` | Minimum mesh peers before grafting | -| Mesh Max | `GOSSIPSUB_MESH_MAX` | `12` | Maximum mesh peers before pruning | - -For detailed GossipSub configuration, see **[GossipSub Configuration](./gossipsub.md)**. - -## Multi-Protocol Deployment - -You can run both protocols simultaneously on the same network for comparison: - -```yaml -version: '3.8' -services: - # OptimumP2P bootstrap node - p2pnode-optimum-bootstrap: - image: 'getoptimum/p2pnode:latest' - environment: - - NODE_MODE=optimum - - CLUSTER_ID=comparison-test - - OPTIMUM_PORT=7070 - - IDENTITY_DIR=/identity - ports: - - "7070:7070" - - "33212:33212" - - "9090:9090" - networks: - test-network: - ipv4_address: 172.28.0.10 - - # GossipSub bootstrap node - p2pnode-gossipsub-bootstrap: - image: 'getoptimum/p2pnode:latest' - environment: - - NODE_MODE=gossipsub - - CLUSTER_ID=comparison-test - - GOSSIPSUB_PORT=6060 - - IDENTITY_DIR=/identity - ports: - - "6060:6060" - - "33213:33212" - - "9091:9090" - networks: - test-network: - ipv4_address: 172.28.0.11 - - # OptimumP2P peer - p2pnode-optimum-peer: - image: 'getoptimum/p2pnode:latest' - environment: - - NODE_MODE=optimum - - CLUSTER_ID=comparison-test - - OPTIMUM_PORT=7070 - - BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/7070/p2p/${OPTIMUM_BOOTSTRAP_PEER_ID} - networks: - test-network: - ipv4_address: 172.28.0.12 - - # GossipSub peer - p2pnode-gossipsub-peer: - image: 'getoptimum/p2pnode:latest' - environment: - - NODE_MODE=gossipsub - - CLUSTER_ID=comparison-test - - GOSSIPSUB_PORT=6060 - - BOOTSTRAP_PEERS=/ip4/172.28.0.11/tcp/6060/p2p/${GOSSIPSUB_BOOTSTRAP_PEER_ID} - networks: - test-network: - ipv4_address: 172.28.0.13 - -networks: - test-network: - driver: bridge - ipam: - config: - - subnet: 172.28.0.0/16 -``` - -## Validation and Troubleshooting - -### Valid NODE_MODE Values - -The p2pnode validates `NODE_MODE` at startup. Valid values are: - -* `optimum` - Enables OptimumP2P with RLNC -* `gossipsub` - Enables standard GossipSub - -Invalid values will cause the container to exit with a fatal error. - -### Common Configuration Issues - -**Port Conflicts** -```bash -# Ensure correct port mapping for each protocol -# OptimumP2P: 7070 -# GossipSub: 6060 -``` - -**Bootstrap Peer Mismatches** -```bash -# OptimumP2P nodes must bootstrap to OptimumP2P peers on port 7070 -BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/7070/p2p/${PEER_ID} - -# GossipSub nodes must bootstrap to GossipSub peers on port 6060 -BOOTSTRAP_PEERS=/ip4/172.28.0.10/tcp/6060/p2p/${PEER_ID} -``` - -**Protocol Isolation** -* OptimumP2P and GossipSub nodes cannot directly communicate -* Each protocol forms its own mesh network -* Use separate bootstrap nodes for each protocol - -### Health Checks - -Both protocols expose the same health check endpoints: - -```bash -# Check node status -curl http://localhost:9090/health - -# Check peer connections -curl http://localhost:9090/peers - -# Check protocol-specific metrics -curl http://localhost:9090/metrics -``` - -## Configuration Experimentation - -### OptimumP2P Parameter Testing - -OptimumP2P's RLNC implementation provides several parameters that significantly impact network behavior: - -**Shard Factor Experimentation** -```yaml -# Test different sharding approaches -OPTIMUM_SHARD_FACTOR=2 # Minimal sharding -OPTIMUM_SHARD_FACTOR=4 # Default configuration -OPTIMUM_SHARD_FACTOR=8 # High redundancy -``` - -**Forward Threshold Testing** -```yaml -# Test forwarding behavior -OPTIMUM_THRESHOLD=0.5 # Aggressive forwarding -OPTIMUM_THRESHOLD=0.75 # Default behavior -OPTIMUM_THRESHOLD=0.9 # Conservative forwarding -``` - -**Mesh Density Configuration** -```yaml -# Test network connectivity -OPTIMUM_MESH_TARGET=4 # Sparse mesh -OPTIMUM_MESH_TARGET=8 # Dense mesh -OPTIMUM_MESH_TARGET=12 # Maximum connectivity -``` - -### Protocol Comparison Setup - -To observe protocol differences, deploy both modes with identical network topology: - -```yaml -# OptimumP2P network -services: - optimum-network: - environment: - - NODE_MODE=optimum - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_MESH_TARGET=6 - -# GossipSub network - gossipsub-network: - environment: - - NODE_MODE=gossipsub - - GOSSIPSUB_MESH_TARGET=6 -``` - - ---- - -**Next Steps:** -* **[OptimumP2P Configuration](./optimump2p.md)** - Detailed RLNC parameter tuning -* **[GossipSub Configuration](./gossipsub.md)** - Standard gossip parameters -* **[Client Integration](../clients/)** - Connect applications to either protocol \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-only.md b/docs/hackathon/deployment/p2p-only.md deleted file mode 100644 index c2c30b5..0000000 --- a/docs/hackathon/deployment/p2p-only.md +++ /dev/null @@ -1,289 +0,0 @@ -# P2P Network Only Deployment - -This guide covers deploying a standalone OptimumP2P network without proxy intermediaries. In this configuration, clients connect directly to P2P nodes using gRPC sidecar connections, providing maximum performance and protocol flexibility. - - -### Network Topology - -The P2P network forms a mesh topology where each node maintains connections to a subset of peers based on the configured mesh parameters: - -- **Mesh Target (`OPTIMUM_MESH_TARGET`)**: Ideal number of peers per topic -- **Mesh Range (`OPTIMUM_MESH_MIN` to `OPTIMUM_MESH_MAX`)**: Acceptable peer count bounds -- **Bootstrap Nodes**: Initial discovery points for new nodes joining the network - - -## Deployment Configuration - -```yaml -services: - p2pnode-1: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-1 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - networks: - optimum-network: - ipv4_address: 172.28.0.12 - ports: - - "33221:33212" # gRPC sidecar - - "7071:7070" # OptimumP2P - - "9091:9090" # API - volumes: - - ./identity:/identity - - p2pnode-2: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-2 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - networks: - optimum-network: - ipv4_address: 172.28.0.13 - ports: - - "33222:33212" - - "7072:7070" - - "9092:9090" - -networks: - optimum-network: - driver: bridge - ipam: - config: - - subnet: 172.28.0.0/16 -``` - -## Environment Variables - -### Core Configuration - -- **`NODE_MODE`**: P2P protocol implementation mode - - Purpose: Selects the underlying pub/sub protocol - - Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) - - Default: `optimum` - - Usage: Use `optimum` for better performance with RLNC coding - - Note: All nodes in network should use same mode for compatibility - -- **`CLUSTER_ID`**: Unique identifier for each P2P node - - Purpose: Distinguishes nodes in logs, metrics, and network topology - - Usage: Should be unique across all P2P nodes in deployment - - Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. - - Required: Yes, no default value - -- **`LOG_LEVEL`**: Logging verbosity level - - Purpose: Controls the amount and detail of log output - - Values: `debug`, `info`, `warn`, `error` - - Default: `info` - - Usage Guide: - - `debug`: Most verbose, includes detailed P2P protocol events (development) - - `info`: Standard level with operational information - - `warn`: Only warnings and errors (quiet operation) - - `error`: Only error messages (minimal logging) - -### Port Configuration - -- **`SIDECAR_PORT`**: gRPC bidirectional communication port - - Purpose: Port where clients connect directly to interact with P2P node - - Default: `33212` - - Range: Any available port - - Usage: Must be accessible from client applications for direct P2P access - - Network: Used for client-to-node gRPC communication - -- **`API_PORT`**: HTTP monitoring and management API port - - Purpose: Exposes REST endpoints for health checks, node state, and metrics - - Default: `9090` - - Range: Any available port - - Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` - - Usage: Used for operational monitoring and debugging - -- **`OPTIMUM_PORT`**: P2P protocol communication port - - Purpose: Port for peer-to-peer communication between nodes - - Default: `7070` - - Range: Any available port - - Usage: Must be accessible between all P2P nodes in the mesh - - Network: Used for inter-node OptimumP2P protocol communication - -### RLNC Parameters - -- **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes - - Purpose: Limits individual message size to prevent memory issues - - Default: `1048576` (1MB) - - Usage: Larger values allow bigger payloads but use more memory/bandwidth - - -- **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message - - Purpose: Controls how many pieces each message is split into for RLNC - - Default: `4` - - Impact: Higher values increase redundancy and fault tolerance but use more bandwidth - - Note: Must be non-zero to enable RLNC functionality - -- **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier - - Purpose: Controls redundancy factor for error recovery - - Default: `1.5` - - Impact: Higher values improve error recovery but increase bandwidth usage - - Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) - - -- **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio - - Purpose: Fraction of shards needed before forwarding or decoding message - - Default: `0.75` (75%) - - Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) - - Impact: Critical for network performance tuning - - Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency - -### Mesh Topology Configuration - -- **`OPTIMUM_MESH_TARGET`**: Target number of peer connections - - Purpose: Ideal number of peers each node connects to in the mesh - - Default: `6` - - Range: 3-50 (typically 4-12 for most deployments) - - Impact: Higher values increase redundancy and fault tolerance but use more resources - - -- **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections - - Purpose: Minimum connections before attempting to add more peers - - Default: `4` - - Note: Should be less than MESH_TARGET - - Impact: Lower values reduce fault tolerance, higher values increase resource usage - - Usage: Prevents network partitioning by maintaining minimum connectivity - -- **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections - - Purpose: Maximum connections before pruning excess peers - - Default: `12` - - Note: Should be greater than MESH_TARGET - - Impact: Prevents resource exhaustion while maintaining network connectivity - - Usage: Sets upper bound to control memory and bandwidth usage - -### Bootstrap and Identity Configuration - -- **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses - - Purpose: List of known peers for joining the mesh network - - Format: `/ip4//tcp//p2p/` - - Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` - - Usage: New nodes use these to discover and join the network - - Multiple: Can specify multiple peers separated by commas - - Note: At least one bootstrap peer must be accessible for network joining - -- **`IDENTITY_DIR`**: Node cryptographic identity directory - - Purpose: Directory containing node's P2P identity key (p2p.key) - - Default: `/identity` - - Usage: Only needed for bootstrap nodes, other nodes auto-generate identity - - Security: Contains private key material, should be properly secured - - Permissions: Ensure proper file permissions (600) for security - -### Configuration Notes - -All parameter values can be adjusted based on specific use case requirements. TWhen modifying parameters: - -- Higher OPTIMUM_THRESHOLD values improve reliability but increase latency -- Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources -- Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage -- OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET -- OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET - -## Starting the Network - -1. Generate peer identity (optional, will auto-generate if not present): -```bash -# Create identity directory -mkdir -p identity - -# Generate peer key -docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key -``` - -2. Set bootstrap peer ID: -```bash -export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest peer-id) -``` - -3. Start the network: -```bash -docker-compose up -d -``` - -4. Verify nodes are running: -```bash -docker-compose ps -docker-compose logs p2pnode-1 -``` - -## Client Connection - -Clients connect directly to P2P nodes via gRPC sidecar: - -```go -conn, err := grpc.Dial("localhost:33221", grpc.WithInsecure()) -if err != nil { - log.Fatal(err) -} -client := pb.NewP2PStreamClient(conn) -``` - -## Network Scaling - -To add more nodes, replicate the service definition with: -- Unique `CLUSTER_ID` -- Unique IP address in the network -- Unique port mappings -- Same `BOOTSTRAP_PEERS` configuration - -## Monitoring - -Access node metrics and status: -- Node 1: http://localhost:9091 -- Node 2: http://localhost:9092 - -## Troubleshooting - -### Peer Discovery Issues -Check bootstrap peer configuration and network connectivity: -```bash -docker-compose exec p2pnode-1 ping p2pnode-2 -docker-compose logs p2pnode-1 | grep "bootstrap" -``` - -### Mesh Formation -Verify peers are discovering each other: -```bash -curl http://localhost:9091/debug/peers -``` - -### Message Flow -Check message propagation in logs: -```bash -docker-compose logs -f | grep "message" -``` - -## See Also - -- [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters -- [P2P with Proxy Deployment](/docs/hackathon/deployment/p2p-with-proxy.md) - Alternative deployment with proxy layer -- [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide \ No newline at end of file diff --git a/docs/hackathon/deployment/p2p-with-proxy.md b/docs/hackathon/deployment/p2p-with-proxy.md deleted file mode 100644 index 3944368..0000000 --- a/docs/hackathon/deployment/p2p-with-proxy.md +++ /dev/null @@ -1,455 +0,0 @@ -# P2P Network with Proxy Deployment - -This guide covers deploying OptimumP2P with proxy services that provide HTTP/WebSocket/gRPC APIs for client applications. The proxy acts as a bridge between traditional client-server applications and the OptimumP2P network. - - -### Component Responsibilities - -**Proxy Layer:** -- Protocol translation (HTTP/WebSocket/gRPC ↔ libp2p) -- Client session management -- Load balancing across P2P nodes -- Rate limiting and authentication -- API versioning and compatibility - -**P2P Network Layer:** -- RLNC message encoding/decoding -- Mesh topology maintenance -- Peer discovery and routing -- Message propagation via GossipSub -- Network resilience and fault tolerance - - -## Deployment Configuration - -Complete setup with proxies and P2P nodes: - -```yaml -services: - proxy-1: - image: 'getoptimum/proxy:latest' - platform: linux/amd64 - ports: - - "8081:8080" # HTTP/WebSocket - - "50051:50051" # gRPC - environment: - - PROXY_PORT=:8080 - - CLUSTER_ID=proxy-1 - - ENABLE_AUTH=false - - LOG_LEVEL=debug - - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 - networks: - optimum-network: - ipv4_address: 172.28.0.10 - depends_on: - - p2pnode-1 - - p2pnode-2 - - p2pnode-3 - - p2pnode-4 - - proxy-2: - image: 'getoptimum/proxy:latest' - platform: linux/amd64 - ports: - - "8082:8080" - - "50052:50051" - environment: - - PROXY_PORT=:8080 - - CLUSTER_ID=proxy-2 - - ENABLE_AUTH=false - - LOG_LEVEL=debug - - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 - networks: - optimum-network: - ipv4_address: 172.28.0.11 - depends_on: - - p2pnode-1 - - p2pnode-2 - - p2pnode-3 - - p2pnode-4 - - p2pnode-1: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - volumes: - - ./identity:/identity - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-1 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - networks: - optimum-network: - ipv4_address: 172.28.0.12 - ports: - - "33221:33212" - - "7071:7070" - - "9091:9090" - - p2pnode-2: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-2 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - networks: - optimum-network: - ipv4_address: 172.28.0.13 - ports: - - "33222:33212" - - "7072:7070" - - "9092:9090" - - p2pnode-3: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-3 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - networks: - optimum-network: - ipv4_address: 172.28.0.14 - ports: - - "33223:33212" - - "7073:7070" - - "9093:9090" - - p2pnode-4: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-4 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - networks: - optimum-network: - ipv4_address: 172.28.0.15 - ports: - - "33224:33212" - - "7074:7070" - - "9094:9090" - -networks: - optimum-network: - driver: bridge - ipam: - config: - - subnet: 172.28.0.0/16 -``` - -## P2P Node Environment Variables - -### Core P2P Configuration - -- **`CLUSTER_ID`**: Unique identifier for each P2P node - - Purpose: Distinguishes nodes in logs, metrics, and network topology - - Usage: Should be unique across all P2P nodes in deployment - - Format: Alphanumeric string, typically `p2pnode-1`, `p2pnode-2`, etc. - - Required: Yes, no default value - -- **`NODE_MODE`**: P2P protocol implementation mode - - Purpose: Selects the underlying pub/sub protocol - - Values: `optimum` (RLNC-enhanced) or `gossipsub` (standard libp2p) - - Default: `optimum` - - Usage: Use `optimum` for better performance with RLNC coding - - Note: All nodes in network should use same mode for compatibility - -- **`SIDECAR_PORT`**: gRPC bidirectional communication port - - Purpose: Port where proxys and clients connect to interact with P2P node - - Default: `33212` - - Range: Any available port (1024-65535) - - Usage: Must be accessible from proxy containers for internal communication - - Network: Used for internal container-to-container communication - -- **`API_PORT`**: HTTP monitoring and management API port - - Purpose: Exposes REST endpoints for health checks, node state, and metrics - - Default: `8081` for proxy, `9090` for P2P nodes (varies by component) - - Endpoints: `/api/v1/health`, `/api/v1/node-state`, `/api/v1/version` - - Usage: Used for operational monitoring and debugging - -### Network Discovery Configuration - -- **`IDENTITY_DIR`**: Node cryptographic identity directory - - Purpose: Directory containing node's P2P identity key (p2p.key) - - Default: `/identity` - - Usage: Only needed for bootstrap nodes, other nodes auto-generate identity - - Security: Contains private key material, should be properly secured - -- **`BOOTSTRAP_PEERS`**: Initial peer discovery addresses - - Purpose: List of known peers for joining the mesh network - - Format: `/ip4//tcp//p2p/` - - Example: `/ip4/172.28.0.12/tcp/7070/p2p/12D3KooW...` - - Usage: New nodes use these to discover and join the network - - Multiple: Can specify multiple peers separated by commas - -### OptimumP2P Protocol Configuration - -- **`OPTIMUM_PORT`**: P2P protocol communication port - - Purpose: Port for peer-to-peer communication between nodes - - Default: `7070` - - Range: Any available port, commonly 7070-7080 - - Usage: Must be accessible between all P2P nodes in the mesh - - Network: Used for inter-node OptimumP2P protocol communication - -- **`OPTIMUM_MAX_MSG_SIZE`**: Maximum message size in bytes - - Purpose: Limits individual message size to prevent memory issues - - Default: `1048576` (1MB) - - Usage: Larger values allow bigger payloads but use more memory/bandwidth - -### RLNC (Random Linear Network Coding) Configuration - -- **`OPTIMUM_SHARD_FACTOR`**: Number of coded shards per message - - Purpose: Controls how many pieces each message is split into for RLNC - - Default: `4` - - Impact: Higher values increase redundancy and fault tolerance but use more bandwidth - - Note: Must be non-zero to enable RLNC functionality - -- **`OPTIMUM_SHARD_MULT`**: Shard size redundancy multiplier - - Purpose: Controls redundancy factor for error recovery - - Default: `1.5` - - Impact: Higher values improve error recovery but increase bandwidth usage - - Note: Values >1.0 add redundancy (e.g., 1.5 = 50% redundancy) - -- **`OPTIMUM_THRESHOLD`**: Forward/decode threshold ratio - - Purpose: Fraction of shards needed before forwarding or decoding message - - Default: `0.75` (75%) - - Validation: Must be between 0 and 1 (exclusive of 0, inclusive of 1) - - Impact: Critical for network performance tuning - - Note: Lower values reduce latency but may reduce reliability; higher values improve reliability but increase latency - -### Mesh Topology Configuration - -- **`OPTIMUM_MESH_TARGET`**: Target number of peer connections - - Purpose: Ideal number of peers each node connects to in the mesh - - Default: `6` - - Impact: Higher values increase redundancy and fault tolerance but use more resources - - Scaling: Adjust based on network size and reliability requirements - -- **`OPTIMUM_MESH_MIN`**: Minimum mesh peer connections - - Purpose: Minimum connections before attempting to add more peers - - Default: `4` - - Note: Should be less than `MESH_TARGET` - - Impact: Lower values reduce fault tolerance, higher values increase resource usage - - Usage: Prevents network partitioning by maintaining minimum connectivity - -- **`OPTIMUM_MESH_MAX`**: Maximum mesh peer connections - - Purpose: Maximum connections before pruning excess peers - - Default: `12` - - Note: Should be greater than `MESH_TARGET` - - Impact: Prevents resource exhaustion while maintaining network connectivity - - Usage: Sets upper bound to control memory and bandwidth usage - -### Configuration Notes - -All parameter values can be adjusted based on specific use case requirements. When modifying parameters: - -- Higher OPTIMUM_THRESHOLD values improve reliability but increase latency -- Higher OPTIMUM_MESH_TARGET values improve fault tolerance but use more resources -- Higher OPTIMUM_SHARD_FACTOR values improve redundancy but increase bandwidth usage -- OPTIMUM_MESH_MIN should be less than OPTIMUM_MESH_TARGET -- OPTIMUM_MESH_MAX should be greater than OPTIMUM_MESH_TARGET - -## Proxy Configuration - -### Environment Variables - -- **`PROXY_PORT`**: HTTP/WebSocket server port (default: `:8080`) - - Purpose: Defines the port where the proxy listens for client connections - - Usage: Internal container port for REST API and WebSocket connections - - Example: `:8080`, `:3000`, `:8081` - - Note: External port mapping is configured separately in docker-compose ports section - -- **`CLUSTER_ID`**: Unique proxy identifier - - Purpose: Distinguishes between multiple proxy instances in logs, metrics, and monitoring - - Usage: Should be unique across all proxy instances in your deployment - - Format: Alphanumeric string, no spaces - - Example: `proxy-1`, `proxy-primary`, `proxy-us-east` - - Required: Yes, no default value - -- **`ENABLE_AUTH`**: Enable Auth0 JWT authentication (true/false) - - Purpose: Controls whether API requests require JWT authentication - - Usage: Set to `false` for development/testing, `true` for production - - Values: `true` (requires valid JWT tokens) or `false` (open access) - - Default: `false` - - Note: When `true`, requires additional Auth0 configuration (AUTH0_DOMAIN, AUTH0_AUDIENCE) - -- **`P2P_NODES`**: Comma-separated list of P2P node gRPC sidecar addresses - - Purpose: Defines which P2P nodes the proxy can connect to for message routing - - Format: `hostname:port,hostname:port,...` - - Usage: Proxy load-balances requests across these nodes for high availability - - Port: Should match SIDECAR_PORT of P2P nodes (typically 33212) - - Example: `p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212` - - Behavior: Proxy attempts to connect to all listed nodes and routes to healthy ones - -- **`LOG_LEVEL`**: Logging verbosity level - - Purpose: Controls the amount and detail of log output - - Values: `debug`, `info`, `warn`, `error` - - Default: `info` - - Usage Guide: - - `debug`: Most verbose, includes request/response details, connection events (development) - - `info`: Standard production level with operational information - - `warn`: Only warnings and errors (quiet production) - - `error`: Only error messages (minimal logging) - - Performance: Higher verbosity may impact performance and storage - -### Authentication (Optional) -For production deployments, enable authentication: -```yaml -environment: - - ENABLE_AUTH=true - - AUTH0_DOMAIN=your-domain.auth0.com - - AUTH0_AUDIENCE=your-api-audience -``` - -## API Endpoints - -### HTTP REST API -- `POST /publish` - Publish message to topic -- `GET /health` - Proxy health check -- `GET /metrics` - Prometheus metrics - -### WebSocket API -- `ws://localhost:8081/ws` - WebSocket connection for real-time messaging - -### gRPC API -- `localhost:50051` - Bidirectional streaming service - -## Starting the Network - -1. Generate peer identity: -```bash -mkdir -p identity -export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key --output-peer-id) -``` - -2. Start all services: -```bash -docker-compose up -d -``` - -3. Verify services: -```bash -docker-compose ps -curl http://localhost:8081/health -``` - -## Client Examples - -### HTTP REST -```bash -curl -X POST http://localhost:8081/publish \ - -H "Content-Type: application/json" \ - -d '{"topic": "test", "data": "Hello OptimumP2P"}' -``` - -### WebSocket (JavaScript) -```javascript -const ws = new WebSocket('ws://localhost:8081/ws'); -ws.onopen = () => { - ws.send(JSON.stringify({ - type: 'subscribe', - topic: 'test' - })); -}; -``` - -### gRPC (Go) -```go -conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) -client := pb.NewProxyStreamClient(conn) -stream, err := client.Stream(context.Background()) -``` - -## Monitoring - -### Proxy Metrics -- Proxy 1: http://localhost:8081/metrics -- Proxy 2: http://localhost:8082/metrics - -### P2P Node Status -- Node 1: http://localhost:9091 -- Node 2: http://localhost:9092 -- Node 3: http://localhost:9093 -- Node 4: http://localhost:9094 - -## Scaling Considerations - -Scale the P2P network by adding more nodes: -- Maintain OPTIMUM_MESH_TARGET ratio to network size -- Consider network topology and latency -- Monitor mesh formation and message propagation - -## Troubleshooting - -### Proxy Connection Issues -```bash -# Check proxy logs -docker-compose logs proxy-1 - -# Test P2P node connectivity -docker-compose exec proxy-1 nc -zv p2pnode-1 33212 -``` - -### Message Delivery Issues -```bash -# Check message flow -docker-compose logs -f | grep -E "(publish|subscribe|message)" - -# Verify P2P mesh status -curl http://localhost:9091/debug/peers -``` - -## See Also - -- [GossipSub Configuration Guide](/docs/hackathon/configuration/gossipsub.md) - Detailed explanation of underlying pub/sub protocol parameters -- [P2P-Only Deployment](/docs/hackathon/deployment/p2p-only.md) - Alternative deployment without proxys -- [First Message Tutorial](/docs/hackathon/quick-start/first-message.md) - Step-by-step getting started guide diff --git a/docs/hackathon/overview.md b/docs/hackathon/overview.md deleted file mode 100644 index fcef6f6..0000000 --- a/docs/hackathon/overview.md +++ /dev/null @@ -1,62 +0,0 @@ -# OptimumP2P Quickstart & Developer Guide - -This guide walks you through everything you need to **understand**, **deploy**, **run**, and **experiment** with OptimumP2P. -It’s designed for beginners but complete enough for advanced developers to jump in and integrate. - -If you want deep technical theory, see the **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** — this guide stays hands-on. - - -## Table of Contents - -1. [What You’ll Build](#-what-youll-build): A high-level look at the system you’ll set up and the end goal. -2. [Prerequisites](#-prerequisites) -3. [Installation & Setup](#-installation--setup) -4. [Deploying the Network](#-deploying-the-network) -5. [Sending & Receiving Your First Message](#-sending--receiving-your-first-message) -6. [Multiple Topics & Isolation](#-multiple-topics--isolation) -7. [Load Testing](#-load-testing) -8. [Key Parameters Explained](#-key-parameters-explained) -9. [Monitoring & Debugging](#-monitoring--debugging) -10. [Cleanup & Reset](#-cleanup--reset) -11. [FAQ & Glossary](#-faq--glossary) -12. [Next Steps](#-next-steps) -13. [More Coming Soon](#-more-coming-soon) - - -## What You’ll Build - -By the end of this guide, you will have: - -* A **local OptimumP2P network** with 4 P2P nodes + 2 proxy servers -* The ability to **send and receive messages in real-time** over gRPC -* Support for **multiple topics** with complete isolation -* Tools for **load testing, debugging, and monitoring** - -## Prerequisites - -Before starting, make sure you have: - -* **Docker** ([Install here](https://www.docker.com/products/docker-desktop)) -* **Docker Compose** (comes with Docker Desktop) -* **Git** (optional, but recommended) -* **Go 1.24+** ([Install here](https://go.dev/dl/)) — only needed if running the Go client - -**Check your setup:** - -```bash -docker --version -docker-compose --version -go version -``` - -## Installation & Setup - -### **Create a working directory** - -```sh -mkdir optimump2p-hackathon && cd optimump2p-hackathon -``` - -1. **Prepare identity folder** - -The identity folder stores node peer IDs. diff --git a/docs/hackathon/quick-start/first-message.md b/docs/hackathon/quick-start/first-message.md deleted file mode 100644 index 9bc0da0..0000000 --- a/docs/hackathon/quick-start/first-message.md +++ /dev/null @@ -1,809 +0,0 @@ -# Your First Message - -This tutorial demonstrates how to send your first message through OptimumP2P using the proxy setup. We'll provide all the necessary configuration and code directly in this guide. - -## Prerequisites - -- Docker and Docker Compose installed -- Basic familiarity with terminal/command line -- Text editor for creating configuration files - -## Step 1: Set Up the Network - -### Step 1a: Create working directory - -```bash -mkdir optimump2p-test -``` - -### Step 1b: Navigate to directory - -```bash -cd optimump2p-test -``` - -### Step 1c: Create docker-compose.yml - -Create a `docker-compose.yml` file with the following content: - -```yaml -services: - proxy-1: - image: 'getoptimum/proxy:latest' - platform: linux/amd64 - ports: - - "8081:8080" # HTTP Port for the proxy - - "50051:50051" # gRPC Port for the proxy - environment: - - PROXY_PORT=:8080 - - CLUSTER_ID=proxy-1 - - ENABLE_AUTH=false - - LOG_LEVEL=debug - - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 - networks: - optimum-network: - ipv4_address: 172.28.0.10 - depends_on: - - p2pnode-1 - - p2pnode-2 - - p2pnode-3 - - p2pnode-4 - - proxy-2: - image: 'getoptimum/proxy:latest' - platform: linux/amd64 - ports: - - "8082:8080" # HTTP Port for the proxy - - "50052:50051" # gRPC Port for the proxy - environment: - - PROXY_PORT=:8080 - - CLUSTER_ID=proxy-2 - - ENABLE_AUTH=false - - LOG_LEVEL=debug - - P2P_NODES=p2pnode-1:33212,p2pnode-2:33212,p2pnode-3:33212,p2pnode-4:33212 - networks: - optimum-network: - ipv4_address: 172.28.0.11 - depends_on: - - p2pnode-1 - - p2pnode-2 - - p2pnode-3 - - p2pnode-4 - - p2pnode-1: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - volumes: - - ./identity:/identity - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-1 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - networks: - optimum-network: - ipv4_address: 172.28.0.12 - ports: - - "33221:33212" - - "7071:7070" - - "6061:6060" - - "9091:9090" - - p2pnode-2: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-1 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - networks: - optimum-network: - ipv4_address: 172.28.0.13 - ports: - - "33222:33212" - - "7072:7070" - - "6062:6060" - - "9092:9090" - - p2pnode-3: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-1 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - networks: - optimum-network: - ipv4_address: 172.28.0.14 - ports: - - "33223:33212" - - "7073:7070" - - "6063:6060" - - "9093:9090" - - p2pnode-4: - image: 'getoptimum/p2pnode:latest' - platform: linux/amd64 - environment: - - LOG_LEVEL=debug - - CLUSTER_ID=p2pnode-1 - - NODE_MODE=optimum - - SIDECAR_PORT=33212 - - API_PORT=9090 - - IDENTITY_DIR=/identity - - OPTIMUM_PORT=7070 - - OPTIMUM_MAX_MSG_SIZE=1048576 - - OPTIMUM_MESH_TARGET=6 - - OPTIMUM_MESH_MIN=3 - - OPTIMUM_MESH_MAX=12 - - OPTIMUM_SHARD_FACTOR=4 - - OPTIMUM_SHARD_MULT=1.5 - - OPTIMUM_THRESHOLD=0.75 - - BOOTSTRAP_PEERS=/ip4/172.28.0.12/tcp/7070/p2p/${BOOTSTRAP_PEER_ID} - networks: - optimum-network: - ipv4_address: 172.28.0.15 - ports: - - "33224:33212" - - "7074:7070" - - "6064:6060" - - "9094:9090" - -networks: - optimum-network: - driver: bridge - ipam: - config: - - subnet: 172.28.0.0/16 -``` - -## Step 2: Start the Network - -### Step 2a: Generate peer identity - -```bash -# Create identity directory if using local setup -mkdir -p identity -``` - -### Step 2b: Set environment variable - -```bash -# Set the bootstrap peer ID environment variable -export BOOTSTRAP_PEER_ID=12D3KooWExample # This will be generated automatically -``` - -### Step 2c: Start all services - -```bash -docker-compose up -d -``` - -### Step 2d: Verify services are running - -```bash -docker-compose ps -``` - -You should see containers for: -- proxy-1 (port 8081) -- proxy-2 (port 8082) -- p2pnode-1, p2pnode-2, p2pnode-3, p2pnode-4 - -## Step 3: Test Proxy Connectivity - -Before we start sending messages, let's make sure the proxy services are working correctly. The proxy provides REST API endpoints for publishing and subscribing to messages. - -### Step 3a: Test First Proxy - -Test the connection to proxy-1: - -```bash -# Test proxy-1 (should return HTTP headers if working) -curl -I http://localhost:8081 -``` - -**Expected output:** You should see HTTP response headers starting with `HTTP/1.1 200 OK` or similar. - -### Step 3b: Test Second Proxy - -Test the connection to proxy-2: - -```bash -# Test proxy-2 (should return HTTP headers if working) -curl -I http://localhost:8082 -``` - -**Expected output:** Similar HTTP response headers, confirming both proxies are running. - -**Troubleshooting:** If you get "connection refused" errors, check that your Docker containers are running with `docker-compose ps`. - -## Step 4: Create the Proxy Client - -Let's create a Go client application that makes it easy to interact with the proxy. - -### Step 4a: Create client directory - -```bash -mkdir grpc_proxy_client -cd grpc_proxy_client -``` - -### Step 4b: Initialize Go module - -```bash -go mod init proxy_client -``` - -### Step 4c: Add dependencies - -```bash -go get google.golang.org/grpc -go get google.golang.org/protobuf -``` - -### Step 4d: Create protobuf definition - -Create a `proto/proxy_stream.proto` file: - -```bash -mkdir proto -``` - -Create `proto/proxy_stream.proto` with this content: - -```protobuf -syntax = "proto3"; - -package proto; - -option go_package = "optimum-proxy/proto;proto"; - -service ProxyStream { - rpc ClientStream (stream ProxyMessage) returns (stream ProxyMessage); -} - -message ProxyMessage { - string client_id = 1; - bytes message = 2; - string topic = 3; - string message_id = 4; - string type = 5; -} -``` - -### Step 4e: Generate protobuf code - -```bash -mkdir grpc -protoc --go_out=grpc --go-grpc_out=grpc proto/proxy_stream.proto -``` - -### Step 4f: Create the client code - -Create `proxy_client.go` with this content: - -```go -package main - -import ( - "bytes" - "context" - crand "crypto/rand" - "encoding/hex" - "encoding/json" - "flag" - "fmt" - "io" - "log" - "math" - "math/rand" - "net/http" - "os" - "os/signal" - "time" - - protobuf "proxy_client/grpc" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/keepalive" -) - -const ( - proxyREST = "http://localhost:8081" - proxyGRPC = "localhost:50051" - defaultTopic = "demo" - defaultThreshold = 0.1 - defaultMsgCount = 5 - defaultDelay = 2 * time.Second -) - -var ( - topic = flag.String("topic", defaultTopic, "topic name") - threshold = flag.Float64("threshold", defaultThreshold, "delivery threshold (0.0 to 1.0)") - subscribeOnly = flag.Bool("subscribeOnly", false, "only subscribe and receive messages (no publishing)") - messageCount = flag.Int("count", defaultMsgCount, "number of messages to publish") - messageDelay = flag.Duration("delay", defaultDelay, "delay between message publishing") - - keepaliveTime = flag.Duration("keepalive-interval", 2*time.Minute, "gRPC keepalive interval") - keepaliveTimeout = flag.Duration("keepalive-timeout", 20*time.Second, "gRPC keepalive timeout") - - words = []string{"hello", "ping", "update", "broadcast", "status", "message", "event", "data", "note"} -) - -func main() { - flag.Parse() - - clientID := generateClientID() - log.Printf("[INFO] Client ID: %s | Topic: %s | Threshold: %.2f", clientID, *topic, *threshold) - - if err := subscribe(clientID, *topic, *threshold); err != nil { - log.Fatalf("subscribe error: %v", err) - } - - conn, err := grpc.NewClient(proxyGRPC, - grpc.WithTransportCredentials(insecure.NewCredentials()), - grpc.WithInitialWindowSize(1024*1024*1024), - grpc.WithInitialConnWindowSize(1024*1024*1024), - grpc.WithDefaultCallOptions( - grpc.MaxCallRecvMsgSize(math.MaxInt), - grpc.MaxCallSendMsgSize(math.MaxInt), - ), - grpc.WithKeepaliveParams(keepalive.ClientParameters{ - Time: *keepaliveTime, - Timeout: *keepaliveTimeout, - PermitWithoutStream: false, - }), - ) - if err != nil { - log.Fatalf("gRPC connection failed: %v", err) - } - defer conn.Close() - - client := protobuf.NewProxyStreamClient(conn) - stream, err := client.ClientStream(context.Background()) - if err != nil { - log.Fatalf("stream open failed: %v", err) - } - - if err := stream.Send(&protobuf.ProxyMessage{ClientId: clientID}); err != nil { - log.Fatalf("client ID send failed: %v", err) - } - - go func() { - for { - resp, err := stream.Recv() - if err == io.EOF { - log.Println("[CLOSED] gRPC stream closed by server") - return - } - if err != nil { - log.Printf("[ERROR] stream receive: %v", err) - return - } - log.Printf("[RECEIVED] Topic: %s | Message: %s", resp.Topic, string(resp.Message)) - } - }() - - c := make(chan os.Signal, 1) - signal.Notify(c, os.Interrupt) - go func() { - <-c - log.Println("[INTERRUPTED] shutting down...") - os.Exit(0) - }() - - if *subscribeOnly { - select {} - } - - for i := 0; i < *messageCount; i++ { - msg := generateRandomMessage() - log.Printf("[PUBLISH] Message: %s", msg) - if err := publishMessage(clientID, *topic, msg); err != nil { - log.Printf("[ERROR] publish failed: %v", err) - } - time.Sleep(*messageDelay) - } - - time.Sleep(3 * time.Second) -} - -func subscribe(clientID, topic string, threshold float64) error { - body := map[string]interface{}{ - "client_id": clientID, - "topic": topic, - "threshold": threshold, - } - data, _ := json.Marshal(body) - resp, err := http.Post(proxyREST+"/api/subscribe", "application/json", bytes.NewReader(data)) - if err != nil { - return err - } - defer resp.Body.Close() - io.Copy(io.Discard, resp.Body) - return nil -} - -func publishMessage(clientID, topic, msg string) error { - body := map[string]interface{}{ - "client_id": clientID, - "topic": topic, - "message": msg, - } - data, _ := json.Marshal(body) - resp, err := http.Post(proxyREST+"/api/publish", "application/json", bytes.NewReader(data)) - if err != nil { - return err - } - defer resp.Body.Close() - io.Copy(io.Discard, resp.Body) - return nil -} - -func generateClientID() string { - b := make([]byte, 4) - _, _ = crand.Read(b) - return "client_" + hex.EncodeToString(b) -} - -func generateRandomMessage() string { - return fmt.Sprintf("%s @ %s", words[rand.Intn(len(words))], time.Now().Format("15:04:05")) -} -``` - -### Step 4g: Build the client - -```bash -go build -o proxy-client ./proxy_client.go -``` - -## Step 5: Subscribe to Messages - -Now we'll set up a message subscriber. This is like tuning into a radio station - once subscribed, you'll receive all messages published to that topic. - -### Step 5a: Open a New Terminal - -Open a **new terminal window** and navigate to your project directory: - -```bash -# Make sure you're in the right directory -cd optimump2p-test -``` - -### Step 5b: Start the Subscriber - -In this terminal, start listening for messages: - -```bash -# Subscribe to topic "demo" with threshold 0.7 -./proxy-client -topic=demo -threshold=0.7 -subscribeOnly -``` - -**What this command does:** -- `subscribe`: Tells the client to listen for messages -- `demo`: The topic name we're subscribing to -- `0.7`: The threshold value (higher = more reliable message reconstruction) - -### Step 5c: Understand the Subscriber Output - -The subscriber will: -1. **Register** with the proxy via REST API (`/api/subscribe`) -2. **Open** a gRPC stream to receive messages in real-time -3. **Display** received messages in the format: `[RECEIVED] Topic: | Message: ` - -**Keep this terminal open** - it will show incoming messages as they arrive. - -## Step 6: Publish Messages - -Now let's send some messages! We'll use a second terminal to publish messages while watching them appear in the subscriber terminal. - -### Step 6a: Open Another Terminal - -Open a **second new terminal window** and navigate to your project directory: - -```bash -# Navigate to the project directory -cd optimump2p-test -``` - -### Step 6b: Send Messages - -Publish messages to the same topic: - -```bash -# Publish 5 messages to topic "demo" with threshold 0.5 -./proxy-client -topic=demo -threshold=0.5 -count=5 -``` - -**What this command does:** -- `publish`: Tells the client to send messages -- `demo`: The topic name (must match the subscriber's topic) -- `0.5`: The threshold for message encoding -- `5`: Number of messages to send - -### Step 6c: Watch the Results - -The publisher will: -1. **Send** messages via REST API (`/api/publish`) -2. **Display** each published message in the format: `[PUBLISH] Message: ` - -**In your subscriber terminal** (from Step 5), you should see the messages being received in real-time. - -### Step 6d: Verify Message Flow - -Check that: -- The **publisher terminal** shows: `[PUBLISH] Message: Message 1`, `[PUBLISH] Message: 2`, etc. -- The **subscriber terminal** shows: `[RECEIVED] Topic: demo | Message: Message 1`, etc. - -This confirms that messages are flowing correctly through the OptimumP2P network! - -## Step 7: Alternative REST API Usage - -You can also interact directly with the REST API using curl: - -```bash -curl -X POST http://localhost:8081/api/subscribe \ - -H "Content-Type: application/json" \ - -d '{ - "client_id": "test_client_001", - "topic": "demo", - "threshold": 0.7 - }' -``` - -**What this does:** -- **POST request** to the subscription endpoint -- **client_id**: Unique identifier for your client -- **topic**: The topic you want to subscribe to -- **threshold**: Message reliability setting - -**Important note:** This only registers the subscription. To actually receive messages, you'd need to separately open a gRPC stream (which the script handles automatically). - -### Step 7c: Publish via REST API - -Send a message using a direct HTTP request: - -```bash -curl -X POST http://localhost:8081/api/publish \ - -H "Content-Type: application/json" \ - -d '{ - "client_id": "test_client_001", - "topic": "demo", - "message": "Hello from REST API" - }' -``` - -**What this does:** -- **POST request** to the publish endpoint -- **client_id**: Same client ID as used for subscription -- **topic**: Must match your subscription topic -- **message**: The actual message content to send - -### Step 7d: Test the REST API - -To see this working: - -1. **Keep your subscriber running** from Step 5 (if still open) -2. **Run the publish curl command** from Step 7c -3. **Check your subscriber terminal** - you should see: `[RECEIVED] Topic: demo | Message: Hello from REST API` - -This demonstrates that REST API publishing works with script-based subscribing (and vice versa). - -## Step 8: Multiple Topics - -OptimumP2P supports multiple topics running simultaneously. This means different applications or message types can be isolated from each other. Let's test this feature by setting up multiple subscribers and publishers. - -### Step 8a: Open Multiple Terminal Windows - -You'll need **4 separate terminal windows** for this test. Each terminal should be in your project directory: - -```bash -# In each new terminal, navigate to your project directory -cd optimump2p-test -``` - -### Step 8b: Set Up First Topic Subscriber - -In **Terminal 1**, subscribe to the "weather" topic: - -```bash -# This will listen for weather-related messages -./proxy-client -topic=weather -threshold=0.7 -subscribeOnly -``` - -**What this does:** Creates a subscriber that will only receive messages published to the "weather" topic. - -### Step 8c: Set Up Second Topic Subscriber - -In **Terminal 2**, subscribe to the "news" topic: - -```bash -# This will listen for news-related messages -./proxy-client -topic=news -threshold=0.7 -subscribeOnly -``` - -**What this does:** Creates a second subscriber for a completely different topic. This subscriber won't see weather messages. - -### Step 8d: Publish to Weather Topic - -In **Terminal 3**, publish messages to the weather topic: - -```bash -# Send 3 weather messages -./proxy-client -topic=weather -threshold=0.5 -count=3 -``` - -**Expected result:** Only Terminal 1 (weather subscriber) should show these messages. Terminal 2 (news subscriber) should remain quiet. - -### Step 8e: Publish to News Topic - -In **Terminal 4**, publish messages to the news topic: - -```bash -# Send 3 news messages -./proxy-client -topic=news -threshold=0.5 -count=3 -``` - -**Expected result:** Only Terminal 2 (news subscriber) should show these messages. Terminal 1 (weather subscriber) should not see them. - -### Step 8f: Verify Topic Isolation - -Check that each subscriber only received messages from their subscribed topic: - -- **Terminal 1** should show: `[RECEIVED] Topic: weather | Message: ...` -- **Terminal 2** should show: `[RECEIVED] Topic: news | Message: ...` - -This demonstrates that topics are completely isolated from each other. - -## Step 9: Load Testing - -Now let's test how the network handles high message volumes. This helps you understand the performance characteristics of OptimumP2P. - -### Step 9a: Prepare for Load Testing - -First, make sure you have a subscriber running to see the messages: - -```bash -# In a new terminal, subscribe to the performance topic -./proxy-client -topic=performance -threshold=0.7 -subscribeOnly -``` - -### Step 9b: Medium Load Test - -Start with a moderate load test: - -```bash -# Send 100 messages with 100ms delay between each -./proxy-client -topic=performance -threshold=0.5 -count=100 -delay=100ms -``` - -**What this does:** Sends 100 messages over about 10 seconds (100ms × 100 = 10 seconds). - -### Step 9c: High Load Test - -For a more intensive test: - -```bash -# Send 1000 messages with 10ms delay (very fast) -./proxy-client -topic=stress -threshold=0.5 -count=1000 -delay=10ms -``` - -**What this does:** Sends 1000 messages over about 10 seconds (10ms × 1000 = 10 seconds). - -**Note:** Make sure to set up a subscriber for the "stress" topic if you want to see these messages being received. - -## Understanding the Parameters - -### Threshold -The threshold parameter (0.0 to 1.0) controls RLNC decoding: -- Lower values: Messages decoded with fewer shards (faster, less reliable) -- Higher values: Messages require more shards (slower, more reliable) -- Typical range: 0.5 to 0.8 - -### Client ID -Each client needs a unique identifier for the proxy to track subscriptions and route messages correctly. - -### Topic Names -- Case-sensitive strings -- No special characters recommended -- Use descriptive names (e.g., "chat", "alerts", "data-feed") - -## Monitoring and Debugging - -### View logs -```bash -# Proxy logs -docker-compose logs -f proxy-1 - -# P2P node logs -docker-compose logs -f p2pnode-1 - -# All logs -docker-compose logs -f -``` - -### Check network connectivity -```bash -# Test P2P node connectivity -docker-compose exec proxy-1 nc -zv p2pnode-1 33212 - -# View container network -docker network inspect optimump2p-test_optimum-network -``` - -## Cleanup - -Stop and remove all containers: - -```bash -docker-compose down - -# Remove volumes and images (optional) -docker-compose down -v --rmi all -``` - -## Next Steps - -Now that you've successfully sent messages through OptimumP2P: - -1. **Build custom clients**: Explore the [mump2p-cli](../clients/mump2p-cli.md) or [gRPC Client Examples](../clients/grpc-examples.md) -2. **Optimize configuration**: Learn about [OptimumP2P Configuration](../configuration/optimump2p.md) -3. **Compare protocols**: Review [GossipSub Configuration](../configuration/gossipsub.md) - -## Troubleshooting - -### Build failures -- Ensure Go is installed: `go version` -- Check module dependencies: `go mod tidy` - -### Connection issues -- Verify Docker containers are running: `docker-compose ps` -- Check port availability: `netstat -an | grep 8081` -- Review firewall settings - -### Message delivery issues -- Verify topic names match exactly -- Check threshold values are between 0.0 and 1.0 -- Review proxy and P2P node logs for errors - -### Performance issues -- Monitor container resources: `docker stats` -- Adjust message delay parameters -- Check network bandwidth and latency \ No newline at end of file diff --git a/docs/hackathon/quick-start/installation.md b/docs/hackathon/quick-start/installation.md deleted file mode 100644 index 858601c..0000000 --- a/docs/hackathon/quick-start/installation.md +++ /dev/null @@ -1,80 +0,0 @@ -# Installation & Setup - -This guide will help you install and set up OptimumP2P on your computer. We'll explain each step clearly, so don't worry if you're new to some of these tools. - -## What You'll Need - -Before we start, you need these programs on your computer: - -### 1. Docker -Docker is like a virtual container that runs applications in an isolated environment. Think of it as a box where we put our OptimumP2P network so it doesn't interfere with other programs on your computer. - -**Install Docker:** -- **Windows/Mac**: Download Docker Desktop from [docker.com](https://www.docker.com/products/docker-desktop/) -- **Linux**: Follow the instructions for your distribution on [docs.docker.com](https://docs.docker.com/engine/install/) - -**How to check if Docker is installed:** -Open your terminal (Command Prompt on Windows, Terminal on Mac/Linux) and type: -```bash -docker --version -``` - - -### 2. Docker Compose -Docker Compose helps us run multiple Docker containers together. It usually comes with Docker Desktop, but let's verify: - -```bash -docker-compose --version -``` - - -### 3. Git (Optional but recommended) -Git helps you download and manage code. Most computers have it pre-installed. - -```bash -git --version -``` - -## Getting the Code - -The OptimumP2P setup files are provided directly in this documentation. You'll create the necessary configuration files as part of the tutorial steps. - -All required configurations and code snippets are included in the [Quick Start Guide](./first-message.md) - no external repositories needed! - -## Troubleshooting - -### "Docker command not found" -- Make sure Docker is installed and running -- On Windows/Mac, start Docker Desktop application -- You might need to restart your terminal after installation - -### "Permission denied" on Linux -Add your user to the docker group: -```bash -sudo usermod -aG docker $USER -``` -Then log out and log back in. - -### "Port already in use" -If you see port conflicts, either: -- Stop other programs using those ports -- Change the port numbers in the docker-compose.yml file - -### Still having issues? -- Check Docker's own troubleshooting guide -- Make sure you have enough disk space (at least 2GB free) -- Restart your computer and try again - -## System Requirements - -**Minimum:** -- 4GB RAM -- 2GB free disk space -- Internet connection for downloading Docker images - -**Recommended:** -- 8GB RAM -- 5GB free disk space -- Stable internet connection - -You're now ready to start your OptimumP2P journey! \ No newline at end of file diff --git a/index.md b/index.md index 0d9e8a9..6750a5e 100644 --- a/index.md +++ b/index.md @@ -20,12 +20,12 @@ features: details: Learn more about Optimum, the various components involved, and how it could benefit your project. link: /docs/learn/overview/intro icon: 🎓 - - title: Research - details: Access resources for understanding the inner workings of Optimum and the research behind the technology. - link: /docs/research/overview - icon: 🔎 - title: Quickstart & Developer Guide details: Complete guide for building applications on OptimumP2P with deployment options, client examples, and configuration. link: /docs/guides/overview icon: 🚀 + - title: Research + details: Access resources for understanding the inner workings of Optimum and the research behind the technology. + link: /docs/research/overview + icon: 🔎 --- From fd9edd9aded5be2c756faf1ab079d8b772801193 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Thu, 14 Aug 2025 08:28:25 +0200 Subject: [PATCH 22/46] fix: improve the experiment guide --- docs/guides/04-experiments.md | 95 +++++++++++++++++------------------ 1 file changed, 45 insertions(+), 50 deletions(-) diff --git a/docs/guides/04-experiments.md b/docs/guides/04-experiments.md index 668200d..d0e3375 100644 --- a/docs/guides/04-experiments.md +++ b/docs/guides/04-experiments.md @@ -17,104 +17,99 @@ You can run them using: -## 1. Shard Factor Sweep +## 1. GossipSub vs OptimumP2P -**Goal:** See how the number of coded shards affects reliability and CPU usage in `NODE_MODE=optimum`. +**Goal:** Compare standard libp2p gossip to RLNC-enhanced gossip to confirm OptimumP2P is faster. **How:** -* Vary `OPTIMUM_SHARD_FACTOR` (e.g., 2, 4, 8, 16). -* Keep all other parameters the same. -* Publish the same message in each run. +* Run one cluster with `NODE_MODE=gossipsub`. +* Run another with `NODE_MODE=optimum`. +* Publish the same workload to both networks. **Observe:** -* Delivery success rate. -* Decode latency. -* CPU load. +* **Delivery latency** (primary metric - OptimumP2P should be faster) +* **Bandwidth usage** (OptimumP2P should use less) +* **Success rate** (both should deliver messages successfully) +**Expected Result:** OptimumP2P should show lower latency and bandwidth usage. -## 2. Forward Threshold Tuning -**Goal:** Measure latency vs reliability trade-off when forwarding coded shards early. +## 2. Shard Factor Sweep + +**Goal:** Find the optimal number of coded shards for your message size and network. **How:** -* Fix `OPTIMUM_SHARD_FACTOR=8`. -* Test `OPTIMUM_THRESHOLD` at 0.5, 0.75, 0.9. -* Publish bursts of small messages. +* Use powers of 2: `OPTIMUM_SHARD_FACTOR` = 2, 4, 8, 16, 32, 64. +* Keep all other parameters the same. +* Test with 1MB messages. **Observe:** -* End-to-end latency. -* Percentage of successful decodes. +* **Delivery latency** (primary metric) +* **Success rate** (messages should still deliver) + +**Expected Result:** Sweet spot around 32 shards for 1MB messages. Too few or too many shards both worsen performance. -## 3. Mesh Density Impact +## 3. Forward Threshold Tuning -**Goal:** Compare performance with sparse vs dense peer meshes. +**Goal:** Find the optimal threshold for forwarding coded shards early. **How:** -* Change `*_MESH_TARGET` (e.g., 4 vs 12). -* Run the same publish/subscribe test. +* Fix `OPTIMUM_SHARD_FACTOR=8`. +* Test `OPTIMUM_THRESHOLD` at 0.5, 0.7, 0.9, 1.0. +* Publish small messages in a 20-30 node network. **Observe:** -* Average hop count. -* Delivery latency. -* Duplicate message rate. +* **Delivery latency** (primary metric) +* **Bandwidth usage** (threshold=1.0 should use most bandwidth) + +**Expected Result:** Sweet spot around 0.7 for small networks. Too low = delivery failures, too high = high bandwidth and worse latency. -## 4. GossipSub vs OptimumP2P +## 4. Mesh Density Impact -**Goal:** Compare standard libp2p gossip to RLNC-enhanced gossip in the same environment. +**Goal:** Compare OptimumP2P vs GossipSub with different mesh sizes. **How:** -* Run one cluster with `NODE_MODE=gossipsub`. -* Run another with `NODE_MODE=optimum`. -* Publish the same workload. +* Test both `NODE_MODE=gossipsub` and `NODE_MODE=optimum`. +* For GossipSub: try `GOSSIPSUB_MESH_TARGET` = 4, 6, 8. +* For OptimumP2P: try `OPTIMUM_MESH_TARGET` = 6, 12, 18. +* Run the same publish/subscribe test. **Observe:** -* First-receiver latency. -* All-receivers latency. -* Bandwidth usage. -* Loss resilience. +* **Delivery latency** (primary metric) +* **Bandwidth usage** +**Expected Result:** OptimumP2P should perform better with higher mesh targets (around 12) while GossipSub optimal around 6. -## 5. Proxy + P2P vs Direct P2P -**Goal:** See if using OptimumProxy improves delivery for your setup. -**How:** -* Deploy once with Proxy in front of P2P nodes. -* Deploy once with clients connecting directly to nodes. -* Run the same test in both setups. -**Observe:** +## 5. Load Test -* Client receive time. -* Bandwidth usage. -* Proxy CPU load. - - -## 6. Load Test - -**Goal:** Find the throughput limit of your network. +**Goal:** Find when OptimumP2P vs GossipSub starts to fail under stress. **How:** -* Gradually increase message rate (e.g., 10 → 1,000 msg/s). +* Test both `NODE_MODE=gossipsub` and `NODE_MODE=optimum`. +* Vary **message size** (1KB → 10MB) and **message frequency** (1 → 1000 msg/s). * Use multiple publishers if needed. **Observe:** -* Latency growth. -* Message loss rate. -* Node CPU/memory usage. +* **When delivery starts to fail** (primary metric) +* **Delivery rate degradation** + +**Expected Result:** OptimumP2P should handle higher stress levels before failing compared to GossipSub. > **Tip:** Enable protocol traces in the gRPC client to get hop-by-hop delivery info: From 137360d6170158bfad388c0e4d42335b15ae7460 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Fri, 15 Aug 2025 21:03:03 +0530 Subject: [PATCH 23/46] feat: add one command for installation of CLI --- docs/guides/01-getting-started-cli.md | 32 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/docs/guides/01-getting-started-cli.md b/docs/guides/01-getting-started-cli.md index f5f0364..ad29bf2 100644 --- a/docs/guides/01-getting-started-cli.md +++ b/docs/guides/01-getting-started-cli.md @@ -83,25 +83,33 @@ Without authentication, you can only use **open/public topics** with strict limi * Your client receives fully decoded messages in real-time. -## 1. Download the CLI +## 1. Install mump2p CLI -Always grab the latest release from GitHub: +### Quick Install (One Command) -### Linux +```bash +curl -sSL https://raw.githubusercontent.com/getoptimum/mump2p-cli/main/install.sh | bash +``` -```sh -LATEST=$(curl -s https://api.github.com/repos/getoptimum/mump2p-cli/releases/latest | grep "tag_name" | cut -d '"' -f 4) -curl -L -o mump2p https://github.com/getoptimum/mump2p-cli/releases/download/$LATEST/mump2p-linux -chmod +x mump2p +This automatically: +* Detects your OS (Linux/macOS) +* Downloads the latest release +* Sets correct permissions +* Verifies installation works -``` +### Manual Install + +If you prefer manual installation: + +| OS | Command | +|---|---| +| **Linux** | `curl -L -o mump2p https://github.com/getoptimum/mump2p-cli/releases/latest/download/mump2p-linux && chmod +x mump2p` | +| **macOS** | `curl -L -o mump2p https://github.com/getoptimum/mump2p-cli/releases/latest/download/mump2p-mac && chmod +x mump2p` | -### macOS +### Verify Installation ```bash -LATEST=$(curl -s https://api.github.com/repos/getoptimum/mump2p-cli/releases/latest | grep "tag_name" | cut -d '"' -f 4) -curl -L -o mump2p https://github.com/getoptimum/mump2p-cli/releases/download/$LATEST/mump2p-darwin -chmod +x mump2p +./mump2p version ``` You can visit [mump2p-cli release page](https://github.com/getoptimum/mump2p-cli/releases) for the latest version. From 5964fc71c4de23f7a3973b4c3c7e4ce5f4f9489b Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Fri, 15 Aug 2025 21:12:52 +0530 Subject: [PATCH 24/46] fix: lint --- docs/guides/01-getting-started-cli.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/guides/01-getting-started-cli.md b/docs/guides/01-getting-started-cli.md index ad29bf2..dbd2269 100644 --- a/docs/guides/01-getting-started-cli.md +++ b/docs/guides/01-getting-started-cli.md @@ -92,6 +92,7 @@ curl -sSL https://raw.githubusercontent.com/getoptimum/mump2p-cli/main/install.s ``` This automatically: + * Detects your OS (Linux/macOS) * Downloads the latest release * Sets correct permissions From dc631383abe6e6016d4bd9bece78c9a79bf65838 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Sat, 16 Aug 2025 13:19:44 +0530 Subject: [PATCH 25/46] fix: correct numbers in experiments --- docs/guides/04-experiments.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guides/04-experiments.md b/docs/guides/04-experiments.md index d0e3375..8295b33 100644 --- a/docs/guides/04-experiments.md +++ b/docs/guides/04-experiments.md @@ -42,7 +42,7 @@ You can run them using: **How:** -* Use powers of 2: `OPTIMUM_SHARD_FACTOR` = 2, 4, 8, 16, 32, 64. +* Test range: `OPTIMUM_SHARD_FACTOR` = 2, 4, 8, 16, 32, 64 (powers of 2 recommended). * Keep all other parameters the same. * Test with 1MB messages. @@ -51,7 +51,7 @@ You can run them using: * **Delivery latency** (primary metric) * **Success rate** (messages should still deliver) -**Expected Result:** Sweet spot around 32 shards for 1MB messages. Too few or too many shards both worsen performance. +**Expected Result:** For 1MB messages, shard factors 4-8 typically provide the best balance of performance and reliability. Too few shards (≤2) cause delivery failures, while too many shards (≥32) increase latency due to overhead. Start with shard factor 4-8 and tune based on your network conditions. ## 3. Forward Threshold Tuning @@ -69,7 +69,7 @@ You can run them using: * **Delivery latency** (primary metric) * **Bandwidth usage** (threshold=1.0 should use most bandwidth) -**Expected Result:** Sweet spot around 0.7 for small networks. Too low = delivery failures, too high = high bandwidth and worse latency. +**Expected Result:** Threshold 0.7 provides optimal performance for small networks - delivering 100% success rate with lowest latency. Thresholds below 0.6 may cause delivery failures, while values above 0.8 can reduce success rate and increase latency. ## 4. Mesh Density Impact From d08abd712203094cd0b10334176346029377c536 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Sun, 17 Aug 2025 13:28:16 +0530 Subject: [PATCH 26/46] feat: add command output for CLI --- docs/guides/01-getting-started-cli.md | 172 +++++++++++++++++++++----- 1 file changed, 141 insertions(+), 31 deletions(-) diff --git a/docs/guides/01-getting-started-cli.md b/docs/guides/01-getting-started-cli.md index dbd2269..59488e7 100644 --- a/docs/guides/01-getting-started-cli.md +++ b/docs/guides/01-getting-started-cli.md @@ -2,14 +2,12 @@ The `mump2p` CLI is the quickest way to interact with [OptimumP2P](https://github.com/getoptimum/optimum-p2p) without running your own infrastructure. -In the next 5 minutes, you’ll have: +In the next 5 minutes, you'll have: * A working CLI * Your first published message * A subscription feeding you live data - - The `mump2p` CLI is your shortcut into `OptimumP2P` — a high-performance, RLNC-enhanced peer-to-peer network. Instead of: @@ -18,10 +16,9 @@ Instead of: * Handling low-level peer discovery and connection logic * Managing complex network and encoding configurations -The `mump2p` CLI connects you directly to our hosted `optimum-proxy` (available in multiple regions) and start sending or receiving messages instantly. +The `mump2p` CLI connects you directly to our hosted `optimum-proxy` (available in multiple regions) and start sending or receiving messages instantly. It connects to an `optimum-proxy` and lets you publish and subscribe to real-time topics — with authentication, usage tracking, and advanced delivery options. - ## Why Optimum Proxy? OptimumP2P is a **peer-to-peer network** where nodes exchange messages over a `RLNC-enhanced` pubsub mesh. @@ -49,11 +46,11 @@ Authentication in `mump2p-cli` is not just about logging in, it enables: * **Rate Limits**: Prevents spam and ensures fair use. * **Usage Tracking**: Monitor your publish/subscription stats. * **Account Linking**: Associate activity with your user or team. - + Without authentication, you can only use **open/public topics** with strict limits. ## How It Fits into the Network - + ```plaintext ┌──────────────┐ ┌────────────────┐ ┌─────────────────────────────┐ │ mump2p CLI │───▶ │ Optimum Proxy │───▶ │ OptimumP2P Network │ @@ -82,7 +79,6 @@ Without authentication, you can only use **open/public topics** with strict limi * Mesh uses RLNC for efficient message delivery and reconstruction. * Your client receives fully decoded messages in real-time. - ## 1. Install mump2p CLI ### Quick Install (One Command) @@ -113,13 +109,19 @@ If you prefer manual installation: ./mump2p version ``` +**Output:** +```bash +Version: v0.0.1-rc3-rc +Commit: 5962e6a +``` + You can visit [mump2p-cli release page](https://github.com/getoptimum/mump2p-cli/releases) for the latest version. --- ### 2. Authenticate -*mump2p-cli currently usage [auth0](https://auth0.com/) to manage authentication/authorization*. +*mump2p-cli currently uses [auth0](https://auth0.com/) to manage authentication/authorization*. Login via device authorization flow: @@ -127,6 +129,21 @@ Login via device authorization flow: ./mump2p login ``` +**Output:** +```bash +Initiating authentication... + +To complete authentication: +1. Visit: https://your-auth-domain.auth0.com/activate?user_code=XXXX-XXXX +2. Or go to https://your-auth-domain.auth0.com/activate and enter code: XXXX-XXXX +3. This code expires in 15 minutes + +Waiting for you to complete authentication in the browser... + +✅ Successfully authenticated +Token expires at: 18 Aug 25 13:15 IST +``` + 1. CLI shows a URL and a code. 2. Open the URL in your browser. 3. Enter the code to complete authentication. @@ -138,28 +155,25 @@ Login via device authorization flow: ./mump2p whoami ``` -You will see the response in terminal as following: - -```sh +**Output:** +```bash Authentication Status: ---------------------- -Client ID: USER_CLIENT_ID -Expires: 11 Aug 25 19:12 CEST +Client ID: google-oauth2|100677750055416883405 +Expires: 18 Aug 25 13:15 IST Valid for: 24h0m0s Is Active: true Rate Limits: ------------ -Publish Rate: 2000 per hour -Publish Rate: 12 per second -Max Message Size: 10.00 MB -Daily Quota: 10240.00 MB +Publish Rate: 1000 per hour +Publish Rate: 8 per second +Max Message Size: 4.00 MB +Daily Quota: 5120.00 MB ``` - **Important: By default `Is Active` is `false`. Contact us to activate your account.** - #### Other auth commands ```sh @@ -167,10 +181,25 @@ Daily Quota: 10240.00 MB ./mump2p logout # Logout ``` +**Refresh Output:** +```bash +Current token status: +Expires at: 18 Aug 25 13:15 IST +Valid for: 23h56m0s +Refreshing token... +✅ Token refreshed successfully +New expiration: 18 Aug 25 13:19 IST +Valid for: 24h0m0s +``` + +**Logout Output:** +```bash +✅ Successfully logged out +``` + ### 3. Choose a Proxy Location **Available Service URLs:** - | Location | URL | | ------------------- | ------------------- | @@ -178,7 +207,6 @@ Daily Quota: 10240.00 MB | **Tokyo** | 35.221.118.95:8080 | | **Singapore** | 34.142.205.26:8080 | - Use a custom location ```sh @@ -195,18 +223,55 @@ Use a custom location ./mump2p subscribe --topic=demo ``` +**Output:** +```bash +claims is &{google-oauth2|100677750055416883405 2025-08-17 13:15:07 +0530 IST 2025-08-18 13:15:07 +0530 IST true 4194304 1000 8 5368709120 google-oauth2|100677750055416883405 1755416706719} +claims is google-oauth2|100677750055416883405 +Sending HTTP POST subscription request... +HTTP POST subscription successful: {"status":"subscribed","topic":"demo"} +Opening WebSocket connection... +Listening for messages on topic 'demo'... Press Ctrl+C to exit +``` + #### Save messages locally ```sh ./mump2p subscribe --topic=demo --persist=/path/to/ ``` +**Output:** +```bash +Persisting data to: /path/to/messages.log +claims is &{google-oauth2|100677750055416883405 2025-08-17 13:15:07 +0530 IST 2025-08-18 13:15:07 +0530 IST true 4194304 1000 8 5368709120 google-oauth2|100677750055416883405 1755416706719} +claims is google-oauth2|100677750055416883405 +Sending HTTP POST subscription request... +HTTP POST subscription successful: {"status":"subscribed","topic":"demo"} +Opening WebSocket connection... +Listening for messages on topic 'demo'... Press Ctrl+C to exit +``` + +**Persisted message format:** +```bash +[2025-08-17T13:19:08+05:30] Testing persistence! +``` + #### Forward to webhook ```sh ./mump2p subscribe --topic=demo --webhook=https://your-server.com/webhook ``` +**Output:** +```bash +Forwarding messages to webhook: https://your-server.com/webhook +claims is &{google-oauth2|100677750055416883405 2025-08-17 13:15:07 +0530 IST 2025-08-18 13:15:07 +0530 IST true 4194304 1000 8 5368709120 google-oauth2|100677750055416883405 1755416706719} +claims is google-oauth2|100677750055416883405 +Sending HTTP POST subscription request... +HTTP POST subscription successful: {"status":"subscribed","topic":"demo"} +Opening WebSocket connection... +Listening for messages on topic 'demo'... Press Ctrl+C to exit +``` + --- ### 5. Publish a Message @@ -217,12 +282,24 @@ Use a custom location ./mump2p publish --topic=demo --message="Hello from CLI!" ``` +**Output:** +```bash +✅ Published inline message +{"status":"published","topic":"demo"} +``` + #### File ```sh ./mump2p publish --topic=demo --file=/path/to/file.json ``` +**Output:** +```bash +✅ Published sample-data.json +{"status":"published","topic":"demo"} +``` + #### With threshold ```sh @@ -237,15 +314,14 @@ Use a custom location ./mump2p usage ``` -output: - -```sh - Publish (hour): 0 / 2000 - Publish (second): 0 / 12 - Data Used: 0.0000 MB / 10240.0000 MB - Next Reset: 11 Aug 25 21:10 CEST (24h0m0s from now) - Last Publish: 02 Jul 25 21:54 +0300 - ``` +**Output:** +```bash + Publish (hour): 0 / 1000 + Publish (second): 0 / 8 + Data Used: 0.0000 MB / 5120.0000 MB + Next Reset: 18 Aug 25 13:15 IST (24h0m0s from now) + Last Publish: 07 Aug 25 06:33 -0700 +``` Shows: @@ -282,12 +358,46 @@ Error: HTTP publish failed: dial tcp ... → Proxy not reachable. Check --service-url. +#### Topic not assigned + +```sh +Error: publish error: topic not assigned +``` + +→ Topic needs to be subscribed to first or doesn't exist. + +#### Missing message or file + +```sh +Error: either --message or --file must be provided +``` + +→ Provide either --message or --file parameter. + +#### Conflicting parameters + +```sh +Error: only one of --message or --file should be used at a time +``` + +→ Use only one of --message or --file, not both. + +#### Authentication required + +```sh +Error: authentication required: token has expired, please login again +``` + +→ Run `./mump2p login` to authenticate. + ### 8. Important Tips * Use descriptive topic names per team. * Keep `whoami` and `usage` handy. * For high-volume topics, increase webhook queue size. * Start with hosted proxy, then try local deployment for full control. +* Subscribe to a topic before publishing to it. +* Use the `--service-url` flag to connect to different gateways for better performance. --- From 80b85462a2c1959c2c5de707a4e1eb519559ba3b Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Sun, 17 Aug 2025 13:31:27 +0530 Subject: [PATCH 27/46] fix: lint --- docs/guides/01-getting-started-cli.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/guides/01-getting-started-cli.md b/docs/guides/01-getting-started-cli.md index 59488e7..5978c07 100644 --- a/docs/guides/01-getting-started-cli.md +++ b/docs/guides/01-getting-started-cli.md @@ -110,6 +110,7 @@ If you prefer manual installation: ``` **Output:** + ```bash Version: v0.0.1-rc3-rc Commit: 5962e6a @@ -130,6 +131,7 @@ Login via device authorization flow: ``` **Output:** + ```bash Initiating authentication... @@ -156,6 +158,7 @@ Token expires at: 18 Aug 25 13:15 IST ``` **Output:** + ```bash Authentication Status: ---------------------- @@ -182,6 +185,7 @@ Daily Quota: 5120.00 MB ``` **Refresh Output:** + ```bash Current token status: Expires at: 18 Aug 25 13:15 IST @@ -193,6 +197,7 @@ Valid for: 24h0m0s ``` **Logout Output:** + ```bash ✅ Successfully logged out ``` @@ -224,6 +229,7 @@ Use a custom location ``` **Output:** + ```bash claims is &{google-oauth2|100677750055416883405 2025-08-17 13:15:07 +0530 IST 2025-08-18 13:15:07 +0530 IST true 4194304 1000 8 5368709120 google-oauth2|100677750055416883405 1755416706719} claims is google-oauth2|100677750055416883405 @@ -240,6 +246,7 @@ Listening for messages on topic 'demo'... Press Ctrl+C to exit ``` **Output:** + ```bash Persisting data to: /path/to/messages.log claims is &{google-oauth2|100677750055416883405 2025-08-17 13:15:07 +0530 IST 2025-08-18 13:15:07 +0530 IST true 4194304 1000 8 5368709120 google-oauth2|100677750055416883405 1755416706719} @@ -251,6 +258,7 @@ Listening for messages on topic 'demo'... Press Ctrl+C to exit ``` **Persisted message format:** + ```bash [2025-08-17T13:19:08+05:30] Testing persistence! ``` @@ -262,6 +270,7 @@ Listening for messages on topic 'demo'... Press Ctrl+C to exit ``` **Output:** + ```bash Forwarding messages to webhook: https://your-server.com/webhook claims is &{google-oauth2|100677750055416883405 2025-08-17 13:15:07 +0530 IST 2025-08-18 13:15:07 +0530 IST true 4194304 1000 8 5368709120 google-oauth2|100677750055416883405 1755416706719} @@ -283,6 +292,7 @@ Listening for messages on topic 'demo'... Press Ctrl+C to exit ``` **Output:** + ```bash ✅ Published inline message {"status":"published","topic":"demo"} @@ -295,6 +305,7 @@ Listening for messages on topic 'demo'... Press Ctrl+C to exit ``` **Output:** + ```bash ✅ Published sample-data.json {"status":"published","topic":"demo"} @@ -315,6 +326,7 @@ Listening for messages on topic 'demo'... Press Ctrl+C to exit ``` **Output:** + ```bash Publish (hour): 0 / 1000 Publish (second): 0 / 8 From 590e09c32c6130c71e609d029cedd60c7e78de46 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Tue, 19 Aug 2025 15:36:51 +0530 Subject: [PATCH 28/46] feat: add docker download and default params --- docs/guides/02-getting-started-docker.md | 149 ++++++++++++++++++++--- docs/guides/03-parameters.md | 74 +++++++++++ 2 files changed, 206 insertions(+), 17 deletions(-) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index 324c633..5a7388a 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -38,11 +38,17 @@ local deployment offers: ## 1. Before You Start ### Requirements - -* **Docker** -* **Docker Compose** -* **Go v1.24+** -* At least **2 GB free RAM** for running multiple nodes locally + +* **[Docker](https://docs.docker.com/engine/install/)** — Container runtime for running OptimumP2P components +* **[Docker Compose](https://docs.docker.com/compose/install/)** — Tool for defining multi-container applications +* **[Go v1.24+](https://golang.org/dl/)** — Required for building custom gRPC clients +* At least **2 GB free RAM** for running multiple nodes locally + +> **Quick Docker Install:** +> +> * **Linux**: `curl -fsSL https://get.docker.com | sh` +> * **macOS**: [Docker Desktop for Mac](https://docs.docker.com/desktop/install/mac-install/) +> * **Windows**: [Docker Desktop for Windows](https://docs.docker.com/desktop/install/windows-install/) ### Components @@ -74,23 +80,132 @@ We’ll keep identity in `./identity` folder so you can reuse keys across restar | **Direct OptimumP2P** | Fewer hops, you control connection/retry logic and node selection | -### 3. Generate a Bootstrap Identity (once) +## 3. Generate a Bootstrap Identity (once) -For stable bootstrapping, generate a persistent identity: +OptimumP2P nodes need a **P2P identity** (cryptographic keypair) for peer-to-peer communication. The bootstrap node needs a persistent identity so other nodes can discover it reliably. - -```sh -# Create identity dir +**What is P2P Identity?** + +* A cryptographic private key stored in `identity/p2p.key` +* Used for peer authentication and discovery +* Generates a unique **Peer ID** (like `12D3KooW...`) that other nodes use to connect + +### Quick One-Command Setup + +```bash +# TODO: Update this URL once optimum-dev-setup-guide repo is public +curl -sSL https://raw.githubusercontent.com/getoptimum/optimum-dev-setup-guide/main/scripts/generate-identity.sh | bash +``` + +This script automatically: + +* Creates `./identity/` directory +* Generates P2P keypair +* Saves to `identity/p2p.key` +* Exports `BOOTSTRAP_PEER_ID` environment variable + +### Manual Setup (Alternative) + +If you prefer to generate the key manually: + +#### Step 1: Create identity directory + +```bash mkdir -p ./identity +``` + +#### Step 2: Create the key generator + +```bash +cat > ./generate_key.go << 'EOF' +package main + +import ( + "crypto/rand" + "encoding/json" + "fmt" + "os" + "path/filepath" + + "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/peer" +) + +type IdentityInfo struct { + Key []byte `json:"Key"` + ID peer.ID `json:"ID"` +} + +func main() { + // Generate Ed25519 keypair + pk, _, err := crypto.GenerateEd25519Key(rand.Reader) + if err != nil { + fmt.Printf("Failed to generate key: %v\n", err) + os.Exit(1) + } + + // Get peer ID from private key + id, err := peer.IDFromPrivateKey(pk) + if err != nil { + fmt.Printf("Failed to derive peer ID: %v\n", err) + os.Exit(1) + } + + // Marshal private key to bytes + raw, err := crypto.MarshalPrivateKey(pk) + if err != nil { + fmt.Printf("Failed to marshal key: %v\n", err) + os.Exit(1) + } + + // Save to identity/p2p.key + info := IdentityInfo{Key: raw, ID: id} + data, err := json.Marshal(info) + if err != nil { + fmt.Printf("Failed to marshal identity: %v\n", err) + os.Exit(1) + } + + keyPath := filepath.Join("identity", "p2p.key") + if err := os.WriteFile(keyPath, data, 0600); err != nil { + fmt.Printf("Failed to write key file: %v\n", err) + os.Exit(1) + } + + fmt.Printf("Peer ID: %s\n", id.String()) +} +EOF +``` + +#### Step 3: Initialize and run -# Generate a key (container provides the helper) -docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest generate-key -# Print the libp2p Peer ID from that key -export BOOTSTRAP_PEER_ID=$(docker run --rm -v $(pwd)/identity:/identity getoptimum/p2pnode:latest peer-id) +```bash +go mod init temp-keygen +go get github.com/libp2p/go-libp2p@latest +go run generate_key.go +``` + +#### Step 4: Export Peer ID and cleanup + +```bash +export BOOTSTRAP_PEER_ID=$(cat identity/p2p.key | grep -o '"ID":"[^"]*"' | cut -d'"' -f4) echo "BOOTSTRAP_PEER_ID=${BOOTSTRAP_PEER_ID}" +rm generate_key.go go.mod go.sum ``` -We’ll reference `${BOOTSTRAP_PEER_ID}` in `docker-compose` files so all peers can discover the bootstrap node. +**Expected Output:** + +```sh +Peer ID: 12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 +BOOTSTRAP_PEER_ID=12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 +``` + +**What this creates:** + +* `./identity/p2p.key` — JSON file containing the private key and peer ID +* `BOOTSTRAP_PEER_ID` environment variable for use in docker-compose files + +> **Note:** This process creates a persistent identity that will be reused across container restarts. The `identity/` folder is mounted into containers so the same keypair is shared by the bootstrap node. This guide covers: @@ -99,7 +214,7 @@ This guide covers: * Connecting via CLI (`mump2p-cli`) or `gRPC clients` (Go examples included). * Adjusting key parameters for your environment. -## 3 Mode A — OptimumProxy + OptimumP2P (Recommended) +## 4. Mode A — OptimumProxy + OptimumP2P (Recommended) ### Create the docker-compose file @@ -317,7 +432,7 @@ func main() { } ``` -## 4 Mode B — Direct OptimumP2P (Advanced / Low Latency) +## 5. Mode B — Direct OptimumP2P (Advanced / Low Latency) In this mode, clients connect `straight to node sidecar gRPC`. You’ll manage client-side reconnection, backoff, and which node to hit. diff --git a/docs/guides/03-parameters.md b/docs/guides/03-parameters.md index e5af9e7..df7edc2 100644 --- a/docs/guides/03-parameters.md +++ b/docs/guides/03-parameters.md @@ -132,6 +132,80 @@ proxy-1: | `P2P_NODES` | (none) | Comma-separated list of host:port for sidecar connections. | | `SUBSCRIBER_THRESHOLD` | 0.1 | % of connected subscribers needed to forward a message. | +## Recommended Default Configuration + +The following table shows the **production defaults**, which are optimized for typical deployment scenarios: + +### For Quick Start (Copy-Paste Ready) + +**OptimumP2P Mode (`NODE_MODE=optimum`):** + +```yaml +environment: + - NODE_MODE=optimum + - LOG_LEVEL=production + - CLUSTER_ID=my-cluster + - SIDECAR_PORT=33212 + - API_PORT=8081 + - IDENTITY_DIR=/identity + - OPTIMUM_PORT=7070 + - OPTIMUM_MAX_MSG_SIZE=1048576 + - OPTIMUM_RANDOM_MSG_SIZE=512 + - OPTIMUM_MESH_TARGET=6 + - OPTIMUM_MESH_MIN=4 + - OPTIMUM_MESH_MAX=12 + - OPTIMUM_SHARD_FACTOR=4 + - OPTIMUM_SHARD_MULT=1.5 + - OPTIMUM_THRESHOLD=0.75 + - BOOTSTRAP_PEERS="" +``` + +**GossipSub Mode (`NODE_MODE=gossipsub`):** + +```yaml +environment: + - NODE_MODE=gossipsub + - LOG_LEVEL=production + - CLUSTER_ID=my-cluster + - SIDECAR_PORT=33212 + - API_PORT=8081 + - IDENTITY_DIR=/identity + - GOSSIPSUB_PORT=6060 + - GOSSIPSUB_MAX_MSG_SIZE=1048576 + - GOSSIPSUB_MESH_TARGET=6 + - GOSSIPSUB_MESH_MIN=4 + - GOSSIPSUB_MESH_MAX=12 + - BOOTSTRAP_PEERS="" +``` + +### Complete Defaults Reference + +| Parameter | Default Value | Used In Mode | Description | +| ---------------------------- | ------------- | ------------ | ---------------------------------------------- | +| `LOG_LEVEL` | production | Both | Log verbosity (production/debug/info/warn/error) | +| `CLUSTER_ID` | "" | Both | Logical group name for metrics | +| `NODE_MODE` | "" | Both | Protocol mode (optimum/gossipsub) | +| `SIDECAR_PORT` | 33212 | Both | gRPC sidecar port | +| `API_PORT` | 8081 | Both | HTTP API port | +| `IDENTITY_DIR` | /tmp | Both | Directory for node private key | +| `OPTIMUM_PORT` | 7070 | optimum | TCP port for RLNC gossip | +| `OPTIMUM_MAX_MSG_SIZE` | 1048576 | optimum | Max message size (1MB) | +| `OPTIMUM_RANDOM_MSG_SIZE` | 512 | optimum | Random message size for testing | +| `OPTIMUM_MESH_TARGET` | 6 | optimum | Desired peers in mesh | +| `OPTIMUM_MESH_MIN` | 4 | optimum | Minimum peers before adding more | +| `OPTIMUM_MESH_MAX` | 12 | optimum | Max peers before pruning | +| `OPTIMUM_SHARD_FACTOR` | 4 | optimum | Number of shards per message | +| `OPTIMUM_SHARD_MULT` | 1.5 | optimum | Redundancy multiplier (extra shards) | +| `OPTIMUM_THRESHOLD` | 0.75 | optimum | Forward/decode threshold (75%) | +| `GOSSIPSUB_PORT` | 6060 | gossipsub | TCP port for standard gossip | +| `GOSSIPSUB_MAX_MSG_SIZE` | 1048576 | gossipsub | Max message size (1MB) | +| `GOSSIPSUB_MESH_TARGET` | 6 | gossipsub | Desired peers in mesh | +| `GOSSIPSUB_MESH_MIN` | 4 | gossipsub | Minimum peers before adding more | +| `GOSSIPSUB_MESH_MAX` | 12 | gossipsub | Max peers before pruning | +| `BOOTSTRAP_PEERS` | [] | Both | List of peer multiaddrs for bootstrap | + +> **Note:** These are the production defaults used by OptimumP2P nodes. For experimental tuning, see [Common Experiments](./04-experiments.md). + ## Parameter Impact in Deployment Modes From 3d6f74d8b72d9c266af26641183a2b90aba1ca71 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Tue, 19 Aug 2025 16:56:29 +0530 Subject: [PATCH 29/46] fix: correct the link --- docs/guides/02-getting-started-docker.md | 113 ++++------------------- 1 file changed, 17 insertions(+), 96 deletions(-) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index 5a7388a..b805f1b 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -93,111 +93,32 @@ OptimumP2P nodes need a **P2P identity** (cryptographic keypair) for peer-to-pee ### Quick One-Command Setup ```bash -# TODO: Update this URL once optimum-dev-setup-guide repo is public -curl -sSL https://raw.githubusercontent.com/getoptimum/optimum-dev-setup-guide/main/scripts/generate-identity.sh | bash +curl -sSL https://raw.githubusercontent.com/getoptimum/optimum-dev-setup-guide/main/script/generate-identity.sh | bash ``` This script automatically: * Creates `./identity/` directory -* Generates P2P keypair +* Generates P2P keypair using Go * Saves to `identity/p2p.key` * Exports `BOOTSTRAP_PEER_ID` environment variable - -### Manual Setup (Alternative) - -If you prefer to generate the key manually: - -#### Step 1: Create identity directory - -```bash -mkdir -p ./identity -``` - -#### Step 2: Create the key generator - -```bash -cat > ./generate_key.go << 'EOF' -package main - -import ( - "crypto/rand" - "encoding/json" - "fmt" - "os" - "path/filepath" - - "github.com/libp2p/go-libp2p/core/crypto" - "github.com/libp2p/go-libp2p/core/peer" -) - -type IdentityInfo struct { - Key []byte `json:"Key"` - ID peer.ID `json:"ID"` -} - -func main() { - // Generate Ed25519 keypair - pk, _, err := crypto.GenerateEd25519Key(rand.Reader) - if err != nil { - fmt.Printf("Failed to generate key: %v\n", err) - os.Exit(1) - } - - // Get peer ID from private key - id, err := peer.IDFromPrivateKey(pk) - if err != nil { - fmt.Printf("Failed to derive peer ID: %v\n", err) - os.Exit(1) - } - - // Marshal private key to bytes - raw, err := crypto.MarshalPrivateKey(pk) - if err != nil { - fmt.Printf("Failed to marshal key: %v\n", err) - os.Exit(1) - } - - // Save to identity/p2p.key - info := IdentityInfo{Key: raw, ID: id} - data, err := json.Marshal(info) - if err != nil { - fmt.Printf("Failed to marshal identity: %v\n", err) - os.Exit(1) - } - - keyPath := filepath.Join("identity", "p2p.key") - if err := os.WriteFile(keyPath, data, 0600); err != nil { - fmt.Printf("Failed to write key file: %v\n", err) - os.Exit(1) - } - - fmt.Printf("Peer ID: %s\n", id.String()) -} -EOF -``` - -#### Step 3: Initialize and run - -```bash -go mod init temp-keygen -go get github.com/libp2p/go-libp2p@latest -go run generate_key.go -``` - -#### Step 4: Export Peer ID and cleanup - -```bash -export BOOTSTRAP_PEER_ID=$(cat identity/p2p.key | grep -o '"ID":"[^"]*"' | cut -d'"' -f4) -echo "BOOTSTRAP_PEER_ID=${BOOTSTRAP_PEER_ID}" -rm generate_key.go go.mod go.sum -``` +* Handles existing identity gracefully +* Cleans up temporary files automatically **Expected Output:** - -```sh -Peer ID: 12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 -BOOTSTRAP_PEER_ID=12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 +``` +[INFO] Generating P2P Bootstrap Identity... +[INFO] Creating identity directory... +[INFO] Creating key generator... +[INFO] Initializing Go module... +[INFO] Downloading dependencies... +[INFO] Generating P2P keypair... +[SUCCESS] Generated P2P identity successfully! +[SUCCESS] Identity saved to: ./identity/p2p.key +[SUCCESS] Peer ID: 12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 +[INFO] To use in docker-compose: +export BOOTSTRAP_PEER_ID=12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 +[SUCCESS] Done! Your OptimumP2P peer ID: 12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 ``` **What this creates:** From 7b95cf1c03af1bae4088ce64c57041d1420cc0be Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Tue, 19 Aug 2025 18:27:46 +0530 Subject: [PATCH 30/46] feat: add the grpc docs and code from dev setup --- docs/guides/02-getting-started-docker.md | 174 +++++++++++++++++++---- docs/guides/04-experiments.md | 25 +++- 2 files changed, 170 insertions(+), 29 deletions(-) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index b805f1b..f4f3ffa 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -106,7 +106,8 @@ This script automatically: * Cleans up temporary files automatically **Expected Output:** -``` + +```bash [INFO] Generating P2P Bootstrap Identity... [INFO] Creating identity directory... [INFO] Creating key generator... @@ -319,37 +320,132 @@ wscat -c "wss://xxx/api/ws?client_id=unique-client-id" \ -H "Authorization: Bearer YOUR_JWT_TOKEN" ``` -### Use Proxy using gRPC Steam +### Use Proxy using gRPC Stream -TODO:: +For a complete working proxy client with both REST subscription and gRPC streaming, see the full implementation: + +**[Complete Proxy Client Example](https://github.com/getoptimum/optimum-dev-setup-guide/blob/main/grpc_proxy_client/proxy_client.go)** + +The proxy client provides: + +* **REST API subscription** for topic registration and threshold configuration +* **gRPC bidirectional streaming** for real-time message delivery +* **Message publishing** via REST API endpoints +* **Configurable parameters** for topic, threshold, and message count +* **Flow control and keepalive** settings for robust connections ```go -// proxy_client.go +// Basic proxy client implementation (see full version in GitHub link above) package main import ( + "bytes" "context" + "encoding/json" "fmt" + "io" "log" + "math" + "net/http" + "time" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/keepalive" + + protobuf "proxy_client/grpc" // Generated from gateway_stream.proto +) + +const ( + proxyREST = "http://localhost:8081" // REST API for subscription/publishing + proxyGRPC = "localhost:50051" // gRPC endpoint for streaming ) func main() { - conn, err := grpc.Dial("localhost:50051", grpc.WithTransportCredentials(insecure.NewCredentials())) - if err != nil { log.Fatal(err) } + clientID := "client_demo123" + topic := "demo" + threshold := 0.1 + + // 1. Subscribe via REST API + body := map[string]interface{}{ + "client_id": clientID, + "topic": topic, + "threshold": threshold, + } + data, _ := json.Marshal(body) + resp, err := http.Post(proxyREST+"/api/subscribe", "application/json", bytes.NewReader(data)) + if err != nil { + log.Fatalf("subscription failed: %v", err) + } + resp.Body.Close() + + // 2. Connect to gRPC stream + conn, err := grpc.NewClient(proxyGRPC, + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(math.MaxInt), + grpc.MaxCallSendMsgSize(math.MaxInt), + ), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 2 * time.Minute, + Timeout: 20 * time.Second, + }), + ) + if err != nil { + log.Fatalf("gRPC connection failed: %v", err) + } defer conn.Close() - // TODO: replace with your generated gRPC client for proxy stream. - // Example: - // client := pb.NewProxyStreamClient(conn) - // stream, _ := client.Stream(context.Background()) - // stream.Send(&pb.Subscribe{Topic: "demo"}) - // for { msg, _ := stream.Recv(); fmt.Println("MSG", msg) } - - fmt.Println("Connected to proxy gRPC at localhost:50051 (implement client logic here).") - <-context.Background().Done() + client := protobuf.NewProxyStreamClient(conn) + stream, err := client.ClientStream(context.Background()) + if err != nil { + log.Fatalf("stream creation failed: %v", err) + } + + // 3. Send client ID to establish stream + if err := stream.Send(&protobuf.ProxyMessage{ClientId: clientID}); err != nil { + log.Fatalf("client ID send failed: %v", err) + } + + // 4. Handle incoming messages + go func() { + for { + resp, err := stream.Recv() + if err == io.EOF { + log.Println("Stream closed by server") + return + } + if err != nil { + log.Printf("Stream receive error: %v", err) + return + } + log.Printf("Received: Topic=%s, Message=%s", resp.Topic, string(resp.Message)) + } + }() + + // 5. Publish messages via REST API + for i := 0; i < 3; i++ { + msg := fmt.Sprintf("Hello message %d @ %s", i+1, time.Now().Format("15:04:05")) + publishBody := map[string]interface{}{ + "client_id": clientID, + "topic": topic, + "message": msg, + } + publishData, _ := json.Marshal(publishBody) + + log.Printf("Publishing: %s", msg) + resp, err := http.Post(proxyREST+"/api/publish", "application/json", bytes.NewReader(publishData)) + if err != nil { + log.Printf("Publish error: %v", err) + } else { + resp.Body.Close() + } + + time.Sleep(2 * time.Second) + } + + // Keep client running to receive messages + time.Sleep(10 * time.Second) } ``` @@ -438,10 +534,19 @@ curl -s http://localhost:9092/api/v1/health ### Minimal Direct P2P sidecar gRPC stream client -TODO:: +For a complete working P2P client that connects directly to nodes, see the full implementation with trace handling: + +**[Complete P2P Client Example](https://github.com/getoptimum/optimum-dev-setup-guide/blob/main/grpc_p2p_client/p2p_client.go)** + +The client includes: + +* **Message publishing and subscribing** with gRPC streaming +* **Protocol trace handling** for both GossipSub and OptimumP2P +* **Metrics collection** via `MessageTraceGossipSub` and `MessageTraceOptimumP2P` responses +* **Stress testing capabilities** with batch message publishing ```go -// p2p_client.go (skeleton) +// Basic client skeleton (see full implementation in GitHub link above) package main import ( @@ -453,11 +558,13 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/keepalive" + + protobuf "p2p_client/grpc" // Generated from p2p_stream.proto ) func main() { conn, err := grpc.Dial( - "localhost:33221", + "localhost:33221", // Connect to p2pnode-1 grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithKeepaliveParams(keepalive.ClientParameters{ Time: 2*time.Minute, Timeout: 20*time.Second, @@ -466,18 +573,31 @@ func main() { if err != nil { log.Fatal(err) } defer conn.Close() - // TODO: replace with your generated client and stream. - // client := pb.NewCommandStreamClient(conn) - // stream, _ := client.ListenCommands(context.Background()) - // stream.Send(&pb.Request{Command: SubscribeCmd, Topic: "demo"}) - // for { resp, _ := stream.Recv(); fmt.Printf("MSG: %s\n", resp.GetData()) } - - fmt.Println("Connected to node sidecar at localhost:33221 (implement client logic here).") - <-context.Background().Done() + client := protobuf.NewCommandStreamClient(conn) + stream, _ := client.ListenCommands(context.Background()) + + // Subscribe to topic + stream.Send(&protobuf.Request{ + Command: int32(CommandSubscribeToTopic), + Topic: "demo", + }) + + // Handle responses including trace data + for { + resp, _ := stream.Recv() + switch resp.GetCommand() { + case protobuf.ResponseType_Message: + fmt.Printf("MSG: %s\n", string(resp.GetData())) + case protobuf.ResponseType_MessageTraceGossipSub: + fmt.Printf("[TRACE] GossipSub trace: %d bytes\n", len(resp.GetData())) + case protobuf.ResponseType_MessageTraceOptimumP2P: + fmt.Printf("[TRACE] OptimumP2P trace: %d bytes\n", len(resp.GetData())) + } + } } ``` -See the example code in our GitHub repository(TODO::). For all available configuration variables, observability and validations check the [Parameters Section](./03-parameters.md). +For all available configuration variables, observability and validations check the [Parameters Section](./03-parameters.md). ## Troubleshooting diff --git a/docs/guides/04-experiments.md b/docs/guides/04-experiments.md index 8295b33..3c245c0 100644 --- a/docs/guides/04-experiments.md +++ b/docs/guides/04-experiments.md @@ -117,5 +117,26 @@ You can run them using: > * `MessageTraceGossipSub` for GossipSub mode. > * `MessageTraceOptimumP2P` for OptimumP2P mode. -TODO:: github ref, and cite the gRPC client part. -For metrics collection guidance, see [github sample implementations](github.com). +## Metrics Collection + +For comprehensive metrics collection during experiments, use the gRPC P2P client with trace handling: + +**[P2P Client with Metrics Collection](https://github.com/getoptimum/optimum-dev-setup-guide/blob/main/grpc_p2p_client/p2p_client.go)** + +The client automatically captures and displays: + +* **GossipSub traces**: Peer routing, message delivery status, hop counts, latency +* **OptimumP2P traces**: Shard encoding/decoding, reconstruction efficiency, redundancy metrics +* **Message-level data**: Delivery success rates, end-to-end latency, bandwidth usage + +**Key trace handlers:** + +```go +case protobuf.ResponseType_MessageTraceGossipSub: + fmt.Printf("[TRACE] GossipSub trace received: %s\n", string(resp.GetData())) + +case protobuf.ResponseType_MessageTraceOptimumP2P: + fmt.Printf("[TRACE] OptimumP2P trace received: %s\n", string(resp.GetData())) +``` + +Use this client instead of the CLI for detailed performance analysis during experiments. From 8102ed35da7f403fe39c68799c719b91fceeaf22 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Tue, 19 Aug 2025 19:29:25 +0530 Subject: [PATCH 31/46] fix: output for identity script --- docs/guides/02-getting-started-docker.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index f4f3ffa..078f2b3 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -96,30 +96,28 @@ OptimumP2P nodes need a **P2P identity** (cryptographic keypair) for peer-to-pee curl -sSL https://raw.githubusercontent.com/getoptimum/optimum-dev-setup-guide/main/script/generate-identity.sh | bash ``` -This script automatically: +This script: * Creates `./identity/` directory -* Generates P2P keypair using Go -* Saves to `identity/p2p.key` +* Generates P2P keypair using the existing keygen utility +* Saves to `identity/p2p.key` with proper checksum format * Exports `BOOTSTRAP_PEER_ID` environment variable * Handles existing identity gracefully -* Cleans up temporary files automatically +* Uses the correct file format expected by OptimumP2P nodes -**Expected Output:** +**Output:** ```bash [INFO] Generating P2P Bootstrap Identity... [INFO] Creating identity directory... -[INFO] Creating key generator... -[INFO] Initializing Go module... -[INFO] Downloading dependencies... +[INFO] Using existing keygen script... [INFO] Generating P2P keypair... [SUCCESS] Generated P2P identity successfully! [SUCCESS] Identity saved to: ./identity/p2p.key -[SUCCESS] Peer ID: 12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 +[SUCCESS] Peer ID: 12D3KooWLsSmLLoE2T7JJ3ZyPqoXEusnBhsBA1ynJETsziCKGsBw [INFO] To use in docker-compose: -export BOOTSTRAP_PEER_ID=12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 -[SUCCESS] Done! Your OptimumP2P peer ID: 12D3KooWJ5wcJWsfPmy6ssqonno14baQMozmteSkRGKxAzB3k2t8 +export BOOTSTRAP_PEER_ID=12D3KooWLsSmLLoE2T7JJ3ZyPqoXEusnBhsBA1ynJETsziCKGsBw +[SUCCESS] Done! Your OptimumP2P peer ID: 12D3KooWLsSmLLoE2T7JJ3ZyPqoXEusnBhsBA1ynJETsziCKGsBw ``` **What this creates:** From d40b3bccfdcd0dfcf9b437f08f3837ae345d20ef Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 20 Aug 2025 11:19:56 +0530 Subject: [PATCH 32/46] fix: remove next steps and param impact --- .vitepress/config.mts | 5 +-- docs/guides/03-parameters.md | 10 ------ docs/guides/06-next-steps.md | 66 ------------------------------------ 3 files changed, 1 insertion(+), 80 deletions(-) delete mode 100644 docs/guides/06-next-steps.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 1e00258..a7a95ad 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -261,10 +261,7 @@ function sidebarHome() { text: "FAQ Glossary", link: "/docs/guides/05-faq-glossary", }, - { - text: "Next Steps", - link: "/docs/guides/06-next-steps", - }, + ], }, { diff --git a/docs/guides/03-parameters.md b/docs/guides/03-parameters.md index df7edc2..017ede6 100644 --- a/docs/guides/03-parameters.md +++ b/docs/guides/03-parameters.md @@ -206,13 +206,3 @@ environment: > **Note:** These are the production defaults used by OptimumP2P nodes. For experimental tuning, see [Common Experiments](./04-experiments.md). -## Parameter Impact in Deployment Modes - - -| Parameter | Proxy + P2P | Direct P2P | -| ------------------------------------- | ----------- | ---------- | -| Mesh Size (`*_MESH_TARGET`) | explainer | explainer | -| Shard Factor (`OPTIMUM_SHARD_FACTOR)` | explainer | explainer | -| Threshold (`OPTIMUM_THRESHOLD`) | explainer | explainer | -| Max Message Size (`*_MAX_MSG_SIZE`) | explainer | explainer | -| Bootstrap Peers (`BOOTSTRAP_PEERS`) | explainer | explainer | diff --git a/docs/guides/06-next-steps.md b/docs/guides/06-next-steps.md deleted file mode 100644 index be8f268..0000000 --- a/docs/guides/06-next-steps.md +++ /dev/null @@ -1,66 +0,0 @@ -# Next Steps - -You’ve installed OptimumP2P, sent your first messages, tuned key parameters, and explored monitoring. -Now it’s time to take your deployment further — integrating it into your projects, scaling for real-world scenarios, and experimenting with advanced setups. - - -## 1. Integrate with Your Application - -Depending on your architecture, you can connect your app to OptimumP2P in one of two main ways: - -* **Direct P2P Client** - * Use gRPC to connect directly to P2P nodes. - * Best for low-latency, high-throughput scenarios. - * Requires your app to manage peer discovery and reconnections. - -* **Proxy + P2P** - * Connect via REST or gRPC to a proxy that bridges to the P2P mesh. - * Best for web clients, services without native P2P support, or multi-node orchestration. - * Lets you centralize authentication, logging, and metrics. - -See: [Client Integration Guide](./02-getting-started-docker.md) - - -## 2. Experiment with Advanced Configurations - -* **RLNC Tuning** - * Increase `OPTIMUM_SHARD_FACTOR` for higher fault tolerance. - * Lower `OPTIMUM_THRESHOLD` for faster forwarding. - * Observe trade-offs between redundancy, latency, and bandwidth. - -* **Mesh Topology** - * Test sparse (`MESH_TARGET=4`) vs dense (`MESH_TARGET=10`) topologies. - * Use multiple bootstrap nodes to reduce single points of failure. - -* **Protocol Comparisons** - * Run identical workloads on OptimumP2P and GossipSub. - * Measure latency, message loss recovery, and CPU/memory usage. - - -## 3. Deploy in a Distributed Environment - -* Test across multiple regions for realistic latency. -* Use cloud instances (AWS, GCP, Azure) with Docker Compose or Kubernetes. -* Secure nodes using: - * Private bootstrap peers - * TLS for gRPC - * Firewall rules for P2P ports - -## 4. Contribute to OptimumP2P - -* Submit improvements or bug reports. -* Share performance results from different configurations. -* Contribute new client libraries or example integrations. - - -## 5. Plan for Upcoming Features - -Watch for: - -* **DeRAM Integration** — Optimized memory handling for large datasets. -* **Blockchain-Specific Integration** — Direct integration with Ethereum, Solana, and others. -* many more.. - - -Stay updated by following announcements in the OptimumP2P developer community. - From 3307099a4dea762551d55f9eb0c3cb5d259ba63b Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Wed, 20 Aug 2025 12:18:04 +0530 Subject: [PATCH 33/46] fix: remove ref for next steps --- docs/guides/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guides/overview.md b/docs/guides/overview.md index 333692a..787bace 100644 --- a/docs/guides/overview.md +++ b/docs/guides/overview.md @@ -48,7 +48,7 @@ This guide is organized into self-contained chapters: 3. **[Understanding Key Parameters](03-parameters.md)** — Tune thresholds, shards, and mesh settings for your workload. 4. **[Common Experiments](04-experiments.md)** — Test performance and reliability under different conditions. 5. **[FAQ & Glossary](05-faq-glossary.md)** — Quick answers and key term definitions. -6. **[Next Steps](06-next-steps.md)** — Ideas for integration and advanced usage. + ## Who This Guide Is For From 8ddeca57ed5c93eb23482898dca384c1dc6b469a Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Thu, 21 Aug 2025 03:39:54 +0530 Subject: [PATCH 34/46] feat: add diagrams --- docs/guides/01-getting-started-cli.md | 23 +---------------------- docs/guides/02-getting-started-docker.md | 11 ++--------- static/img/docker_1.png | Bin 0 -> 55282 bytes static/img/docker_2.png | Bin 0 -> 55341 bytes static/img/mump2p.png | Bin 0 -> 168850 bytes 5 files changed, 3 insertions(+), 31 deletions(-) create mode 100644 static/img/docker_1.png create mode 100644 static/img/docker_2.png create mode 100644 static/img/mump2p.png diff --git a/docs/guides/01-getting-started-cli.md b/docs/guides/01-getting-started-cli.md index 5978c07..d1bfde1 100644 --- a/docs/guides/01-getting-started-cli.md +++ b/docs/guides/01-getting-started-cli.md @@ -51,28 +51,7 @@ Without authentication, you can only use **open/public topics** with strict limi ## How It Fits into the Network -```plaintext -┌──────────────┐ ┌────────────────┐ ┌─────────────────────────────┐ -│ mump2p CLI │───▶ │ Optimum Proxy │───▶ │ OptimumP2P Network │ -└──────────────┘ └────────────────┘ └─────────────┬───────────────┘ - / │ \ - / │ \ - ┌────────▼─┐ │ ┌──────────┐ - │ P1:Tokyo │──┼──│P2:Singapore│ - └─────┬────┘ │ └──────┬─────┘ - │ │ │ - ┌─────▼────┐ │ ┌──────▼─────┐ - │P3:Frankf │──┼──│P4:New York │ - └──────────┘ │ └────────────┘ - │ - ┌─────▼─────┐ - │P5:Sydney │ - └─────┬─────┘ - │ - ┌──────▼──────┐ - │ Other Peers │ - └─────────────┘ -``` +![mump2p CLI Architecture](../../static/img/mump2p.png) * CLI talks to the Proxy via gRPC/WebSocket. * Proxy connects to the P2P Mesh (multiple nodes across regions). diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index 078f2b3..e4d23d7 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -5,10 +5,7 @@ You can run the network in two primary ways: **1. OptimumProxy + OptimumP2P** — Clients connect to an **Optimum Proxy**, which manages P2P connections for them. - -```plaintext -[Client (CLI / gRPC)] → [Optimum Proxy] → [OptimumP2P Mesh] -``` +![OptimumProxy + OptimumP2P Architecture](../../static/img/docker_1.png) * Simplifies client configuration — only the Proxy address is needed. * Proxy handles shard reassembly, threshold logic, and node selection. @@ -16,11 +13,7 @@ You can run the network in two primary ways: **2. Direct OptimumP2P** — Clients connect directly to **OptimumP2P nodes** (each node must run the gRPC API). - - -```plaintext -[Client (gRPC)] → [OptimumP2P Node] ↔ [OptimumP2P Mesh] -``` +![Direct OptimumP2P Architecture](../../static/img/docker_2.png) * Fewer network hops = potentially lower latency. * Clients must know node addresses and manage failover. diff --git a/static/img/docker_1.png b/static/img/docker_1.png new file mode 100644 index 0000000000000000000000000000000000000000..080eb18f9831c32f62d12882af59241c632b5f67 GIT binary patch literal 55282 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
&b7*Gnxt>fQjC`& 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

}kK+2Q=^tA1uaijp8v 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 literal 55341 zcmb5WbyQSe_dgEfAOnarC>Rr)|DiBg&3e?JZQL_-mpME3Us;U07>s_!(>Q;9qy{-=G5b zxC7iKoV<5LT_nZvFD9c`IR-xz|G(4Elmih?YRd$Vx1RyI)@{n9zGD&loc z?Z3F#zuz5%x;rg0MwV8@ZPSP%vFUUQ&$qzZHh|=5!Lv&1=KH2TT+P1{OXc{R=8Kco z1z5~Ij;tyk2GK|!VP(ZpLY@nj@jv`X|Mw~%DMPRQAG}-00)~-ZJO;5FT9A{pN(D6k z@)Gswcr>6Tut3A1&-YtWG8jrrwGyqQ?3xtCJyz!uOsYsv$|CjKh0V0q2UpPUFAiX7MG-AYlEKI%PZgUL>wcSx)YpqC~HAvA3ekQ=~ zMa95;>vlE*Mk&T>B958zs)c)g{q1m;aj>Sl{{w+NC4?>b0FsLTkj|@tA02qWw*8(D zm&FOaN+bATF+I^_a?2@E^C@w&FsbJ3<1hUG7hk~qe|~_qzWr~fg7y(*zCafN-Syw= zq_d#M)ePk>+iIfFbsUprN_zgo1yAGv(emMqSYemG$l4?1@O{(MmnUaIo;OOOanRQb z`LK2zKYo7j_ilWUh6)q@cQk-UGpRU&y!?0gn2MR+-6t;L_%7kLj8j{8ye`-_d-65l zH6||k^H)KuCtNI}UW~yCH-f#_w_oIUTjf#iJvg=1xtE_d!yfTl;iL8MkPy#!N4@5N zai*DNx}VJs9Q}DGeByF{XMjw85PA6j><=*<+5y=l_|3rlGSp4P3*TTW5z&U#sz*sP z#bTP+mf`(@1c+GHpmkUMx3w#3AHn*knO(vi{Ob;9-uYU7-s?Xg+hciN(*dE6_x|2A z2}CrOh4uef0}Y-h8O$K`nn4ezSa5!|ML|NMJR`0!~075V>u#v^frCB^|{g#bMDlAjEchTlCiXc`m- z3)68Y?w1o9!lDKC!&fpqEI9WA z9f4S_|G{lE7Ww~;AQ#CoD*$%H0;0#qhnhXXZYJ0HLiHdf+TMEi%hLhEYB~3IOF_KP z&!@`t+b0YP*YUpLO8Z*ILp88A58rR5PJxtNpW=5j=X=-@*>|ATTb z9f`oM@8QRudcvQtunzr9IGL0-8oFRA&o}9z>!i|{C(qdxJmS}!E~tR z7o_GMFja&ImPPLe>3U&~(V`IZ0vz+5FA2E{wTF~-gL%Y`4bPCjN-pNRkjtnyr+>Qq zqy(RNU{9xgBKcU6cYtH|OyeilPK{>Oc3h`oiJl?bSXUPQq~oWGTZiw{uDwQ#lMNFo zYd&4NG}sR&7(Pu*K7LBFz3;-5QhA_~;-5K7fvU|Xf7g89z8TT^Ia{sODLIC1%1B+F zeMa(0YFvra+4gOD`4atQC^u2N@Xtb>& z;~43Qq_lsrJ|v}0);X`ns~hLF!|zk54J&Ejn)omm z=kMs9E7vW#?DPX?lmAI#xzmiKN*I>8KhnSFgIeWiz! zR_(W{>v>VltmY#mO!emU=+-C95HOUF-OnO<`Vxd6(I@`P{y^+omN|X2U9L((>Oe)&uJZhq{^(vYt5@&F;A}YQf@n_x}e{tP?KyB1{ z>HK;Na-&R0&0fenXbJ#Bg)8njZ_qDW`I0A3Kwd@#R1U`|J9j6H-`)xALVK0>6Het^Z?VmI=Bzb!Qn?H2< zV$VJkO;R_X-dtGsJrjO^d?zn<#;CSSc$BSxq{ya(5oNGF85lnoQiF18^wvYRAKd5* zqIi0@Qp_9__zr9q>^TQV)%)(XiC#gA^r6#*PF}ujd zdF_Aj@obRuCBN;vXOejfT?7q&TbL`6Rf&>`CqAS6(&zRFCh0nAgkzF-^ej5%&Don( z;t26oA}TEZQhtZZK$CooF9@fs9pO~eUS~Wp|6LHGC7P2I*iIY z%#yr9-|^`Wu>WD9Y;&^8nx z3!l;UpV9s@cvEjyKb8E$>-*xcE*x^SR3=ztLrYNlefA5lQyBxi%Q39Wl-Qx` zjo$JXg*`%*F4SPOaxgM>(mM|RsfSC`)o9ahOO71ALa$`xHKng2lyUByopruMcX7+g=eGTwh_5_UMjEz2xIxL+@8mX7 z|M`9jTas&tCE;vYIa-SB_3lqb{8))m7L`{{P$CBN6haD+~aP& z4wmEd^_U?(`>-YlUzbp~QV)&reD=$H+e?5B>~yswV8r{+4}=7>#lj~(fxHa9qmf|T za8eR~sDI@#!}Rqv$(}x?PquO<=N?{6YX>V61AvVjU40dZLtW_F*S)tGGNcUdZySMB z{8af6g#ud852pIl7GmzI^3WsaYpAp35J-iIO!;JMcDVR3t1YeCb-{SpN@P3*MnU#mmNg~Fv z?DH3XV2KjpB;N+2k3aVZjpR$OGQ~G~f~y&bpRxd2k@29(eCPPZ0NCrO6f|U=!p`&g z@9iND{%sSFskjV5_b%%?6)(V8i0{!Gf|!0@M{k86|A$pisd&>-}w%BI<+5g3fBX?+-#Srj73UmPKZ3HsN&`FQ) z+@Np5wepcyiyH%LU7H?HZWDxws*Yp2*&e*WM#WMn8zB@1qlF(EIC-@P6AaHlq<2Wj z;O*e3i!8k-h6s1PnOyT>v-XJ#y3eTptC&Z${mpZqo?K!-jiJ7Xb|jdIqhM+IKA>M9 zFt8T8=~Zaa4c<+U6Ig_rgMuUYre9tHr$id&3iHA^6ykOBSsX*`=V6A(fF+Cw(AVvj z)*W*`bBmhgRc98T1wrGm7VS~@sF;Gcy%#3EQ$GhBn37CpP_RyBt?Ff0U5>{{Umt8y zn(qF-!%f=JR^>G23*uHHsD?e zn$==^#Q!tPfU!Ma+v`h?jj_E3+~RP%oJf5p#E8nFdo4(_O`>*pI-D{5=&=|Mj;9NiZt zhuQ_3Kk3XJ>yo1TRJKU78@0X>m%c*a9nerRfe_#QFLleo0F#M{@gYl5w z2Fcr&3ISK+?uvX$voT)_{GP^P30 zUlEi}H+T91i;{$;*c!oD`s#c0E*;yM=;!`BqxX50(wXBZ00R@<+vOc=xC4r}MxJ_1 zrxjizla;={h)(k(iIuX4wAOb;Utl6x!O%+nuN0DbNHI-=T42I+K;{B0cP|XezCl@S zzFEy~z9EltHCoc8R(=(#%VGy{1bOZ$JNHf7J5@CdwH`z!I4hlN90xy7La^NvokRYY z(-kZv&_IW=Ax%-W;{=Gi0Q6MYz`r}*>z`|rO^GZ{Zv!_k$HT4z9;pIkb}RRJGt1;h zxi4$2qV!;0uus?e>Gh)muX30J*v)==dRr#gvnibY0>$*<_u<=7GZ;+k$sKL){gHG0 zm;ym4qo{MEk7H@cx0>E?=t=-G@`Z7u5>Sg>!9)cac6J~*K*90S&=Oz@4+tjX+5|{^ zDqqfd4KRNJ5~xh2*u6jEW4t`HD{h_;5C8#?;wYRSImVNs9S2eCwkW9m;*_RoFo}Oj|eJ zQga+BwA>*M?$^*mtw+ZX&2d&?<#vMgS6O){`DT=41dkw4X{1+C1W%9i>z%v%%;;6C z`^aJ(IB+P$UDwYN%hJEhDa(xY&nWXeq!Gy%QSg+|$oRpLQvER+D3)I33DKqBILpAy zWp+<#ZP7!_Rj8(ag`+?OLqldPQVwmD&bNu+Uf`RS79mQnf=aaoM51G2+``R0eJ#8- z&w)%v?~pVld7oYX$`R?qL(w?$m$qBC3KU$eKVOpB=Xdd4!}1c5@OE#_E0E6-{@nGM z^q@lCclix({~H-Dd!Uw{HpR010EvjVnMJV(s& zyG1vY0m84LlYG$yG52k)6JXNz>m_M8ddo5qMMf-GhA(Mqbn)WufQcME}p)PC16lt-s_(Z^h3^4@#ceA@@Nr@c%U zcoRV{0r;hxNOK5U1(=;Z|JDmeg2`0bTLb(CdDFlDS=bOH%~M4+KMGH7IObAT`56YS zM8Z#Wo-Ew}M_nb+JK;-Iba7NC1Kce2zz)%ZNT9Ie_r$^XCM7a)E^ws}?j0e$3;VtK z3Qy$LNU*BNfINMD7=Z>!^ z7bUX=J331>PYh!D62a>9aGhnMm$rIN3ZFd&n1j(oM}pOz3a*N^Kqw`=9P_yz|DS69 z2D%HWWLVCRpUeb55@ex3+6DlQg`WHw&{lHBt^Y`Wr~mt- z1g$vq32F-%!#i|h#&28hwOi@Ys~m!-qx4PtkDp= znuyF}+V#W8^vsCMy=s+!R=sTn>%93w4qDCxvey!%VBi1#7(wq>lyQiqXd^-I=i36f zG}x{N0QRriaq?uQx#jN3iFkt~$z-!LrxMY}@X)N#3wy#KP-qtk^G}owp>qU*>y+I#B+`CBC7L#0fHaKymXes32Z~ zD}9P`m5U2leq|w}Vqs!r0#kk06sL!KD|$o_uu|ZfRiGVnWbBc5=nTn5TtY((JiY$y z0j3VVoCYDhl@XEr7Wx5S23ZS52G?XtC0tO@@VC%(yJ@pZLsLt&E0q)23pRO}IbU8> z4RaQnsI7R!3$)LavBQ^e$kYdUl=iMy^!)_ZkrfHu6{hWs(sB+}r~&@YOp0E@0Ggu@ zU%E}4VgEGGXNeCOZBLfA$6MNpV$WUCqW5yMfgA@IC!Bx`AaQGY=`rcz0u*0Tfh|Ot zIEgTjo12V;x{rk%R~Kba9e?042uXpDuK*&``v5&e5&ZHl40&uGmww7S@&XOkowy_eX8lQQ5V z?X3$t7cca-KaVLodO zt8OJJ=6e_6?COs|V-gPCCA#Z@nHf-&#f3t3By9MeD7tWPYnPrhkl!ujXa$sA7^fB1 zD}}C#V_>R%k7%(4+&jP%l7Ykm#w=HnH^7UoLLK#f~1dPdBM3ZIk6eJLf+B9`uAlNwc z3E$fTgme@xV5E1mcdEY(08`l$NBA_e1bjUbMv_-R)CJIUU#K75Rz3f-{5h;B1z7%D znYNVCh&?FoW&A_|0fhx}kO!X3HK`Vq^;JT^S>;_G)EZkYY6FspCalFX^%*9u#>?2A zNdfw0?!m=d0gT3>xKLRkvO}GD?_v-xhy+dO4-2&m0SIsvY1;K463B&B4P|zlv98*rJ{Z!`q_?`J)A(%wvWWNkS-e<(s8yTmu$^LD-#M2Kx3T{$iPc z0h!^8g3^WKkAm*j=d0K*M?)ka%on*1wQ|(r?}2{BM5|IsuU(S)K&T7o-USzAlSXI- zBiVRCRN7b3M*_i!MXU&;Ns6-A%41Z{4%L4EveW|5{0t&vRr5?KK;R-h)1i+gJSN7z zm@Y&e4IZf^@MY5=GaWUhC>X52T^>zC@z2vR2m)K%aMpBwfe(J&w0J9UOJ>JO^;G8MU5ti$ICGoOiRJHE*~0<1|Q14X7` z3$ZLmT$!IZ4qC`l1t7fe_5}L7h<6z-8PV>6cQpL)Xm&eA< zR5tB&Z@>*FueWAi37xit)hC9DmSUNw*l<&OvepHWsC!ITEDWzAC(1BHPoGETS2Wd5 z*gvLl>=xs3{)wM(_*BQ688!3fix3Gk<;FEJ>QxT z(Nm{mhY4?+-qMlb+3Y-Q@M(W{cbb=8!^y8yn{`dY0ByKmeV^t?W^O4qv2^vvmOfo!QO z<^=^~)2rkx)BvYDrZgFWfA_-51Y|Ry1;gsth}-{SK);9DdcON3&wTgewdQL#Aua|B z_c9enjNnzJJ*Apcx4E;QKoezVB}$Bc-$`(p@P>c!juIYBn&5PJ)>N4rV=%14R`J|A zj-STYS}kH=CKi6}71jBSvhbsVXPoEFG$w5e@q8O2b~f9F=a!4| zN+?*zdHK08M|u5`(3Zb5|ACR!SgN#jM@5P+^=kE*aoL!4e}Y|8v~0p)w-Hg7sPFqp zrx6>Q^}6$wg(<=4HOW(tuaCSN`_9<5-KQcQz4Av;4!VMdf~*H&}ve#<c!VczAqKk=Cy z4pftG@MsKPm}vN-!W4oNl*I_@Q$RRdCGb00@cDf{Khj)@CytkLo$sO)c*rR$vX)oX zPRf3xtr>$#Zb$$L%(MH8M~Dqro#5{{QL%yQ$E z&WBm+s+|?FH;+Yj-my8(gp_{2n^1laF1k^*Vcm|7IXIeMi#`2I^sUR9YD8s<*VjGw zWtPYMMoU)tC7qt@x2j1kq;O!_ZniR1~ATt+%P^t}q5$2~Wq zrXd>{6Rw7G@${(ta&hg+LqSDAp2i5#`yhdk0XuE55XxM&7J-hL9AXLEHp#EM;G#TH z2Ll3B@k8|X#3~WiMBc7SD%Zq4_cM3h<<|QNtL4c;ZUu_fo8r2Bu6fzNzi*VUl`8rd zLW0ce&V3@kmPB)|gz$p6H)leH`=xAZO1#U?j)F%4U;BA>YP0=lK)pAd$Yvyc*L*$3 zF#UUiL`1{sO$u8Jc|+ftz1kfmtEvWUV*>EZj1u3sX<{ML&Sa`+hVB>0v8@|BC-T;% zaeI6#tSiUU!Tra1Reme^jZGAohwEKw@*E{!%Ep&Jv51)MmkhrvQUBhW-Eno4=RcR!Q1BByW7U`G!}goMb3iD%(`c}WgxYs1Bh+o16eUHKU@Dv z+?nP#En>8ByuPzP>nS~*7F@zM$_wgRd%2_5L|~2I3<^xC>!z^6=dYZ5Us;r$7^NTIn8rR zd3HBNe^olKijA_s)M>?dBXM^YypMAg`HolHLE|^6auicUUeiOhxNgU8^{Txf28ZBsW_b9Z?yBZ5rB&m1j}XmrX*yzUf}iG4}SYAIYepA zr&G5a>kb-xJdR!@xc!p+RuLBM_!KlBMr9=`d~6*%=H4ZY>v&=;eh0rpH&$rlJ$=v> z6TK`9V30Hh#BKy(__T`bR@NUP4xESr#5nmtRmXv#>vvE=&7DXkpp~}3Xn(bU;dVg$ zTmQmW)$*#)^?U8)Jgl5d8`Bj>XY8)+2sOKD3^K5|w?YSzt1ZB9hH`kv?SD!7JbqQ^ zDT>dIM^(w3yT#Ek=K!1=`!zNcGQ>jNuuK!_xBrEA!rHO!dxKsz5Mx<`~FCIL)Rq951@IU9o!E8 zQ2kwiBur$6O@9X>+oK%*cdHYkd`)4;8+JsUf?Z}pXKr%G4-0l54fv;Tnu{PQWk2rZ zw{iZ$DK@kd<}mAbIh<3Qz7h~F0L_4SbYEJ$7D5~b)A=9%NezGc!%|Mi{|EgS7gWrH zg2}Od-Y0|yB;P*4cu%#Uc=J86gsbS;K~z%bYH#w+khx;ed^{}9%SE;5zG&V}zbTix zgCEm57&v}oL#yM4iGvUQu?_&*GyX7@D?opa8I2ZUt6(|(o)=)l4ZG~J@UsY6be9!s z;hY}!Dy{rrj#3w^9D@0>^|28`c~*iZc`75<bnlqpI{I^q)qdn=OC-!mz@1G_KOkvn|zM+ZdxYIoAli$WsMl$Z%byRx-B>XdX zR8$w!K2wmJKWy-6E!y!sEE~rLFGDO@-X!d;SGg&Uu09v2YE8WzYrIk3_mrijXu@ZN zlS=v7Cw;*c=N3k>IuD=}KqWnv)*DeQF;=&D**T9z*Ty}2s0nefN{!$l!ux};t%FEq z9xDq-+i{9AgpiEA*hTa>&Uw)26>a>Q@(6IOHJMD$sK&0QZ+LfwOjoEfRkTz^fnE;X z>$TCB?7XkF9Mwi%(X_15ltj^_des19tum6T(-_EmO$f_(dSB>wrLz8GLrWO!^&dI{ zn6X3>D7jCD8$SKI47k0*aB_@#+XKDVuUQV+k2h#YlXkY6dF;Liaw?$_?XMc8I1QPS zjxCK}L%()uZ_2qfz(BlBlu~149$t_4 z$gQSA?$n*vzJL>^Ayi;Phd>z>^IIUN0Kee7SpvpVZj~#Z2(GY1xym0cpuW?K(5&V# z{V;tm!RrC~l+Vi?c|*_KZ~g*L2An6ME8ZhEuT{J&d`}t$)+)2Lv!DKYX6&_2X6Qd< zfi{P8G_nQ|>h-p9$FM!`ITGEeM!Z)ho45T!b!}h7?ju*E@_S0NbEeJj>xqHWzUzuH zJ=Xv4Q|rv{V3z-=8G+CM0+~8;UH?!^v3v-ApZ^8bg=!FH_9}IqZ#5@Y^)I>B$+NWO z?MHz*z8Wp7bC|)6L>TFAiye&aoa{u#>v-!Wg(%4oA|UbS&@1P(;4XL={`~ja zpvkN9bIhjx^pFw*OBPXno52Z|3EPssoB`9Ap_f3RaQYgzNCa?lt%pz+v^Gqyd+48E z6^A@BlMq!aFxsANqWq8QdF8b#+TdP_|73Dz9(V-yX7HGH$)A!h4$>Pwt(9&(pVZ9m zs@W2!=enifqaH|3VomA!^j;+H{Q!F`Dwlu=aN<=bg zVk_FN5SqR6@r}*~-D6eaTLrP4^Yz!(GRO>X1gGOXlmM@c0qi+?)K<`{YC4D|#Yjd| z)W+khUF?SIp&kW0>;LMIfQM#ckvlxCam; z&fR0XIbTF{oFeNQ-73-iCblvXBO;P4dhRlYZVoa^jJ(5MCRj9)8~YHpgQ`OGUKY$G z>+d~r+?Ln(ctO;&veW#It7(z^*@El+vR4y~^GnAw27D$`)@$yDzBVXD1%&Z-kg$TO z^Jqa-4V&XvUEN+_B2Ha>qOu59suuC)5J#dQZ#x5iNfcD)*zmM9+WWwGrQq9jiO0NC z@3^fkRm<%{s`lCDC;VpjW|_+LecVNdb2wWu^59E&A{Khr;*O?UTmSD%EAS&a#QT4E zh&myBDtT{kepeoJGT*Is*+vCOFbK5v)KK_yOl>_cBg1X6$>Sazj=|VhH@^;T)Wj%g zpU|l72Af1bd*;25NpqlWmaFr5wSK*PF4`M3%15SEzm1Rd_Z$ibrqj=1RU@ zoA7Qpotw*x&gO^JI5QkF4E9VMnhW>Q3Iv7o#t+n#OI`puiKtVcjkGg?O!Lk{vHOHq zq-trK&+%tdWKU7oFrZJ}Y?JPK&(WTt(&&%nrbubF7ISz!k=s^#oIa~qappmhLOjcn z$j!t!CP_}8qNFw0J^3|$%@qJgW2>JPz9&L&4F5C9C6|Pnz(P_KvEcM8MnbpA!mr;j)fn#}X0HibtkTV&dvPawv^G(C zWNy7h$J$Q7(z@vB{n1qbXOfdLnhD`$*B<%MTX1xtkD}s_3OOiOt|v$5pPo-9F(|eh z&&7e)#RA9zgT-koUeiCwFa_7@bbY;#jbrq!fm$^!HpPyW+RM|sCCzB!N74q)=CyCm z>N3g1^_5?7Mb8%fwg9ftgk0`uKj2+EJMM^BD@>)v0YTCQtqb5K%fla5i`jn_raF(B zB}93-*n|zcnIH1G!dqYRfhOVfI74jnWKSRXW7E&N&ozP zh8{?)YKVtZ8$Ky}^9ej#4LBX7> z^*+@din7Yb717=7=~1S@X5MvJAW^HmxDNI*sKHLqYcekRwX5 zES#?L0WIhSBuX8YFIn@j_ro7CjFFxbP;f)+S{McsoqmwakLq=?9=8t|6t!sTn*u6u z`~01Np{2^-FUrPplvVl00P)f!_yFXEU0^~k+KDm0#n3QeQNai_nib-Aeo6CeeQkTG zqc>Z%UM~5eqms(Im`=vk;pBCpiOq15>vh5YL!tWE$2SWdnyIZ;pGhy`gmGQNBoBf_ zA@zH2oGN#T+G$Zh-GooyOTP*?C~WxTNvi7fkHBI>Pn(sbRe3;W zkb80SrdnjfsRL881yEXWs6fSTo4BZEzB4g)8xE&qaVBOFMqhh)PuPU&kEn)C$GKlV zV?9jeI(X2dR78UuA4wNIKy)1M>lU#(?hcx;Y2hjHee-0* z+9cI=VhpGyEv+9B7N+@sn(IxlD}6FzXBWv{^HAmIb6aU2dHyIopbwyJRAU9`{qg5M zzf`?{I{>=WR{|B_9MeUS*vpQ}+*V`>Qh$yue2_*nUJg56w~CBta0e%_w(`G$a>r1Y z=^JCLBohbjdoMAr#1RJ_RZXYvjpS9ojFqV2{C&$}?6bVdPg1O=NE~ltaRr2x>gKp* z3u7ZC@eR%x>eY947Lea$ohf!ZwPylaT8&;OK*?6{{@V2mL4PMw+ylEr-$7EBr-F9K zC&@W*eidJ*Oy}9#yK_&jZyx_>SooP%;58eqdmSe<4`f=oS`-${(`HU~_ItoEMU!Hw zX~gVsuF+*UuUPd~Cn;3SB+e>dap?4>ZymMC{)`rMbLI!Oqmt)@yZPqr03cbUI2OsL zKM`rEKqo<+{<*y19zN+j})hr~x?)FAS5YVBXe}AZSMi71wJZmlN9Ga-4*}-piAX(IfOK z#rizv6|bfZ$R76?5bOW+jEI1jApMj>EC1O45dWv?w+=hJsrwDxot_&u^7;+|d)`wR zy6ZIO1t=}|mtDs3p5CpGmMFF8(`v*`(0EGT8!FN!zn8hXZ??*zE9+yqOlHG1?I;m{ z^&Ote{+)om3A^%-A>&s0M#i{~2e={Po-V7bn=Y?<&c`3W9{h?Nx6+Tqf!BV84|vfg z+LjGlHZfg~u9zb&da9Tq6}z=jeSYRsB8iP2bGLz>eh+uoU_*tYS}QSw zpX$BV1}`(5`yegm;L>1cKa8FX>B##6q0giclcRNY#ueG01hYHeLUHlC@vp)uA_^Rz zry8?uVR_M+2R;pw02&pe9`ECGj?9Mh%0E3KSiT$3Lsd3(7yoQuXrmgsSvATKrd4O$ z2ztX=-25T~Vj;HETg^#VC%Dllx z9}DGgs$?Ql5ZowyLpO@-BJ*2$s$a$PMHz%m-UjsjJ|cek6JUJhb6HCrENt-HxZS)J zY_eVl6d4!;V=u!*EK&KbNS?GQ(PsdDEq5U0?0MU`>%^y>xK)}IugUnwfg2pOF*yv* z;{_ry8Vh8w*B7S&H53rkDaP$#Uf_BrP2{|?p?KzG07_oufet2L)cH_zXHoCnP1-Rqf6n#cnpYi$291J;rD@9bX$Z8=u(m!(kme8UB#{(6^}( zkHSRU;hER=X|Vn0y(gzY=?KAM{!@+L#wu=&%~rSyDVg-3#y5ERpT?upvxNcXc~rX{ zwCA~}p*!^o52OaLcn3+^6Upv(lQCn9ta2ouF=gratBOrV($r>hsk1fm&j`ny11_YutU|tseu3CU9V3zBZEo%vl))7InpZaZi6A6ogWRz z^og0p5Vr_OtTU`KVwY-v1V{!KF6lN0!AuKb;k7O%O7TalFBd2o7VTKIeel|_UL0wj zbuI?}lh5f@;=trhVR!;fqf{7AiRoid43gI=a}Vh5&TuP1idg(h?z?1g#B#l|nAG8@ zvd-*oIf-;P3jcNR#>Kl$W5@TTkc+9$D)s@RLcI>D;~`L_z3?{l;!^39aOh(pHKH?G z{Utrp9%FcOg_sa}+qhxKd<3BBxWoh&8D-cDf3$#Cz$*_W@cM6~I`Z-^-ojb5+Yj;b2b5i7Z{- zqBOLztX;!`gR%jGCUJ6{AV`I;yGoCwrje?D)I&H$AQo8uuu&saP^bI5B5$ z4}DHvNU`%y_8G2Rty|oA5?kE-yp~Nbmeut2gVhJTpxrxQVM%-=uPlp=VgnKddek^JYoh9dU9F6u53ykI!Ol;qZv$;Ep zoDI&0QOa`KYb7sNZ`3w1h4}gZOwm3+F^~OSY2L-TikV1{{$lN^Hb(vzD+|sXnM3cS zt=%5QHd9$+rlZ(vcn_Pzo{Y1o+*BIyZJk|KxuFI0Ms0rpqFYL`?>MS52^sZrq&PjE zpfEeh73zts@tgW5zH+KC<>7WR0}EA5D>E&Y$4lja z48YUkip6{lyg)a^aaGB^WJFxOi13+7MHSs=sVbl0(oCqI&=5iy_VkX^ZF#F$zQPtX zZRSMen5(fzRo_#bMh$Y6vj4VfZ?0mE}sqIgtN(47l{TX2FYsb8JmO&{RWzR z&Xac&9Yfg;mNF1tfUH``<9&R6%G#InS68RKX5OjCN`+C7XvPx)5=JT0WN;jH%4H}-211dqXo^~DF9l2MqF#n-pG^2Ui2~m3(@?QM?q}|Q2-zFTUB{+VUymoI=5QV| zHOu|VK|>!Ubr7mdF%~K+a^|Q8=x>Q(BA;XscVOWj(*b0|-*MPEU7}6seSnq*#^E|1 zDSEW`rkE9=fU~nO(R@R;e|-GvE1-=JdFa1<%Q#$yH+>QpZSA*<^rfc@KHUorf2ah z_*Kv6y|&*54=cAwijcjiJ3C@$u2TVJ{n74#{duHRKLMwqy4SE4dhNPa44}(U11EPN zZwc@j{JSLGx;l>w-_TIUf7vM5YU-)U48KfQ-xsAw5Q|+PP@lqfN@T;6&)`B^_dOR?QZd2kBV+3J3mlTSnIMMoR@h)8APqKPjDbZ-qAndHX)sTDFAKwN@m zS}G>4#DYL>VQo>9f=tD4CtoxV z(Tf4j4js*JH&J^Re^lYL`wodAUa9iw^qL8YI;l864D0YYKc&sx+3=-drrzb7c{e%g zD!l!ZHmUYd4qNQg*=2-G!&kXHRV@hxoxFVC?{Jx)Q9o&=K}jwXV>%o~3X#8Kk+T#Z z*(tz!ol>zd#?res<6)p*9%_RhudYOq?22@KM0_)mFl2kEb= zTLMj`Qa#oB3DdgM!0WclY-NK#(XUxA1Ik(=ZJqPB8^CG}?ekPB5x516<4B!m}}zoI@pXBEdS4U$%J#m1B%SwnCc>zNnYdNvLNu~FAACNT!C51a8}Y-?#^XL7bG11^h#6NfmW>PC;7ELQ|3;a< za~~%qE^DliyMt=>kG8yA&;8={jKpW&fVL;F_ElcX3{Z`(`<)m`pY1Lg3!q2c$1ga-Y0i3Y?~sLfj?p`B%0KUgX3}|n!hz4p^<_iGhP9&uh)e=zk57ndVY$9VLOhT zz^uK(l{z{4o;099=|HMa_eVO`Ewjza5ZCV|*8|^3Lk-y=m=0^%%qSWEbWT`0nR{QS%uCtcC8rLdM`vhyiVDV&mMWOt3C^P_nkG8uJb z(s6$C^e%7)>RFM2?^qMHds+yf`s^Gcq9$9}fs;cRxyC0406Q|P*^5?G&SQJu4|H%? zm9#-PI>H>)oP&pTv!Q~j5AB&H-tlijgGWwpPUJ~b8habM|EQ#P(Nakk1qT!AyQfaP$-IzNfx2xDNLQ?j-88D7v@pu9$i0iGP?5B=foyJVn~&p##ag-Ns|iHWkg(MX2*wrR}b~o&YzCL%ze~Cc%e4 zAng8l6)X_Hv4~BO@}I-FbkDuuIdw#Wy27I88MDVHi#7XSZ@0L!R8^e{O#_FdcsMge zUk0;*e1Stdy0p-JaAWV5>tq*=aC}-sg)LJeekn@*v+i{nx&8Fo0c)RsQCI1&mJ-B! zpfiX%wury|CLj`CdOyd=MpK97w$5(djGa#rbNGqi`gbB+Vi8MKz?V7O`as}iigna@Yq1B=&>s+^ z@jd{}r_ zV>b-OGGqPS-uLbE{r%I?apVs@&;4B2d7jsKUU#Y9hT6?do}d3(i0Fc91hN`|1v?=b z{ixkhCZ-@c`w3da?Ki8;lLX?cL_Y;Y5Uysm5PtWCsY}aw{n1Tt{K6mkDWna4u~%Z* z<uN+J;Jgn!(GQ9P5vLt6oGcA-k_P2Ai;xe`lVD zGF2e}=ke=_-53in(SXG7U+Gm0zZ7(^oN5P|IuX^d$1##4cLO1ul_O2#3QL28K|^^a z5g^+2aGgn*>~qPM|$2^rF^q*|@x?Lk9v)8EHU zq10&;0njC1Y>93$X42_JIM6h6>zty9-Yu|(?E(FYmCpsEN#JmW3tC1`2Aue%aS?mW zc-yjHvpd!GQwUhb;pz|8Bk$0RJdVHdqWxmB0qbPDAnJu>z>&xQEQgy=;2N;wlp8@4 zxSk*>^CH!+(D#}CuRpr-2F8sft`b%)Ypot0zg5O@B(=R)?#T0tUu8cEqxn{U-I`E( zJ=?1YxcWc`wJ0W=INy3fWnso*oH90|642PXw>32E4v#xkx8pq2Hnkt{RSPus>;or> zbxK=)(L{`jv{B3&7`Y3h@>hUC@zc@siP5CvRm-odyx}aG`@alipod^Q?~vu(nLg2b zDqCeUkSfnh4WIaxTJj(4$&c@)IX;)kL`r`tEzahJDc^(b2m(ctKLDSWb@=n~cidYX z6t?#=xLqwm&f#qU^AWCYZ&CxThAZqI>U6W1`uJB15Vse)EV-Lygh8SC&^pX!mASEw z25(HLAfr$ds?X1FgR`j$dz!#!6adw`gdTqXURwNPs*GJ2=d-7#+YEF9cg&{0?@g9{ z1tJ=76kWleXWZg!{q^a#L&MQ-*+VK1dJhXt ziXI}`I6YX@}zEVkGt2 zi#M!LHB@uh7U>eQ&bo2y>BM~2%NNV5MV0f%o3U9=`m|gxw!him3Y>D>`Ta82Mu}@a zF{vzQ~sAJ`yw;coWg<1Ub@)H?pW9c*Hsr(Rq$YGtjeQ| z_*K>RCru}&P;@9|yE-tvQ74eT)p#KAX9@t;(58R^p;&&bIhcx+0x@nW=hQR`sb34& zDUcKcu0Fb}eW<5Xsw@XvPT$W*lLu5kK1mw)Ud)RAufe}k@22ky)Xt)!1XCr;P?bwH zon>~t6`+I-jx-*%vOA3&?M*p>uc*ZKcEU#Yg082U$#$TP(jIvFBLE%y*gL>ARN{e0%pVV=;*;Z}my*Lh<pfUi#chUvVt)V47N`WW3jZomm+8@ww*j}8vS*ru4|sz2{IXBg z=199~WPZ}S=sP6)vb71blvM=kB zRy1qN;pjN)7Y{jk*zSQUBs(+uRvAlYDrzWvyRfV3>dygV6LK;<;^)0+@ zisgY<Dm|%L4A@ws>TQKByziwF8c+nOBXMc)Rx*w|*jaYXrE)EDp zQUPdom#0f@8{`;JCx`jA`|czH#KCV-lBfxSxw8G&Z}*B$aiDd?Z$v?d0Uxe{IB{1yo z^o7qT2+H6v_D<2d^85+69-aPr9q`{Cd!4$$8gCK`!?_*x*Q;`^pR29EiiqL-iWz#q zKJRn1Y&Zl&;xB-9LYq#2yNJOg@A|vjRHh1cH{(?lXtoVLgtAJJ7N+XIm578*EAH`MjeaHkTb7a> z@&)n&RK{IUD=&-nrEH&429_)Vw%l(n|h-#`o8&O>SNPtDFW=@nnhr5&>I1MF?GG%9$C% z^(2|=t*MQGXW9RJKAWR?M-Z)RwMwlIFpaqHR=Z%@ucEn->*RIr$o=Jf3KRLl+cy)4x2H06zDH?Q)OR7(4%@MXvFjKMS!Qu=z|yKAO$UGW(~9d8Q;XLnY(sfm94YrwsuNDAFm8D^zWbyEx> zzK;j&?&8I)*8g>H5b$LL09Co7u=Q)>-;v-1BVFLLBvDTzkLto5p zY+VbS0Oe0t(j8epqXr}bKTvinRtsyxmZ3k>6x{?G%N+qxFeJK@E=o>p4$9^HFM_HG zS?+qaAB=<^B&w9_;Vdtf73|i3I{Dwh`K^Pd+*rIY?6lDKCHd~~(_at%cX(Xs`&{nF zfYq*IZK`W;=&i1X?wt~3-aZfIQd-41y3>+$Yt(D!x5@2U?S<~NaAqYzG;XZ2Xu@ap zt8lP2l^=0F+3Wn`2SXGW>`N|+%4+Wr9C*%R1@K=ZYoSocaBiXuYxfS|F_l)Y!VS~G>#i7vFVU%jb@E!h>a?D0`05~{I?CqoSV-z^F?2DtlTGTVw$C)BY$FX z<6E5)+$n!_O?#_be_e?@E6&Y(attiU{k@D?BS9V{CNZ3Qy{ZRaHdz5bRWhwbtep*d z>2%DkL$+5U@dJp6 z#m_Qd)x0*Q%jXk#A$PB-Tl`yfz?54^Cg{{4%;nO`Xc%Hm{vW?Oh4dlNU+ywM=9)U| zmG`+r+%*JM=!Y=Gm9%k*v+et?SKF}&Z0rnMV)Ck%Xr2Zv9?1a%f)ik(7XHNfFiCce z6@YwhtyH?tRWD}BbhY!bd~k|Y*}B$a(WG5#Nk}w#xS3lqff&pCq0gz|wa!fzzb77} zu3F7@xf>YXH%^s>zaFGZY3hD^Hz9{q$|o{U zx?s?i!UxK@x-w2sti|8W0&KV4^cxA!`wg!%{JQXlIbX6EZeHL6TmvtXwoIaWj^P1#g-uo5 zBLMpxeSF{i(WH$($F`Rl3H$%77yI|wUcQmlaYhi-u?%%Y`hmqhhWlhm_jXf+b`#x3 ztv2FLZ86>$=4@^0g&o-1{L>f{MmzvJ@?o}cH?|t$EGswWViYiN1|kW8 z^T`4oS`(tO4jPEo$Q8%&DvsxQ@J6<#G^hG!STDiFF{g%aHZh6<#b?nmUJAK&{S5&D zW1xFByC&!mxQ{|0%P0H84I7YftHTV>NvV*1;Ns8a{kXVabG*O0mT>!K2{_%|_sne1 zkGZsQt^t60cBM+q^s)0yIGEj&pKA#R+(J28mn^*vd<=>P3ydVz7qrmKhq+(qj+oTL zK6m_=BnW!P8&|+{+Qev7Et=h!HB<|q@H_=+yBX-Oe|Bh`CW!6<{yI6Dy7flPkArgK!Twq8n3Iq_&d*cFyOk9KdLlY{@2}Et@co=nQlyM!+&zFC zu20nF-|OKI%i0H!Nh+kvP((sRdc@9unq=x7AAo)5A0QCqBtws`F-;_Rp=UwebOK4@LZ4z+6)6<|^EnMhJyPLBkaOafD*F1KHT=*?lFeahX7W|7h0Yi=7|{kY}fIn@L2qnG*;fI7X~9oibc2= zLx?_MnmRY3my!aN{$fHgy{xrJk^5lI4qtmo^Z!kuzTKP#FUoP3?jqVru4(piAjvLh z(`VTqSNgJCXIvUCLh)*INk4w|wX8?!hMslK1aQP5tQYyG8`dhuumF}iU%zn(7>I;I zSf{#a3=ebJ0rn?iIps^N%*na|mjB}kP#Rv&iprL`U3ujd(4%&8D4BHa0ya{lP%@+& zwhJ2ZlVl5oS&E@r(>0o)_ISbYybm`s*uvb-MYCPLM5kw?san|cDL?c1?GFZ0@E-bW zxp8R4ozDG5{x{d4!6(Sp#vY{TxkId-8b0k@({`_u+O@7t+9B56akpM|N^1cAsO^a; zP97I@AgLGY#8n^@oGPYAYfb_B#2;E8^kAHaNK5)gLlcmk|EFfIM5wCh>$joj2pnBs?bX??RFub% z8Db`snN462V=xqe@Am)rB;>CaAddi0u14U+x8L{50A6XAv@qmEys9nImuT$627(&PXb!<3%ZztWcF5u|t3oo!&{A>c95t@Jp83-iB%!KFEWhUL@t>gxlCeMc1pKth^g*1;Rzx#%7 zKBCB3>q(W#Pw6iByLaW|bBM|bScY9Y9j_yVpOU1Wr*|-+A%3Ku>C?>d8|C`d z+yRGgtRidoR|=XHAmf1HP9cL%YZ~hUqv`Wcc^kLVi&!@1lP%cD=f!aA>=?!Jv%5vb3_SzP}#dJ%BC_Qq>^t497CGJx9S)rk;WN+!zs z<9+*6pdOsDDP(2!5Tz4kn`G8nl*F(LHX$%64t%~VqE(H){9s9t#@z4kIuD~LXo~MN z-7LnH)8+E; z+slO{0uSha)KuZyV!3g_jpC%t8eS($xv>-wKg7FQ_kc6?`fmQKLtiZUk22@UTwPk5E|H=-*W$8_jQu&~MGsvf4-RE`4DUie}U51B}6LvGw=B!U<4Ot z|LLGJ*hLVJpqqG-<^Vyd*|bJCMtK;M`n#JbC!Q8KtZdt%n#*F&5a~$b`j#{?MPM7x zDyTerB+DFg$pYBde8fAS^k#B~Q5HYoo>EK@?onLisNETQU~y}@VWWw97yJ^ctKX*G z4t^K;pa12s&fOF1#2RStI$Hj$+d-~E^&XFT7?cnba`*yT%=hNg*}iEL6^=78KbqHX4(kNn z_;>lqowKA1AJ)Hrf25Qb^M7BwIyHk(BuNALfh8eZqGZI85tnHyy1L(0eN^ zLA|mbXLc`Z=Iwd~Rq|L#cson&XF;(rvn=sp|Hxv!|2Q`~?gq3Z^Dt*BqSRZH>%?j`{P1mI9+AgNP5R&Pu1l1(->GTp=?TXYN?h8K-H^%^hx?vE} z^!BF8=8xi8o7gLGQ?{S(F-=Y06iD(jseQeSnUVQmbNCTfyoEO_(rs>jW#sF-*v@Yj z4e6_%ysA;0p*2iir=iR{Vx*RFv58qoil(EN2N(7f*Y(H4w>}k>CSDIDGS#}#=TzLG zr9b2&m_N%)#7>L^#1Bp zL&Mh!;DS|N24&X)nG;0-T*%(ocDV|(<=?Q-w0#>tbsMt+zw#AL zaoUqj`EtR6fbl_X;k0en+EYD8I6T_7*HHL$zXkZ66@nUHo?-8mUC32fc>jLpQr+sx zzx!wZDdP#zfX$NUh~2%6h(P(Qd=l<1TWWzOkryXKbMPI^2&SQriC7Is!J zXo3@)Bgo-lEJMJ)+UP7cA_9VX<~qkPH(BuJN4hI%tVg?RV`;0*uLlG^EK?rD=zIby ziJYyqEBI)4qfGA*t$w_s7bf~YPP}`MQq>ZznW}F$^R#jTVW0DKX3LNCc&R_v!nN#( zl#Buz5(M-Gecy#J_=fXh;(?qRj?>%!OADup$GP}xEv|m-n9!!ihOfM9V)0wy#J;flNnBWyL-kjV>^N+~8^C_vc95Ca zUhx5h=(bN6ZU=mo@?V^+d84PqZM~B9g;Q)od`_8!^U+3O8!@V&!)~Zz+_m#d!VA0wQ~5KhQqDSgiFWD0eWG4 zr;WzwA~dB)yS78-+~UIfeq_skI#3o1)C)Ib_A%CKa5SGs@gC0E44d4%>jW8^}R9fOa^vIwIgJ8@UUU^y;-?NYWyGJUK!1qe9tw zirZf3L`rRb55Vt^4F?mrXwG#}hMncX@VRpFo6mSMmNf#H>%rjrDFzVD7b&u?b3Y{w zNHmmGX&P%KWG#VcEL!8s)#Kv#zTOSw@=??j#{k8%i-vK57K8v(b&8oFvNQMHgQ$c2 zjT#RyxX-c5+z*Xy_Kw9satS2N20`Yih)IWZt5`NL5GA?3TGY@g5^4YY^IfYU6n>p; z?*7cX<{zr4J7DN8e~O4D;W18CGhrJt)F~a07he}7x9=VFYRTL-n?GIMLqi&JMr_8k z>rJh|$fp5w+gHyEdS!CnStxpgZF_ZQ^3;3mFXi3(Kic2Jd^VSbh{|Sdw<|+YHk$1W zq57UA3l8t4Xs>2pj@J=1$!AhkPQ^cCZWMOwTtcd$qzh{put{J;N1qYNlys2Nt0#x?jyMFht~hD+)X9m01jwl7c&nxrrmXJO5lSpq-^e z8O^Pxxv#Ucpl(fKudQoYPHSIYar0?4lr$Q{< z8(*>W)~;bzN~oLj_~{TcA91+dfaSboNC7EUAcsb|+uR%e(_(~}@_R3pPgWIZ6c> z0YIi_U*I}2FwIeKbPQ!H%{y%hdO{m(Y08yh*4hJ9KtEe1#n-%dNl=o@Cj z3rS-Rl@=|O9x^-M6TE?Ta6d~Wy;I7|aOTRR+}CoYpj!SJFjH`Iu<%*VYqhI2=inYB z){zxsxH@fx$m7;)6;>aMa~C}7--9PJ?^Me<)or$dTUdP8fm+HecB@>WqgTl4WR|%> z@=KTP^AWKn<0oLU_rspFk`QN{=i;h_z`hbR!9Y{goN=wc2}YOelrErY4uSgAb9ni? z!dXZ0j#0J-a`XQ!w0xyr2tD-tMbCeA?*5H=?JQB~1+)b9LK96B4QtnES=l7BlHK#y z*NY^kW2iJwN5V2iLH`5nZkdac+v9nSMztz_KdYxh^fe#_|BrdkZP8?4Zz#@NmgaTnIXv+}h8y zSW10A)h_c7%Y(Tq_%0dNL`G9OYwO4iT-5W&C+z15wQQYYmFd)M5**eS^hsu_PWUh) z*Nx7TD%ZOmd%HjD-eHW;wpw`GBI|k6?OA-ioyZ>0H}jb^Nck>m(9{2XNz#yL&au~d zt6HU|Am=~SZA2FYfNwKhVe8!|zzuQNB(x);{=85}8A%LrD=ds6$JVW9)TDw8&}Q3| zDH{RR&#$mstL>-qZOQ5cw+y_b_)^%GH0}X7kxWVSIUt?h035BgvF`-D}Zvgsh+R5=%*1{`aqNQm0xjcmQaG<)imiUqS zl$&R}e5sfj|28jz)*aLCAIaOnO-+$M=t4XYa1m8bnX4dpXz9y9FzYGryAc0%b)y0P`Ya$m@ zpf;_2Et`MLx;3eTec+P!Ed4y16I7$Fik26{G!+dV&SH$9SvXh+EA2BEn)ndMN;zeR z*^W54MfoG+NcX7{Uw%i@C}~lOe$S?!&9`W+iI!adu?mN^4w0gApu7AUS^lAwV8On< z2dZeA&W#%%7}fCuHyWmIviD;iM-H|{iPs1TF<69z7N`jnre;}D9%u11-7ErA*^!Y? z&BW<;P}ECig#>OEL%M!$`k(P6!+fX5C~6?@d<2i+ zUoF7ZfN-fh@%fkTXURIL3raoSZWfuzssHSeRgYq{l6qBr&s^8&y{&k(@QwxIPm3vu z=FgRd!$KN2w~#~ehcw(Rme3s2o*E#nzw8Z~;a53zcr=SkTGH^hlPEWP=U<~(JyuI< zL&9K-C6leSR5%|YHJ}$1ey1I9z}7Ldn{C zh%X{}{88R^jh~ruMP0mA0)+Jos58@58o93nSZF)Ysgr|jQ48}#s^vR#3IyZuL>aiH zg%S=eK7Q*MQ0#XcO8dUgZe^uXetzf=fi0OSJI7Q_QHLb?n_JU=ybM|Q%k+Fc$z1k2 zb_!~r0-({K4iL_qh4IMhZmi&1UyGP@$j0<4iL4U)4Hpu&s=kfNx%B|Kb0QPS`s$QP ziLIo!3-@qc-mg})R8plhNt+;xczGM9lEZKq4$nw}w#VLt&NSj`vA zgI+qF**Ztm&RO2W(JA1&ec-rR#2frqgYv#v#0D1Nw$_~c?o#9$el?*?A-McZpXUmn zwfU^KzZ);}7{pRr3E-n7>R||XJZQyXKwo z7>X@tpfeAFMHJ0gA=*i5@hTouI@^+EJGBE=9nDHGS`4#RLo1%*zctH~{bc%Gyep+l z1SY-hdz|yJ>BsroRH>qzbFS&;9qzcviQO?LHLXv9*U1;pb*m$pu1vE|I4};cpX$xW zIjl%bhcLL}0W7q8Co(6l<5wv;$bmXAbmOGfYH{vfJF{b!btz0_i1>W+ZvH5!eR+J& zK-ZFc#zrctIj$fxWt#A)r`NBw=+#>>)cdW$Ncty1lp0s?nhjSBicf`S8r25(Au~Hx z40=(q7&sEr9!P4K#=b4KWEL^>}Oz0q%93NR7&&<3tTP)y#Ih z=Y{>(eVHm89^Pt%-hgARav||iOUr9GZju&y=J0F`X5fC)V&(ZOjx~nAbUMEonTL13 zA+cA1!Ra(-!R1z$YlwUnig{7$Vsut9=vp@1wK~jWHpXBiM+5&*H@JL2q{yF=2i@|S z4)xylHXHtC$O7!48OFB9=j3Q_EJ65o2UUbO?dm88)5ROe>L$u!3f%C*pGYM14`ea@ zfZTR#;v#PJJ=f|i8O2#irdx^u;=Oyu#kN`>lq>x+xw$SsPXKd}7bB04{J`K(J^}GZ z`<3e%czH0y_OSV21iVZq6LXhPUiL_3*~nU%DNcMaygqr$Rw5{={?Es=X38QQSlv+O8 zW^1n9-}R<7!mcWKn;V}b&b6cHRQ1%S(4|LF{C;MrtilVRcEgjo#VjMMPSBlseuxL0 z-g9q+b%^fTdck~rac4-yp3IZ#>qOlQB+pw=f`5#hp&K~gTw;1p)Fk@2k0Q#m#l8EA zo&Qme<(=n7&_}R3KuyAkPRT9fj3VaPU+PPk0SvNm_#>Z4(f#xpYG0(Q6jZ5Gv0--fjMl2pmN_El{2zYs3_P7oORx!P=U?!m?@>!4Gd0MI6^|lU zXZmPN;ry(7(^zSD6`zjBh#$^`bJt{*WN}};FG;ueK&PaJy!Otl)-VDOW2kac)>RpN zRUIzF{HQSHQ~H*67M#*~!tDs-#r#w5YUV`+!LHujgN~uhE&Fiv8E&LiSJa4h>wQI3 zs4dN0Y#dQ8ZK;?c^71{kBJ&yR=CFAWp#+swP~}ohTG+(9R1_vQ6c&Yu#jG(FTVO-~ zb=S!{@8!?$-^a4c_Za!?EPfFtf5i8qt8;t#!^uIziA=&(o6i*2ivTOkdKE>N@jA%7 zVZN@i9%1B?)!7H>(W-o#l71L#+jAY(jp zq+S*9gI+n{L(_U9Ra<- ziAwDIy}>_M5_<7;)DMmy!D|I4k@y=8?Fo|9GFXcC$DcaxW;rb*GOMI}bfr@K&Anzq zThqD9_WQ|2CdEdwWBEt~E?7+HZ5ZG40^D(6T~+ulw_gE;=p{R4n&Gp`W4ToIDYMZ- zI&{5`j?m?P73M{s>343MOZnf;Yw&*7ih69K1~ql=s>5`{9P<{eUS&orv*5Vg+E~?1 zJZsKX8*R?Q_)$E)y=_|fm1x=T?rdI>mP$9X3d%S8{ychfcZp|vw0+Hs0|CxiBRU%ltEsO z#Vf)UfyqC2UXfF-J9M2fUU;%sYx4f1#^`RM-lWf}7>3aQGD~}Qz$hldchQ-cIC}s= zPG(%nvs?*>sb`%JnA7Irh9FTKgG&WpN+Yw^P}lC{7r)aHMPOy%0f$e=h%RdB;@C9z z$9sC7=Gtq*stKCAy9%^=Vp(W+<)Qht2;9j+oG5+|zccJeS!uaW- zyGWYoUO|`d)^bOHmQ;vUj5PV|teh8~kTy<8OwE6C|HUKKPE)$DQsn~kD>{@zmO|-L zHen@E(Kts}i((8FwMiXjgYq&W+4@{i^&UV2DFZk5QE%gHLddO8RNDMX8=X2#6x0<- zW)!KWv8p*!0Azm~bFA$)Iv%k@`C(6I=hiKxwwCa2iw7y3Ev4yE%qzK2bPsQXe>w^G zkXF2(+q{>F%gjf$M?YX%?IHDe;mhmsLYL@tt3qa#qcZz_QfFZ+)$r=!{b0oY{BSc{ z26t?jx1nt%Gity_BV|e=Sabj=@W~rx=lgvkCHRcG8piRak97lI8LB)uFxOXca|tO+ zG^vOEVkccF9~UIPc5djlJsc+^p4)n$oh_U^^+jt~0%jTY;)6-F}_Sc;320 zs<&lp_!Izuu77at`K*`Wqn~acs4q-(k&sB`LlVc6&(CYp& z_NiTAy5nTq0V#??Jt%N>yyyYg{PV59!pm-Ja9Y#yuzWGowW|TL>bH}JmKT~cM7QRk$P8+`dwsGTRA8hS; zDqjJNGX}T+8ZJ(67&ZO!xF6D{DX{6TYeOHTV+_CG{LdX=&nS5a2wkh=`yc7#YMR*? z!wW5t@WNfNrxiV$*ue5?nlXEag8hXRk{MjLYg5wKl4_@0l&A%k+|vCJ|Mu%vp=rM# z6b1X{cN@RX^SeVpgv z5ZyL`81m`m7HKUWSBLKr7-C_e#>Iljk8A?tY>)C9f#$0D86lG5Yn^rsbeEiIuhR3> zh`{EV8|t~AoE0TGh=lp8E{08Az-$bj7iSB~;>|2Nyy+bB^2gZ#Fq`?}p?Q6lHBtoJ zPQ-IPaEh{5&0l_8!lixg%SkF3er%3Q!rK3y`CSW=vL!6&a?lTGl-De!@&=mhob7Kg z)*dIQ{082I)LR_X8go*X2JJ%DP#GM*Zj7wxnQ@?z1P$=3Hen3aj$~C_$M5d~dhyJ- zrJ-1plRRgUdPZgO9lo>neC>R-9357-BpukOTkDkGWnR1RV(r^7O?;|lZdd!0M#&PX z!1O@kJ)2)CtF~#rL}Gb&I?6uwo7<#TihM4V^RD_dXUtxZyPMi@xF(Y6Uha;Uytd*{ zUM#oTB)Jx9Gwco3IrNCfYtQSzs#73J*tv>7rD;RoKDB~n&=P7mV5e?>91s=3aK-y z($PcCrpD9*`vJQqlp`wVhYWZ$%anvBi;%1cZR@0BRp3ZT=qXihF{}bW>!qO`@tHqM z1&zB{@s&dVrF}B6LIMn30*H(;Z5ockUAEStB+n!i#zR5G%{c8wF$?3w%He4NC z=@`K4df|7K+D)aj1Qv8KrES36_Vy6W?m}HejY8hEl0?1PP$y*x92 zJ?Y*a221iwYSVi4q;Tj(HanAwG{Z-l8ALIUbekA9K_d_1&aCp)Xl9MCMOD%0jESw3 zp0;h}j#wDhuTdfC>#0E;FUHpoUku)bfjYWARA`|bT;d3H)0@|0D-z$PMq7Qlv`l_d zIr4~l6?mQL7HHF^j5g*7b%WM^yguv3aq~yPTP?0a#Xr8yH=y=WC|6s|B*y$<9>FvX z;Rl?b)Sb*hdOSemxtLDAlifmT)kFVU8Q$6VJPH9Lt=G4K{CEUYefIQO=|@eLi-EV+ zg=SgEYpFiHVl_luDf!s0&2mmhfcyNw6_0;5>4InZJd&jMJ{)Bl4W9F}KvCD6;-5K! z!O+=L>Qx6FKa9^UEFaMGB3GPBS6WQLiPeOeR%wo4XGI-LpN86G_vK+MK@Youn3WlB zF5zi?^s#|tfx7+^s-0IwSKVi`g?a3B!u4Lr%^5zj9FNg_mzI1xsO3IV^eHdP9{yp# z(T>%bv&0^q8=oX9$6dumT4JfJb8FKG<)p#45FJKuEM$*amd^NHq_tLS@@?uVsinAR z%?ykJ=H?1LcJ%a}_YQ|j641zl%{FfNkn*DMyYEV-JHPW3I)0EXr2KM)K^A;s zB5z%Rhhr_a<8myCo)5NW_knd!&@|(WAJEN?z9dNYBIGz{YR@L{y)NHtdSbZq_A5Tz*!}`OyB6q_s0KW#6_}&Iw8`s zpk57j;4{k3!p;(eZska}k24It&vP>txu067IGSaFG_R;8WoJ~}GkyN(;SEj>9P^)r znS{>YM2;gR({N`O(ZFhFePW%K)hMcZAD9T93%zg_2j;+`a*Nr@Icdg-?cs0{eoJV_ z_0t^hz);DhcOfF7B%4&+gctI~l*O4kT@>+Fz{DGBI_~!UkxNr3ev`hn9u!OK^Oopqe44sQ zjwVk7_tGdb&!e4T_FBb59h!PxMcWRh$Tp=0Y*(s`P3Mn``;ZsVzJ6(#umxMxBN#8y z@sobD-5K&GQ}`Nv=Gz5jc+H`gyLBX|qQB}4C8L1pwu0#Ho5l21_9&<5mlJ~_7OJX8 zIfgfX8oqOTuj^^`hIt|g#Q2Y4hx9&WDTe^gvI%IImD|*J&psMIIJY)GJ5mxe580pV zDC>)MZZ1YCUg>#s7#Ed-{|WubfwHQ%YL?{mC8nHTGb)!e-$%RP$533`5M*2`f#^#|5)#om1S5EF;Wq-`Lh`0ZY>(>I;M2%@s zRHgfPeE&m}K(tqemI#dM;fLQgR7YVe?Du_#2)a3-;paJ#B1Fr(+xeH)AH% z91pr5Wx|q!-+t^&TT0Z&T^Z$aSx7mqOEXM6vm$l8bYkNH_ z4-AD`l&_UHL`JEr0*2iip42fU76ha~bczs>#FWW;rri)zd)?oBCN2>2Uw`L;Togd- zU#5=kq3=apgUkA9XjW`>IGI6U>K3#kGpkM2`-Az0^7Zpe$#%Sbv1Ps^E%c+hi)dsU zef&b<*(m2z%URTuZ8LO-DY|o;`Iaekr}Q1vt~b*`^od;iHGyL4j8N3$;`V@$T>qRR zE3^~8qm;Pg-qo6nzVg?+joB<3u~nRg5{xFf}zp9!>*!G_~a8l0<1P%S>dk z(Xzy3nN_<-6oaC`6|-ndkKcF2YG9q;81Fh-_p{zEDs({lvzt<=#|4anomB!s*W09M z_H|9gJs~QV-a~wS&4QVQa(fKvzC)*?VExsB%V+67nnDhboe$yOaJrsvWh$O7>y^DY zZc;|^VYxenbx^ty#R6RpZ#2qJ`A4wvhN2HkrPLwo+xhQ&PeL~rxUizJu zy2t+lC9|*%NbhX+gKHPKOnMB*z*zk?xqc;eMAi9?qCOvT4!yfl4x;#WvE=|Er#oRSOnY(+(FWcnOyvO|1N z?(;OH(?p#=_UHiHVjno1M+CL#ic0hR-0LiP#RA`gh-%jg>79d(TB!8sR^cQNrDdIo zc;;7TA)((p-BgG5ez}Wy_pfr<)Ap~v4z))}Ti;?1I=_>SQF^?W5;Yv(`#s1m-|g@o z-lbaAsl-1pS4C6x5NUoTBfiDv?nf5rR&~#%Z=wyU?&4#(-$xY~q)GAtiH$^v{El;Z zP%i36Zed)--Fz=-j+<>rddpKkFlE+z7G@`bvRB&t!T4G+wDa-$tG;*MeITodd#g2t zO3vY-^J{ptUO%7ofUN^*oyT`(p(~XU_ANKqhDK|Y%NJ`cMB3Wja=n?43C9HcPXFPS z#LCk)7jIz2&i(TYgB8{7??>IPX~I6&WpyKL%!q%Ah)on%dqbo<;*_)sY-AI;4H6I1 zO#F1^x{Fi4=IgRjf-ai@Ub?Vu97?{fmO489ZWB*$m8*glgggJzz|uvfidbA9qB_ZZx=fa29%e0Gv*?E=3Go@r1{E61E5bb z7f$g*U8_?T9~*}l>hQumcmBL-Tz6n@i(PjQ0FJ?Ea_X%d8tW?k=3lwgx_(o2Dtgd< zB;423eC9rgXSt_<4VB4~27wb-2re-#Qpr7hY19X*M_}2b?^zo0jFx-Mt$Q~FN_n*3 zxj6?`MjiNnaGRF+oVUuZ{At8Ec4O!p`^2B~7NUBUB=alGvt>f9M^Fu!s1$#8(YR7& zVH9TH=4XCp!1$w3vuSsSuitk^gCczW$;8ibw+O(qC@~6_qVE`Elqz92d}=0C<`lyr zVGU^PNs_U+^ZYCm1z{o`1cVE(MfT2qL!pUoE^yzY)rmX|UbXX)Y%N*Da4z0V%73<6 zsbg{WDQ#mWu4;H5<2A&*vZZ)4FHy|BOXK_bdy+&E=#bo{wYr5d?vqN!bNGXfIalIq zc-h&bD0Xf?(FK=Z_xz#AJe81lrj_kQp*negO4ig4O03F+?E0rb46!akdL<`aC*V^Q z&mPDym?!iRn60I$d=x?wz--jXriZTxsA*9U#bevah>N@dH`hK(TP`R8Kdhm}t&Qv4 z3qQBXM9At%&Sxt_99g8#Tn%Kq_u{NoMMlZxt82jfgJ@(zagK`z5k2ql^cH%3p(QS3 z(NF9Y-T0yF{#m0LAc zy>@veuE!(L@>MPhwr6c(kViWeNuJb@qPrj2hWrpb^=cKrkmj@=d{qf&4DQDWO!ZAr zJAAyJCzQIc$LKusZoAW(_4Vqgp)!c%oYOHIQaPn~$}=I1XQSG|?^$mtdJ!u!yT2Hv zXWHXCv70k3prNrYQQT*w^o?M^;5$z}@EcvvG(;HBfDi7xo zRigl@DIv55XLdF-o!kH`7>u(&H&k6U3#r1MWmEH4>1PTr9=`aPVOqu#F^>!?)b|CB z8jHR|om6eUH(Qh)IHng` z6f(oX=v><@IkVfYu`{u8Hk`ULq<1z;xsdTW{2RvZ=_uIdAZifUdtGj@Qc;OM#g8>IEt`Rh zQm`tR+Y~~K&T5p@B1ZAh6p=dx_U(*0|6DsrLmCiM({ZVQNk!63OIA@Z8D4R8nR z5+)7QI5J!|pgyYFe?`hpS8{!^gqq!2l-P3wJd5Hi1YmtJpVmE*WZoRixmR7hAA(L& zq@DNbRo_gKjPdU?X@VWlPckCb!J&(}s}wVqy0$W%`z69EnJBS(C`7LUOuwz>gm1$S zWfpGM1>Bb7Zo3@BXX}0p&xg`GFweNjcE`H;@$lGXcKCAH*g3YP$JKLt{4#E>I#lYW z#9tR>x@gXBO3D*$OL6!SGa`f}EE`{RNp4##FnT+ESR>2yvpURJsCA1B=P54XbJWs3 z_-ycmDXk!_eUF^b_1(g3VO^*~GTHUncH&+)ax%i)0$j!eJ6-Zey&SjlO8qk3wDph2 zK~AxyELC07op-b5w63iLyT&Z-wkCP_E;7P5#(QbuaJH zX^2nZ$3gV-wT>VnVw$n-1s)_H)|lntNG`u^ zHhPcAfgs_7*PIHquD`^0(!c}W^gAV!Yd{I2R*g@=*!(hl!N}E_8tw1Ryer1oM=>1J zDN>0GNd9f|9$l&qFpqPJIIRpyoR*PrxR6sDMX=a7z<7EAs9!zX+9PBdM){D0H1Gl4 z<2P?J9vnMCvy~gJ6mpup#%0w=YLYPvWTK5edy`NQz58Zp%?<%}L_`!&8Tyi;}<#pp}e?(&FiO*Z`cQgfJ{RQycq%S7^n$>L%k$4t-6%daE4vqiktL_ znjAP9A;UpI6K;_QrfM5EzSXKs*hAp?H`CCdWYJwBFdU=wAdLTvWu7` z`_ABZUZcA2`~CZVdi2MbdA-hZE$3X$% zz%0;8e2SPB<9{OczADM9um0Nn3#!RB@%GL8gb+`Lr2En8p|!d=*~#ywH%7f0PM$HB zBkpEcabV6^9s*frGh81Veg=huSeY@D9vOf8ODU94Et?v26e=bHloW(lW%0ZsPB7!V zRmU|AqwyI-1<6f<83q9f`TlSuUEe9D8R2ltUzT>gl&TBYj_A=0gACfq(7w<9fsZ|h0N1ronOEJN2o81Nyp29z+5M~*{w5!@ zOL={{{?{WDoT<~@wX@D4*Eu;Go~r3E4pusU*yXUN#!@=PUo;JRt`bFQg)s@;s25j_ zdiM)IzIIL}ZhWxlTH1>UC@|Z68r1-(3lft@-Z50Z^ckM$QY9EpdhA$E0kj7#=U|R+ z;#gwUYduXR^ts9CP>*6ypj8a5Khq?ouGeY7CXWj-o{Rk;;(3W{Z9+kIR%~IwVom4=D2CR%naZCCkw66=OaQusLf{FReoYZ0JE zSM0F-l)~ghYd*E|{Wr8rwxa13vi|Y#^2-VYp)#i}4!eYKUxj$l9}-uW9x6Aiv@KYs zdEsvNK850BVW&Zy?26&VV^C1R@CBk&4E56*hUv=m)m_Hn|V-8q{ek)y5XJ#^2R96gAcr zgq`d${b1Uvj@MF((m3irQk44fQ@|4uXH2c3oV)VihB)_z0-{BCnlhC>}`Yw&xkt3^G&Pc;ja3q2*a=0yz`ODfjd_o)$(R& zNSm;!b@}kAnKX=pn(ckRSWEMFbXsOsK86L*i5T!hOP1HK}-V)n~2Ms9|eAV6J z?~swwcLViWpPg%H@SI6{c+V{UXLwMW`-jTJ-_nZYF!&@_`B1?xtfeb1+pXE0SC216+YNPBiL@Hnvo1s6||0 zar%=-+t{sutHx1_38O!ByT7#fbSb>0Hw0?}iUt;1j0u*ASne8s-|8$5ik-)|n_r74*l4FoQ}K3E zy&9VlOf_JMc)_CwW@*v3Qb9+5Sd)0K3N5+wLq&CHA&o^Ki9l+-Yw_M`_96WUhq6mW z7{|{Y&q&4-y$2??r@4J^Hs;Ly@VQ#kOw35eZPqF`qj$!K`9YrXH6g~rRNNYCvr>bH zQQ9XLDxB?T+4!Qr+9T6fjSIEA+XU~CrH07&2e-djb-ccR5&_-E7at6T5i(!Ok&C;| zAun!90;~t?DXWX*Tc)`ZDQLw-^%XQ#N^S3*Wu5bRbUVuX-dOWXDLC@0RABptW^x0Z zRb8DOz6B+kfLc`l@vX?@Tg!L9O&P9-J15&Yz$T%yp#G>H?t}cnAeUd^aRTEANQpPD z`OtU;*)H*s=ivB47xHatANA#Dw9=v<%T@FaE9Jo>aC5S%i;cY43hn-fN_t{%&V=1& zU7JroBh(zs7@kl}DSyYPOF+*`F?2x)SzcZ%sadO?6PR4a7xCd1jCjD2rdHgi-A*8G zNpnz*^VjgxQ=J~kIUn5$KD-GYp=!Xl3ilqQVP8%vvQJzFRoF6jg3#3)v>yvp)vwp2 z{2Z%!;mcapQhmK~h4+zZm5^rbvv6=}$Z83wq*3}h@qvf0S7pL-8+amdZ_;!NQp<0F z3i-Q5GC#n9A2sW~Z4Doj46CK&GB1x2qJLpyyS#IN2(v#8{4Rw_Pf>ONtHKN7qC#K< zEq6V1)R=xD?HI-jxsX1J)wp1ibKE~8rAqhvA}L!`Psm2^eoPj@}q=St!L zNQ;W?RA^{xo^S{{5slPLcdK>*7!{v?*;?1BB(7=MVB>@R<@R$XX=~%zZfv2ceky7P z8hOtXYmKmZTL+jupPx^?$EKtp*^6YVLUrrJB{|--RyTiF<8c%C!Hhg0%*Y1Kr~%$ zILTYWvo}N9r%u5Fe>}e>qj>qPrGCQX^6&hVs{c7FzE6rG(OY(7|#apTPnDm8*eF zpAG^xTKHN0#)lozrD~wO>x}6J0G2we%%m00^iDJSQ^5lnf{M&z_K#+WI+cL#ZU+FJ z6+#`rdJX^{e!}~MvIJ6e&9ec6T2u&sg)vY@pN-ECpxmzlWZ_YB-}q+t=3TBHmnSVK5$ObIHh@>P?Do&s#&FtzNY`-@?YN}1yeJ0s#DQF&6A+)px zQjbLn%C97II5KRLm;(;c%FEy(r&#g$61BX3ujtZ=&_+iasC<-gxz=>U z^v9UbB+g*?boue84XD%D>kkyw?2-uR&v)$zm5;*5w{Wzh=`mg=lbx-fQrO-y;Wk8j zrJDJ=n?4yOD$3T{v`5<9_mS*nnG>jadi&i7Z{k~$hoowJxmBu17`3#b zi^+Fo4KQPNk{^K3AAYGWPP=2iMt%@4noJX{ZBu_Q`kptf{tc>o48=W@o%i9XB5gMW zVp8-qeQv|4j=}C!Gp|rd;e3n!*6jvfjuxi0`)7GplqT0rSw@vh+n?^62)I9miCTfq z>1eb1?#OL;vao^*BE0_zwj_NagVPtj{fPy%r5(7R$#GhfU%JWBzar5tBKwxRKe)4X z--U^6I+B+y_^-aV+b4wW0{3GscC82ZNOlcB3f90hnjSQ&yJIEnFK7Eerjq?>ExZAKxr!=Tp@m z#`&;^J(D!|8uC0ip%>3i8XCfIyf?z0TI1+!nYmdxBe(QgCTcElGTd8kE!>90GZ7%L z*+jMbcr4D~S1@sNA|26k5hU|?&8O<}857Gtk7EFh>iyX!F~^%Zgosea3pPPa&8;zp z`(E%v-SD@_I%SdO`GSb0fNVx)`KQFzgg6QKCmxW=P^9&eW6$hu=E)oeZrTGBB`C)D z>KT3a6uYx1O8Gjh&;($(NPQ)${^D<}}eW0rCcpJ@_j8ppo{~fN|z!XOx z$v&-$4UGu^rLQubjUPNlK1QQ!C^%2c>rnh+y}EzNDB~oId71v&maDB;)2DQb;ZM(0 zX%dAF2{67uW0(*BD6`2hm@i)kh2OKm_hMMH_a_C#u=1aczio9C?uD4aq?&Tv+VD^f zz;9mUdDLHa>}Gi#$zx@@m*9VT9;{v*a%?Q4OR01+sSNnV*g$c#GtHAzy<7yQ&<&yL z#U}AP@3vN+y&tuVmn3a|qEV)#?mgaIxZ`tYD#d?tP{^%P+VmpY&YwAM!2<^{;h!96 z_0(613pw&0V?y=ma65IwmEN5+MYQGRQTvCqr&U?sBrj1tY*MoXfx<(`u{iB-ftZ%! z6s;`lKxWiJLv506dem)z4#WZ~Samfn&+G+|E}n#WT0;OKI@&>>P^=8@qI6^4PXswk zn(gyk8MHLL3FoNRi%ttDsR2S9G={6lWFwnON)cM8Eadfr`u@eB;N z->Ilpj=yi;t=-*HW0SQ>Hh4NBQBS;6?pFNyoWp*)I%!tg;0J3?poZj-Jt*);egH0( zA<_ZEARtGja9nu~s($67)M)04A%$przM|#>SUDrI%5Y<5!A4s)Syei$OB#LO$dM>x zDn}2aJmXJ~x42Nxw{y=J?YoQId~k(wJUY?CBVIT~=2!W6R4IUaOS)k?Ps7`U8WfC= zZQ|c0D3C%5d55EkM^{TZX`_$O zf$-anA6=^4J0xGxL)rf+*L=wvB<$Hc^@EN+Nt}H1p$nFRmbekM55^VDoW``QsFqHD z?6j>?(%ix&AOl=7Fw8Rr#Hzyk6qosd@A45m2UQpJCS<+~=g}Z-jgMj94Di>0^l3`? zS;XsPFHKW_0HJkM-5c?$2Cq0YpO*Q^Uo|~slt}{?+L5&pRSeduUOLrvTeS*pZvcg( zEp@8>rdyf~y`2EfKFm?OJ12Qj03KEldO-)4G*U9bgv2G(6!3?Tnj4L9@vf+S_U=w zs;-Rp9+W<|J3qBg{_?JW;W%#fXm}sUd7KJvTP%7tDvy_Q8C!f% z{88jrD>w~{kRzUuU3YLIlEuXGb8aOFe;*c@t{7$*Q>Hu^O6pmUCNRrV?TePS90BEz zuNRI9;6|9oQ4hI#7KPk;E!B~gKN|4zhAht2MqEO3E6Y>{Y9DKZ`pUP&}}F0 z+27}bzXt{C7INHnQRnlL!CH?6IrNKuz=?eRTyEHVeBN&>R3<^pAS23HA5=}!BY8|e z-B1lSL45R|oC4qra-s7`HuTg5o}#ZGO9#Xv=NEv*T@2DmyXhzGuWSYGZs8uW3f_)B zo@3t-1!4c3iwjwY5G;~&8uS8U=r=y-Ur|l};GKpaVmUq97&Q(RP|)9aciVrFe&+(t zJMBzil;I|Tbaaaa2Z3zL;LNJ62*M3(qdvR+9(e;KyFLuMi!%sZKZ}Qo>s4&Fm4x^* znMZRr?7Tk<1U%zNx=)Qs=1rSWc~#P5E}mzm`hN7=hx^CgU+ag`-XG83-jAn&hw*^W z5|%q{vdaBtpL0|Y`|)bum0O<+K#P@kA=?T$9^oK$vam~=~Ho}K9Q2n|IpF&yP_x0PZ`(zQwek?L#5VVJ<# zvik-q7s5#e8Z>`jyG85?yF!EgNdsQlN zQhnP1N`vyfU+8)Y)!;kN>u0#aVx-KYRIk8Q9%o!n8|r-caZHM6PLR0YA*cW2;fD9C z!|RUdgMy3?ne!+Mj_Xh(9TX3V=O0$pA^c)?Vz1%H-f%@*1L!=V%Js4EgRlyT!8@Kt z3Zwo@O}t5$+f;iFleT6ej>s6_3t4RJ0+7f6#wb6V>An3!3M^C{=Yk~l0tCExIfX+) z9$byY3rr9Qf{rRffmJ`TivdDcu#*bDOAaWQ-zERAOp-E_p809|;l;qK?_A>Vr(z zhcD8Q-!&txV|L)HhS03khu<28P`{mNLWDN>u`aM*yPTU6}&R^zN zHGzWsTAT<6=Qg%%s+W0>dym3Eeb~T(aGKAUXQpoeveMBWUI@{23&7|&n>LJIVEqUI z!lOo`?!ueTO*0vQ(>^ZT(1yyfLRqW^Qk0XvUVYyT4!|-&SiTV_z(FSq@TXsgb!F-A z?cv|mQHeIUo?Kj%R@xIO6bsX+Ur520=+SnZ+K2{pobdo<#ehnVwr>y*_O~pcp#MHj zKgoN;!AX_2xuVAez%pVr5bHzpTi?7wd7~`ikL|LZJ_Yw9K4?g~=)!>P_GJ3?)05)4 zUdmYTA_!8cz)dr4s{!P7>7wy?2=d3)%Cu8*a{~=*VLdkGLXm6{IKVrmOrmxY&$ndA zwS?;RW-E*ckOu?_IUV)2#yw_;X;YwMX4e5)vFshu^76gAa!lZ$Ru+gi%_MKD=GO<3 zoZooi0ilnwzKG~XT7VleN7w4+J}F|K#(25Mv;)2Oa6Zm0rOPf8;KcW{T!b%izV;Dg9pWh_O1u!(x#}hy_jrZ zE-jL?i{xd{(@DlLiL<=qg$tF<58$~A8yt_S)+$ra$S}MNsbW3;R07W_b5)Oa?cDvn zofnk;GLH84ANk__d%`FLz?cprFWqwp#)qLpAOio3EexexjHte}7!wR6a(w<0;d%n<1xsmyxOK z!1TQ_SngqGNj_)+bG{}H=A5c)xU!dgWFCPkP1<6ePNuVbjgY;`kShW=m&_mPss^RD z{e^ZPe#PpF7XeI}-dWU1X~-`Sl7@wDD71R>Ha1N7B14mqQhj$LT1qmSAEHW_8dt3e zX-sz2=#L&>RBx`-{-ieLc~l61po!m55cr7Xt3QO6O#;4f8-MQR9<#{=V1~Q=3*Y%{ z=4B*+nc{BMoKMb^2o_PhMY}5?|ef>D;*2j&Z@{vOxX*TEVpt?^`Qi`mU0vPY9 zYJr%;1a`xM-z;^2u41{W+Whz4VS4OOu1xFShopO4=Yt`l+ZZO_@^YFy3b~MTHWP`U z?|Jq;c#d`^yrcLrJvNr{t8-5J`&B{xv}-n)4adV0&ZtO;F(Ca#1^W~^e;)*8mojBh zWY=l$P|Fd1H1+owAmKtmg$DkJ#PS=Oj+(0NGtGp{*5Euh5@C4j+nP~ifC+9o2@eVx z>_A3`KQi;l6Yc{hw@?90dyV-+w;ALddoEx#)hJ~38@3O~kV{w))xWSid13@%h(v`u z?0`Lv*WsskM(aY}vRv4^Hx_jS$;U`t2>{RG+&d7AEkN_~JrdPFcHeOSo;V(*hHhqw zd@|+-(k0kxD_xBK>FI3dD)QRdf3fQ*{L7mPhmOqCazazL7$$i?N=#g_b8ZhM-|&p> z=PUeQ5t`%*S2}T$jL%qNka>8H3rxukK(Le;Sn&S6qzQ;vt{(hn!XD*z!$m0m!~)2~ zriURmK#gd$IK`U_YL73U`Os_lTa&m>!6wLbPNx?F_*(j=&dL7_7Tk@cg*x*atrIes zbohg~c0nXoR5~oH0ek=o#4Mn1x7^y`-AEWru5H$Y`rtQW{--+9Lz3D$}5-TT=;86BRCswYrNpWtNmMMiw zf)N&mz;PbdsS3iMIZ|e@O3#G~qJY5>NczKunc5UKcn7?}y%P*v?)I=tg5;kD5Uu-4 z6&1txp5k)Xhh_8pc}L+HDvkn^e}#3)<-{rj7iyFW{!;6Adw&{^kjT6Tn&11=3h|C| zzB2yubLbn%svsK1Kac%>V4OCWn>-xwJ<1A2Q9FA@0{YwX0_p|zKZAwd!Y)vD$NU}@ zSUV|p3ZpN70?oRsVYhb!TDDuelYjsEd$@xJsK`HU1R%^m3WKqzsi|#sn-`D=IQk0S ztnq)39vcN8g0FM5h+c=t#U+^)qywh>pXdKIdRuK2MIcBXCO_-W0psWY@1ux%Hp4UI zA5pgMFc_(hv+yUmIjk$Z{V#!kw{K2O0-Ij`8<(``Uwfp)zNJNu;AIetRSiAaNy`aviCDe z9(IK3|C)CBT_6uTVp$hsf6LTGR0)#)8vi_iZYyinQT?ZfdyMnC?oQrm&3jZS;O-C$ zazovUJQQU7dmhS^miqr8E&};ilt#I*H({iZ<~h0FEn;=e#fmbk|dLHc1O)1{3ir+(*Ju{?#kG! zFw#KN3&}t9!QZ81PX9k1J_QKtUwg!-`cMetUpC)hc0c;(<^K|Q^dK~4x7=_GGNmIC zBoi@t->)xqY*DaF|0~6N5?{{>Amkg8XfWWP&+gAu&>uFzg!AF_o?t`$h|(zhzgLmL ziHCj3lgADO%|$B+KMik#uj6pI*Gcaa$WPej1gUA3F?CFUzsm3Z74W}rL#qbX zf>xGxv==T2iW?g8JuYQHQ`tn40I+$0bfO4E6%~HTZN|BcUG?S*U(nM3!w+|D*j)j4 zSBTZuWrR*azglW%vU0r)c=Suh(-@M-2rfwy+pBZlT0j41B|?hQD(Kig!!IXU$XS>A zn!lyMh`Afn7QRYsq$Uq?R2yr~x$MBIzqd{dQ4W$x6vb93=UG*u{99oWv*MXMYYfRd z(zObXzmPM2Z*1WcJn$TT*;;sK4wYMnap<%2s=eBXq3P0)j zOV2fW!xmo3=Sz|1uSf}tvIj?dX(YG1U?u2Zy#LI6)E8c&-E@2GR<*gX$0fY}pV9oL zE3^iv+(mU!>;Rg!WB%1U3Z4SK>({h`Ils-T(O#s#jk0J+j||Nm|!Vj zZ%e~3%RAo7%cKF801cKvAV^GftonbOzek>Kn!#ujgQp|^TxeuFOCa_JYaV-ho4f|yW|Ul=Lx>D0)8xv);2elnZl%oT zSPJYVY`+bQW%X}~4Z>R?YP#S0Pz2s&{7(20=&?o~`BCcD73Ih`N#v2fLU#At!ALB! z_o>+hM$aK;#U$7GNB#10f%a%pch@&*4h;nS7SSE}soJzPe~Q2}0SEQvxD@X~bjV=L z4Pbb+YGRYo+}#9`uR|k~hKED ztEPIw@|iA0Evun6f2>?jpEH^Mqe=KdxAx*+^npXIv=9Njbw-z#mIgNJw@0*oak=Zl z5(LOH?8Ta!Z+2L4WP|C+EcB-2J5>H$U`e|bd>u{sYJ2s29Ho~MnZ@h;lD#7&r8;tR zKg1<_SuN6j>CaIi&aoM)!7C|UrVUFZGG=NX9e|qQm6X4np*VDNk2j+{@Gj5SJpq^` z3e1h`lHeanJU8V-B`6b)_$<~td&w6aCLBHVnTzFUc zr((j0#T+m%m|tBs4T*28inlxqbaa6FJCMT@r`AlYU5Ndf&`jr;Bv%7*)yhm19gBgy(mU5(&78Y%wxDP`0z-m(Vlo)M2lXfU<{8QD1m64}}E-?Ky%lm-vBuqW{}+ zniX~bn6&VYYJO?nCEVwQsd1Dp8-t-9AP2kXXxZE$Dlf40k!J^bVmQpzmajeK5E@Q*!Akv}<>p>BT*}eT&7&7V1tx zJ+tZ5@~QKO9o2(SKsF@a$u(R5HvI5)@UD$>`L9PTvd+NQg}pnA3%h9aqx}prBZDl# zq+(G!w|6Xe0U=&5^CcuuU@Jk>O)j&#W?oB1HhZm)j@!Q&k-{lV9x11V!EGpCg$J(8 zN09~0(u`{%+RW<`rJ!2mPOUK0HJ_nlp;tmyjKFz90@c z2&9U7@Elh_oh8v^TJ7e(XHP*l!JM`DMxM<rkcUwPLBP=2f$|1!ZRAjXA$8s?N2vq*K!?RN{*{ zn#~*gT3-2+2?n+g1l_^WoUkLge23$Dqo>M7Fn<2iCt+|WdP6Gsex$>DrQZEn1o|qq zQSNd|z>%ZWSws3S9g|j7U)*U`C6m2F-FCL+3Oe9IxF22I{V>27tISe?oBo68LkG#a zf|9{b`9JF^D|^@X4Xgwzb;;)0lW>KKb37x{tEI%bDtrtCoO&ho77l&-1sZk)I=%O|qi6-VnZBXnI0{YkbgIj(3o zDTob0$K0r(IJJ;?8*`>#1<)l|AL(Tcr5A0k2W>6?F;M|N5Wh$D&%mLfp{SIs* zkJdr`gttvu5w!k1qt;^+;G9nK*ctbGP4==-hp-hZ&yTOg5(6l^)9`QMz+xW}mr~t1 zcV+(`XYQiLy1Ou&4}9u{;p=9DEpB7I8D|X_1y`7sUvQK~gI4#^95BnieVclia7jGi z^qgCM+t2_8;_5YtLfMq2ub3AG*KCd|l9lKIJjLE&=vu+eNj6{u;W*oi=SMkm>v(N$Fkj zF52e1l8I|P*|aI8aq!24I$z>I2A9(whIwN+R>Da z<^P!<;?2#I)qZ0~x&lrO<4y$OXapX-y}S`b{asTRtZVoUgz-~7g}0fB@oQ*dYc(PP`P{*{h3A zaAKv?s;j_lBeuu*_)-Hq*}s>e$(pe_VX_&8a7b+TAnz{7tlGw-9kCzHac^(u+e1E{ zZN!_N{#V7G_4W2DHYK1%3hZ^7);7f`($jh8ed`mCsGiBi2sh*mWC{fFC95SYK%V6c zrSuEE)YSN1U9U#Aw~XZml{L4AEut$F$@62-;w+SVPEZ(DcVxq)0O_?wVq4{<=S*Mf zZ5~~Uy>>+ zYMokDapAm>X1Hr&TNS0(OketKCNH1VB`Scp3HCBvY)N|{LGH$5r~3M?fIW`G;M<5d z0+*%(nW_u|hvwQx&^2c%YMGT4s3|C4{u+39(A!wRpZbSW>i$RZ4@Z0a)4)aq?1HRF zz0{55H*Rg*afISNZJ+8pHRGH}(6eL}KGDPf$lF8FPlBP56l!x#%cX?BO0UX}Hf#Cd z0YrkGZ+=G3OgUw?wO_X%zqbZKoLGfVq2CHzYEfL6>fg!O5@*35Ivb3_Hh&Zq-m=y{ zLNRfg&ygoN6Ju;m4f-CA7U9> zPrUf$ch#bxWSh{?cOb(j%1J>!WX&swRFx(*! z$yLW9QDL$^DfjNg(Fn1EDbX=%aTYm}GIoTvFKl*%giVqyICmcGGAsr6ibXg;r{{i8 zI{?H08#!C@F~Jc4$C2F_EhiEze21eTL4{(T0j1My6lIaj` z@O6`M_mx`_k0aTzd9Rw)Y>^HOkED0zrb{Jc-fo#0_MP>)d`j*5>)nt3{#n)Mb+#;w zhv%BQN_trgZ-K^Dcw-j)>Srwqv^h^asMTmz1Z+NhhHDAeI`PIT&uBAtS@=3p5zrT# zhs-*!J0K_K)|1^XEs&Ae<_BH}yto8}v$LT+L2Y|+uxNNof)g)+qCQF~eL4#=g?RU+ zXWbekyX~vAS^4Lcw}6}lw%;nR2m=0r`x$J+P+3$j(?s#0&0~F? z@P6KNn=#A$(OXr(@53YE&I6tG=ci+(7AVHQIhR!J1!UY9gqEU#f2MUHt8_Ov-~(bl z$M(n%KK^9R?+1Ki5s#l6Lz*#~hw5+2Do$}$(>*cc9K|0{-K-3sV|I6gLSr!tzMHA} z6NIOZaAj8UvM@zxe*-4lK!$9Yw_Lu)X4EqGp0RJsj4k$Xo_@a4{59?bEUtvVX@}<#0fYXz2RA4R-K615eOLQQRgeaz$z~D zt=~6&iQJz*+__+S1mLe* zOZj9@<15M)l7iX1k)?#Iz?RQf#sbUwtE?nYepmi+zB82CvoE zHKHJBOM#hZa#?TWS=575O8V|DN*YY5%Wt~ zbO_|24$6_5e*HC`u&Y+1Z97@(ChsN9bpN1d_fmq+6hdPI-XVkJ42;3Hkdv4;ANZE?GCoQGx%YUdBY67K<6^(Ix zBI=4R_1V>%onm7wSL;&mmznSq2Q8RWXK|z*<8?Za7Qf(Toafg}ya8`M18F^h#$o4? zkJe^W#dU%bksgopyFw10LH&}07lJIN=9z=W-}PE!86}%}u68C)r;*>>qHN|dV{MLI z+)1!x%GH@yrFD62IR^zFBLoWN&b6=03)_!meg64cb?=k`MEV`*Vk@+atqGU5ThVkd zQbo?yJ=X~$0Th?>rE$PYV^j5>uMP@^Cu>trI*lcMYRx+3^Ny_7J1mXCru|=vi?Z|E zYO(?e{W~XMTgAIm`%7&mAZL8=4412Ye`9e1`egf8d12S3Jl6%w;nfinR2yWkQev0= zQj+*4R*X}+aL)l)Ix)QgF+cKRZkViGfI(X{xr!jjC8~E-I)Mw*`IAya&|wi80U{;# zO<_vBy-1Sspdr`roSx65iPoHKbM-ORTV@A&Vh9?>tRG`LqpqgjIk~lVQN|U+`Z;#d z*TA{}oJipt;m*8WmkT1JyX0~r^)1pp2*Y=L9WHoIi;q%)u73!`?1%{mScBbpNOb$! z&Q|@6q;|hGDHzF14Yv08*vR`dp5Kd6i(XAQJYHLDI^%9zmfqr<@)TEA1zq#h^%Bt* zd+Un1o{P=zJX4iwV#m5pRNvZ7?ERi%!(H-fNyMkbceu;nTDWETaXxM>d#Q9M;uLy# zoUm}oCTWwk@(PY!q0Cq;?UtGh$`e)dno0=EMk=$4-{j4!(}huada)2{VTdtlIHd5Pi)V?L$7d7@)L1 zax5pnzyf!tcKP7I+z&lC8?&JU9B~h9a#_oEeUsbf6VfAE9jd~wd)w7oJYb}^D%2BT zMtd4p9uX8=V>9Yew3th6DsaziK22A#hQHdz0K~Ku-r^HYRVTeEDE6PzK70D&9fzs3 z3OSdXflYZi+Wk}h3n#*_ZZKXh?dx62ScJBebcD2=zH;iaUbXH>j4j4Em^*lrfK*ze zgZ~6)8GZ<918rPGKP5A(bs6!WQB zubz>hW`cYD+64-y|zdnNhwWHbCOfrXL}m|$r?Fo^9w5stsc-; z5QHD1><-lDqD=&9Dd_l3da9YJwBns=r5aWBg;&u!DGzi5F_wL!xrF9rRk1+2jBQ2s z8Iop;LK4Bgf22y^FAaSzuWS?A#D2k@1LHd71ZTwDf(58E`6lGK;ubAp_$LC4;S&54 zk4-K#JtMAudBfo|G)$b_G(vQTfN=I|v0wCz_vXWfi<>bwT6UIYCNP9*;1o zzBydecm$DV6u0m~i0RLeDX`XX`DS_AByC4V6Mp}YR@=a3P3WC?`xQMf zP0Y2ZkscN+Tw5w$lNlLvLK|4TA?`%atap3Ng)|NFZV!yB@Ncb7`aPefoF^>H#*^dU zd$ez&EU>Q9`w{yl*{pLs)NRUBaW})xAUTOvfOjmMXV z{SK~TCM`&!HLo3=(Ztr%v7Le0oFdz1n`OV;&`C=ZJVAjqPEXJNUM`^>g2hncw|qcq zGt3u*(u5zU#_;hUj$M8}Rt~(og9vkkxAMfoLc9O5j^;62?6Q&eR1#yZfsRdrtMTS* zcC~U-x5{*ioq-=i|H>u65)o)EIF<6+t+;|`nozd5`_+n-t)`|K+zN_wbPw6FgWor8J41B6?RZou!+CM+QPo*Y% zC@tf{^+4k4`PWvyHk+|;^1p1fMNf5?vEkKL#*GyIMV5A+O!j|hhGZ8sq+QipOTc&Z z-w|$H_P!y0ZKZs7f#hVZM%8Cto#Fe-CvY&%Gp7gcm$8-CTe^85$vla;XUf=I|eP&>M!6d_Jn(&O&k3^1^dBlUr>Ob8iBG~_R5@$<+HGw-+OiDHO{PYz2 zy7sfC8rH&4VDnb_I!ABw(71OV!M#aPjkmfB+ZJuX@KuZ}s5aFQ+MWK=?S~jw;J?}j z`<8GaD{9uq&4+2-1TO;TDKL1m%;sBS9(#_wi>s|FjLbfD1|^ z$Bce6>G!kq>~OG=c+=_Z`M!ItVT~xe|D?+N;VP6LaEux`DjysVId}hbyG#!<(*FGg za5h2G0xK8;kKNuO%AbeFsdE|re~;o(CzE1Um>0&_t>g&f=c+Z1rO7oot!-!H(2dbV}*GceNY Date: Fri, 22 Aug 2025 15:00:17 +0530 Subject: [PATCH 39/46] fix: img --- .vitepress/config.mts | 2 +- static/img/docker_1.png | Bin 57480 -> 51186 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.vitepress/config.mts b/.vitepress/config.mts index a7a95ad..77a08b4 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -258,7 +258,7 @@ function sidebarHome() { link: "/docs/guides/04-experiments", }, { - text: "FAQ Glossary", + text: "FAQs", link: "/docs/guides/05-faq-glossary", }, diff --git a/static/img/docker_1.png b/static/img/docker_1.png index a7106731bf7c59afb96e78fd1dd3f5676aa34a6e..679bf96e066b7874685277d65aa6fb1306bcd1f8 100644 GIT binary patch literal 51186 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 literal 57480 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 y{|mwRuxNtAGkADMM^OmrbUZvfLg=u50 Date: Mon, 25 Aug 2025 15:05:23 +0530 Subject: [PATCH 40/46] fix: remove keepalive ref and update the scripts --- docs/guides/02-getting-started-docker.md | 26 ++++++++++-------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index 6002ccc..e996654 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -346,7 +346,7 @@ The proxy client provides: * **gRPC bidirectional streaming** for real-time message delivery * **Message publishing** via REST API endpoints * **Configurable parameters** for topic, threshold, and message count -* **Flow control and keepalive** settings for robust connections +* **Flow control settings** for robust connections ```go // Basic proxy client implementation (see full version in GitHub link above) @@ -365,7 +365,6 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/keepalive" protobuf "proxy_client/grpc" // Generated from gateway_stream.proto ) @@ -387,7 +386,7 @@ func main() { "threshold": threshold, } data, _ := json.Marshal(body) - resp, err := http.Post(proxyREST+"/api/subscribe", "application/json", bytes.NewReader(data)) + resp, err := http.Post(proxyREST+"/api/v1/subscribe", "application/json", bytes.NewReader(data)) if err != nil { log.Fatalf("subscription failed: %v", err) } @@ -396,14 +395,12 @@ func main() { // 2. Connect to gRPC stream conn, err := grpc.NewClient(proxyGRPC, grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithInitialWindowSize(1024*1024*1024), // 1GB per-stream receive window + grpc.WithInitialConnWindowSize(1024*1024*1024), // 1GB connection-level receive window grpc.WithDefaultCallOptions( grpc.MaxCallRecvMsgSize(math.MaxInt), grpc.MaxCallSendMsgSize(math.MaxInt), ), - grpc.WithKeepaliveParams(keepalive.ClientParameters{ - Time: 2 * time.Minute, - Timeout: 20 * time.Second, - }), ) if err != nil { log.Fatalf("gRPC connection failed: %v", err) @@ -448,7 +445,7 @@ func main() { publishData, _ := json.Marshal(publishBody) log.Printf("Publishing: %s", msg) - resp, err := http.Post(proxyREST+"/api/publish", "application/json", bytes.NewReader(publishData)) + resp, err := http.Post(proxyREST+"/api/v1/publish", "application/json", bytes.NewReader(publishData)) if err != nil { log.Printf("Publish error: %v", err) } else { @@ -567,22 +564,21 @@ import ( "context" "fmt" "log" - "time" + "math" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" - "google.golang.org/grpc/keepalive" protobuf "p2p_client/grpc" // Generated from p2p_stream.proto ) func main() { - conn, err := grpc.Dial( - "localhost:33221", // Connect to p2pnode-1 + conn, err := grpc.NewClient("localhost:33221", grpc.WithTransportCredentials(insecure.NewCredentials()), - grpc.WithKeepaliveParams(keepalive.ClientParameters{ - Time: 2*time.Minute, Timeout: 20*time.Second, - }), + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(math.MaxInt), + grpc.MaxCallSendMsgSize(math.MaxInt), + ), ) if err != nil { log.Fatal(err) } defer conn.Close() From 63e2caaa945fd89819c204b9cbfa13746f2b6ae8 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Tue, 26 Aug 2025 13:04:06 +0530 Subject: [PATCH 41/46] fix: add links in Optimum P2P overview page --- docs/learn/overview/p2p.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/learn/overview/p2p.md b/docs/learn/overview/p2p.md index 478d75a..66a477e 100644 --- a/docs/learn/overview/p2p.md +++ b/docs/learn/overview/p2p.md @@ -81,9 +81,13 @@ OptimumP2P provides several configurable parameters to tune performance for diff ### Mesh Topology Parameters -* **MeshDegreeTarget**: Target number of peers to maintain in the mesh overlay. -* **MeshDegreeMin**: Minimum number of mesh peers before triggering grafting. -* **MeshDegreeMax**: Maximum number of mesh peers before triggering pruning. +OptimumP2P builds upon libp2p's [GossipSub mesh topology](https://docs.libp2p.io/concepts/pubsub/overview/#full-message), where peers maintain **full-message peerings** for reliable data transmission and **metadata-only peerings** for gossip and network maintenance. + +* **MeshDegreeTarget**: Target number of peers to maintain in the mesh overlay. This controls the trade-off between speed, reliability, resilience and efficiency of the network. A higher peering degree helps messages get delivered faster with better reliability, but increases bandwidth usage due to redundant message copies. +* **MeshDegreeMin**: Minimum number of mesh peers before triggering [grafting](https://docs.libp2p.io/concepts/pubsub/overview/#grafting-and-pruning) (converting metadata-only connections to full-message). +* **MeshDegreeMax**: Maximum number of mesh peers before triggering [pruning](https://docs.libp2p.io/concepts/pubsub/overview/#grafting-and-pruning) (converting full-message peerings back to metadata-only). + +In libp2p's default implementation, the ideal network peering degree is 6 with anywhere from 4–12 being acceptable. OptimumP2P inherits these mesh management mechanisms while optimizing shard propagation through the established topology. ## Use Cases From 25476e582f906514a379237083b161514ce59316 Mon Sep 17 00:00:00 2001 From: kishori82 Date: Mon, 1 Sep 2025 12:23:53 -0400 Subject: [PATCH 42/46] fix: slightly modified the document --- docs/learn/overview/intro.md | 10 +++++----- docs/learn/overview/p2p.md | 5 ++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/learn/overview/intro.md b/docs/learn/overview/intro.md index c208d66..986cf34 100644 --- a/docs/learn/overview/intro.md +++ b/docs/learn/overview/intro.md @@ -4,10 +4,10 @@ description: Get a quick primer on the constituent components of the Optimum pro # Introduction to Optimum -**Optimum** is the world’s first decentralized, high-performance memory infrastructure -for any blockchain — build to scale data access, reduce network congestion, and -power the next generation of decentralized applications (dApps). -Powered by **Random Linear Network Coding (RLNC)** — a cutting-edge data encoding technique developed at MIT. +**Optimum** is the world’s first decentralized, network communiation and high-performance shared memory infrastructure +for any blockchain — built to do low-latency gossip around geographically distrbuted nodes, to scale data access, reduce network congestion, and power the next generation of decentralized applications (dApps). +Powered by **Random Linear Network Coding (RLNC)** — a cutting-edge data encoding technique developed under the supervision of +Professor Muriel Medard, EECS, MIT. By leveraging RLNC, Optimum transforms slow, redundant peer-to-peer networks into fast, efficient, and scalable communication layers. Optimum is a decentralized network of **flexnodes** that can be run by anyone and @@ -21,7 +21,7 @@ developer-friendly APIs. ## Optimum Products -Optimum's products include [**Optimum P2P**](./p2p.md) and [**DeRAM** (Decentralized Random Access Memory)](./deram.md) - bring measurable improvements across the entire blockchain stack: +Optimum is realeasing its product [**Optimum P2P**](./p2p.md) and soon be followed by **DeROM** (Decentralized Read Only Memory), ([**DeRAM** (Decentralized Random Access Memory)](./deram.md) - bring measurable improvements across the entire blockchain stack: * **For L1 and L2 blockchains**: Accelerated block propagation, reduced bandwidth usage, and optimized on-chain storage. diff --git a/docs/learn/overview/p2p.md b/docs/learn/overview/p2p.md index 66a477e..3e9f3eb 100644 --- a/docs/learn/overview/p2p.md +++ b/docs/learn/overview/p2p.md @@ -101,8 +101,9 @@ OptimumP2P supercharges validator and full node performance in bandwidth-constra * **[Solana](https://solana.com/)**: Enhances Turbine-style data sharding with fault-tolerant packet loss recovery. * **[Cosmos](https://cosmos.network/) & IBC networks**: Low-latency interchain packet routing and zone-to-zone messaging. -### DeFi Chains +### DeFi, AI, DePIN, Gaming & Social Chains + + ## Security Model OptimumP2P inherits libp2p’s robust security foundation, and adds safeguards specific to network coding. From d7d33ff529d4c4b17943e01fb1a21cf6d7aa4a59 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Tue, 2 Sep 2025 00:50:32 +0530 Subject: [PATCH 43/46] fix: add ref, add FAQ and work on review --- docs/guides/02-getting-started-docker.md | 8 +- docs/guides/05-faq-glossary.md | 103 ++++++++++++++++++- docs/learn/overview/deram.md | 2 +- docs/learn/overview/intro.md | 6 +- docs/learn/overview/p2p.md | 2 +- docs/research/gossip/decentralized-access.md | 40 +++++++ 6 files changed, 151 insertions(+), 10 deletions(-) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index e996654..1e6024c 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -47,8 +47,8 @@ local deployment offers: | Component | Purpose | Docker Images | | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | -| **OptimumP2P Node** | RLNC-enabled mesh peer, encodes/decodes message shards, handles peer discovery and subscriptions. Optional gRPC API for direct clients. | `getoptimum/p2pnode:latest` | -| **Optimum Proxy** | Bridges clients and the mesh, manages subscriptions, shard reassembly, threshold logic, and node selection. | `getoptimum/proxy:latest` | +| **OptimumP2P Node** | RLNC-enabled mesh peer, encodes/decodes message shards, handles peer discovery and subscriptions. Optional gRPC API for direct clients. | `getoptimum/p2pnode:v0.0.1-rc2` | +| **Optimum Proxy** | Bridges clients and the mesh, manages subscriptions, shard reassembly, threshold logic, and node selection. | `getoptimum/proxy:v0.0.1-rc3` | @@ -136,7 +136,7 @@ Save as `./proxy-p2p/docker-compose.yml`: ```yaml services: proxy: - image: 'getoptimum/proxy:latest' + image: 'getoptimum/proxy:v0.0.1-rc3' platform: linux/amd64 environment: - PROXY_PORT=:8080 # internal port, mapped below @@ -156,7 +156,7 @@ services: ipv4_address: 172.28.0.10 p2pnode-1: - image: 'getoptimum/p2pnode:latest' + image: 'getoptimum/p2pnode:v0.0.1-rc2' platform: linux/amd64 volumes: - ../identity:/identity diff --git a/docs/guides/05-faq-glossary.md b/docs/guides/05-faq-glossary.md index 6c890bf..c354c81 100644 --- a/docs/guides/05-faq-glossary.md +++ b/docs/guides/05-faq-glossary.md @@ -1,3 +1,104 @@ # Frequently Asked Questions (FAQs) -TODO:: +## CLI Issues + +For all CLI-related problems (authentication, installation, rate limits, connection issues), please refer to the comprehensive FAQ in the CLI repository: + +**👉 [mump2p CLI FAQ & Troubleshooting](https://github.com/getoptimum/mump2p-cli#faq---common-issues--troubleshooting)** + +It includes detailed troubleshooting for: + +* Authentication and login problems +* Installation issues across different operating systems +* Rate limiting and usage issues +* Service URL and connectivity problems +* Common syntax and usage errors + +## Docker Setup Issues + +### Identity Generation Problems + +### Q: `docker run ... generate-key` command doesn't work + +**A:** Use the identity generation script instead: + +```bash +curl -sSL https://raw.githubusercontent.com/getoptimum/optimum-dev-setup-guide/main/script/generate-identity.sh | bash +``` + +This generates `p2p.key` and exports `BOOTSTRAP_PEER_ID` automatically. + +### Container Startup Issues + +### Q: Containers fail to start or can't connect to each other + +**A:** Common fixes: + +1. **Check Docker images**: Use correct versions (`getoptimum/proxy:v0.0.1-rc3`, `getoptimum/p2pnode:v0.0.1-rc2`) +2. **Network conflicts**: Change subnet in docker-compose if `172.28.0.0/16` conflicts +3. **Port conflicts**: Ensure ports 8080, 8081, 33221, 9091, 7071 are available +4. **Platform issues**: Add `platform: linux/amd64` for M1 Macs + +### Q: "Connection refused" when clients try to connect + +**A:** Verify: + +* Containers are running: `docker ps` +* Ports are properly mapped in docker-compose +* No firewall blocking connections +* Using correct service URLs (localhost:8080 for proxy, localhost:33221 for direct P2P) + + +## gRPC Client Issues + +### Q: gRPC client gets "connection refused" or timeout errors + +**A:** Check: + +1. **Containers are running**: `docker ps` to verify proxy and p2pnode containers are up +2. **Correct ports**: Proxy gRPC on `localhost:50051`, P2P sidecar on `localhost:33221` +3. **Use latest client examples**: Reference [`optimum-dev-setup-guide/grpc_proxy_client/proxy_client.go`](https://github.com/getoptimum/optimum-dev-setup-guide/blob/main/grpc_proxy_client/proxy_client.go) + +### Q: Getting "method not found" or protobuf errors + +**A:** Use the correct protobuf definitions from [`optimum-dev-setup-guide`](https://github.com/getoptimum/optimum-dev-setup-guide): + +* [`grpc_proxy_client/proto/gateway_stream.proto`](https://github.com/getoptimum/optimum-dev-setup-guide/blob/main/grpc_proxy_client/proto/gateway_stream.proto) +* [`grpc_p2p_client/proto/p2p_stream.proto`](https://github.com/getoptimum/optimum-dev-setup-guide/blob/main/grpc_p2p_client/proto/p2p_stream.proto) + + + +## Development Issues + +### Q: Go client code compilation errors + +**A:** Use the exact Go versions and dependencies from [`optimum-dev-setup-guide`](https://github.com/getoptimum/optimum-dev-setup-guide): + +* [`grpc_proxy_client/go.mod`](https://github.com/getoptimum/optimum-dev-setup-guide/blob/main/grpc_proxy_client/go.mod) +* [`grpc_p2p_client/go.mod`](https://github.com/getoptimum/optimum-dev-setup-guide/blob/main/grpc_p2p_client/go.mod) + +### Q: Code examples don't work as expected + +**A:** All examples are tested against [`optimum-dev-setup-guide`](https://github.com/getoptimum/optimum-dev-setup-guide). Check: + +1. Environment variables are set correctly +2. Docker containers are running +3. Using the latest example code from the repository + +## General Troubleshooting + +### First Steps + +When something doesn't work: + +1. **Check container logs**: `docker logs ` +2. **Verify network connectivity**: `docker network ls` and `docker network inspect` +3. **Test basic connectivity**: `curl http://localhost:8080/health` +4. **Check authentication**: `mump2p whoami` +5. **Verify versions**: Use latest CLI and Docker images + +### Getting Help + +* **CLI Issues**: [mump2p-cli FAQ](https://github.com/getoptimum/mump2p-cli#faq---common-issues--troubleshooting) +* **Setup Issues**: Check [`optimum-dev-setup-guide`](https://github.com/getoptimum/optimum-dev-setup-guide) +* **Protocol Questions**: See [OptimumP2P Documentation](./p2p.md) diff --git a/docs/learn/overview/deram.md b/docs/learn/overview/deram.md index c3ac898..d4253ba 100644 --- a/docs/learn/overview/deram.md +++ b/docs/learn/overview/deram.md @@ -17,7 +17,7 @@ primitives. This flexibility contributes to improved durability, reduced bandwidth usage, and enhanced fault tolerance within a distributed storage framework. -Our system is implemented as a network of functionally homogeneous nodes, termed +Our system is implemented as a network of functionally hetrogeneous nodes, termed Flexnodes, which collectively provide decentralized storage and communication services. External clients can interact with any Flexnode to perform read/write operations, using this system both for data storage and as a communication diff --git a/docs/learn/overview/intro.md b/docs/learn/overview/intro.md index 986cf34..7e438a6 100644 --- a/docs/learn/overview/intro.md +++ b/docs/learn/overview/intro.md @@ -4,8 +4,8 @@ description: Get a quick primer on the constituent components of the Optimum pro # Introduction to Optimum -**Optimum** is the world’s first decentralized, network communiation and high-performance shared memory infrastructure -for any blockchain — built to do low-latency gossip around geographically distrbuted nodes, to scale data access, reduce network congestion, and power the next generation of decentralized applications (dApps). +**Optimum** is the world's first decentralized, network communication and high-performance shared memory infrastructure +for any blockchain — built to do low-latency gossip around geographically distributed nodes, to scale data access, reduce network congestion, and power the next generation of decentralized applications (dApps). Powered by **Random Linear Network Coding (RLNC)** — a cutting-edge data encoding technique developed under the supervision of Professor Muriel Medard, EECS, MIT. By leveraging RLNC, Optimum transforms slow, redundant peer-to-peer networks into fast, efficient, and scalable communication layers. @@ -21,7 +21,7 @@ developer-friendly APIs. ## Optimum Products -Optimum is realeasing its product [**Optimum P2P**](./p2p.md) and soon be followed by **DeROM** (Decentralized Read Only Memory), ([**DeRAM** (Decentralized Random Access Memory)](./deram.md) - bring measurable improvements across the entire blockchain stack: +Optimum is releasing its product [**Optimum P2P**](./p2p.md) and will soon be followed by **DeROM** (Decentralized Read Only Memory) and [**DeRAM** (Decentralized Random Access Memory)](./deram.md) - bringing measurable improvements across the entire blockchain stack: * **For L1 and L2 blockchains**: Accelerated block propagation, reduced bandwidth usage, and optimized on-chain storage. diff --git a/docs/learn/overview/p2p.md b/docs/learn/overview/p2p.md index 3e9f3eb..46e069c 100644 --- a/docs/learn/overview/p2p.md +++ b/docs/learn/overview/p2p.md @@ -60,7 +60,7 @@ When a node receives a shard: ### Control Messages -OptimumP2P usages and extends [GossipSub's](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md#control-messages) control messages for optimized mesh performance: +OptimumP2P uses and extends [GossipSub's](https://github.com/libp2p/specs/blob/master/pubsub/gossipsub/gossipsub-v1.0.md#control-messages) control messages for optimized mesh performance: | Message | Purpose | |-------------|-------------------------------------------------------------------------| diff --git a/docs/research/gossip/decentralized-access.md b/docs/research/gossip/decentralized-access.md index 79fed56..174e861 100644 --- a/docs/research/gossip/decentralized-access.md +++ b/docs/research/gossip/decentralized-access.md @@ -6,8 +6,34 @@ *[Joint Optimization of Storage and Transmission via Coding Traffic Flows for Content Distribution](https://ece.northeastern.edu/fac-ece/ioannidis/static/pdf/2023/m7210-malak-final.pdf)*, **WiOpt**, (Best Paper Award), August 2023. +## [2022] + +**Nicolas Nicolaou, Viveck R. Cadambe, N. Prakash, Andria Trigeorgi, Kishori M. Konwar, Muriel Médard, Nancy A. Lynch**, +*[ARES: Adaptive, Reconfigurable, Erasure coded, Atomic Storage](https://dl.acm.org/doi/10.1145/3510613)*, +**ACM Transactions on Storage**, vol. 18, no. 4, pp. 33:1-33:39, 2022. + +## [2021] + +**Guo-Shu Gao, Kishori M. Konwar, Juan Mantica, Haochen Pan, Darius Russell Kish, Lewis Tseng, Zezhi Wang, Yingjian Wu**, +*[Practical Experience Report: Cassandra+: Trading-Off Consistency, Latency, and Fault-tolerance in Cassandra](https://par.nsf.gov/servlets/purl/10283392)*, +**ICDCN**, pp. 191-195, 2021. + +## [2020] + +**Viveck R. Cadambe, Kishori M. Konwar, Muriel Médard, Haochen Pan, Lewis Tseng, Yingjian Wu**, +*[CassandrEAS: Highly Available and Storage-Efficient Distributed Key-Value Store with Erasure Coding](https://ieeexplore.ieee.org/document/9309315)*, +**NCA**, pp. 1-8, 2020. + ## [2019] +**Nicolas C. Nicolaou, Viveck R. Cadambe, N. Prakash, Kishori M. Konwar, Muriel Médard, Nancy A. Lynch**, +*[ARES: Adaptive, Reconfigurable, Erasure Coded, Atomic Storage](https://arxiv.org/abs/1805.03727)*, +**ICDCS**, pp. 2195-2205, 2019. + +**Kishori M. Konwar, N. Prakash, Muriel Médard, Nancy A. Lynch**, +*[Fast Lean Erasure-Coded Atomic Memory Object](https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.OPODIS.2019.12)*, +**OPODIS**, pp. 12:1-12:17, 2019. + **P. J. Braun, Malak, D., Médard, M., and Ekler, P.**, *[Enabling multi-source coded downloads](https://drive.google.com/file/d/1s8NkV3flsnfyxGYpLtphutWsFgk8mDzk/view?usp=sharing)*, **IEEE International Conference on EDGE Computing (EDGE)**, 2019. @@ -30,10 +56,24 @@ ## [2017] +**Kishori M. Konwar, N. Prakash, Nancy A. Lynch, Muriel Médard**, +*[A Layered Architecture for Erasure-Coded Consistent Distributed Storage](https://dl.acm.org/doi/10.1145/3087801.3087809)*, +**PODC**, pp. 63-72, 2017. + **C. W. Sørensen, Lucani, D. E., and Médard, M.**, *[On Network Coded File System Shim: Over-the-top Multipath Multi-Source Made Easy](https://drive.google.com/file/d/17FUlu3dWcFa4X9L2SATMVD-rRpb6pzkM/view?usp=drive_link)*, **IEEE ICC SAC Symposium Cloud Communications and Networking Track**, 2017. +## [2016] + +**Kishori M. Konwar, N. Prakash, Erez Kantor, Nancy A. Lynch, Muriel Médard, Alexander A. Schwarzmann**, +*[Storage-Optimized Data-Atomic Algorithms for Handling Erasures and Errors in Distributed Storage Systems](https://ieeexplore.ieee.org/document/7516084)*, +**IPDPS**, pp. 720-729, 2016. + +**Kishori M. Konwar, N. Prakash, Nancy A. Lynch, Muriel Médard**, +*[RADON: Repairable Atomic Data Object in Networks](https://drops.dagstuhl.de/entities/document/10.4230/LIPIcs.OPODIS.2016.28)*, +**OPODIS**, pp. 28:1-28:17, 2016. + ## [2014] **F. H. P. Fitzek, Toth, T., Szabados, A., Pederson, M. V., Lucani, D. E., Sipos, M., Charaf, H., and Médard, M.**, From 20922cfb6d042e75552e4f9cfbaee933e09e725e Mon Sep 17 00:00:00 2001 From: kishori82 Date: Mon, 1 Sep 2025 18:08:31 -0400 Subject: [PATCH 44/46] misc: made titles consistent --- .vitepress/config.mts | 6 +++--- docs/guides/overview.md | 8 ++++---- docs/learn/overview/p2p.md | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 77a08b4..9e30644 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -240,17 +240,17 @@ function sidebarHome() { collapsed: true, items: [ { - text: "Using mump2p-cli", + text: "Getting Started with CLI", link: "/docs/guides/01-getting-started-cli", }, { - text: "Local Setup with Docker", + text: "Getting Started with Docker", link: "/docs/guides/02-getting-started-docker", }, ], }, { - text: "Parameters", + text: "Understanding Key Parameters", link: "/docs/guides/03-parameters", }, { diff --git a/docs/guides/overview.md b/docs/guides/overview.md index 787bace..f7dc89d 100644 --- a/docs/guides/overview.md +++ b/docs/guides/overview.md @@ -5,7 +5,7 @@ This developer guide is your complete reference for installing, configuring, and This guide walks you through everything you need to **understand**, **deploy**, **run**, and **experiment** with OptimumP2P. It’s designed for beginners but complete enough for advanced developers to jump in and integrate. -If you want deep technical theory, see the **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** — this guide stays hands-on. +For more details pelase see the **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** — this guide stays hands-on. Whether you are an application developer, or a systems engineer or a hackathon participant, this guide will help you: @@ -27,8 +27,8 @@ Before diving in, you should be familiar with these terms and how they relate to | **Threshold**| The fraction of shards required to successfully decode a message. For example, a threshold of 0.7 means only 70% of shards are needed. | | **RLNC** | Random Linear Network Coding — a technique that mixes message fragments mathematically for redundancy and efficiency. | | **Mesh** | The set of directly connected peers in a topic. The mesh topology affects redundancy, latency, and fault tolerance. | -| **Bootstrap Node** | A known peer address used to join the P2P network. Without one, a new node cannot discover other peers. | -| **Optimum Proxy** | A bridge between clients and the P2P mesh. It manages subscriptions, publications, and threshold logic on behalf of clients. | +| **Bootstrap Node** | A known peer address used to join the P2P network and discover other peers. | +| **Optimum Proxy** | Bridge nodes between clients and the P2P mesh. It manages subscriptions, publications, and threshold logic on behalf of clients. | | **Direct P2P Mode** | Clients connect directly to P2P nodes via gRPC without going through a proxy. This can reduce latency but requires more configuration. | | **Mesh Parameters** | Settings such as `MESH_TARGET` that define how many peers a node tries to keep in its topic mesh. | | **Fanout** | A temporary set of peers a publisher sends messages to when it is not part of the topic mesh. | @@ -41,7 +41,7 @@ Before diving in, you should be familiar with these terms and how they relate to ## What This Guide Covers -This guide is organized into self-contained chapters: +This guide is organized into self-contained section: 1. **[Getting Started with CLI](01-getting-started-cli.md)** — Use `mump2p-cli` to connect to a hosted Optimum Proxy with no setup required. 2. **[Getting Started with Docker](02-getting-started-docker.md)** — Run your own local proxy and P2P nodes for full control. diff --git a/docs/learn/overview/p2p.md b/docs/learn/overview/p2p.md index 46e069c..12636ac 100644 --- a/docs/learn/overview/p2p.md +++ b/docs/learn/overview/p2p.md @@ -147,9 +147,9 @@ OptimumP2P inherits libp2p’s robust security foundation, and adds safeguards s For a full overview of these protections, refer to the [libp2p security considerations](https://docs.libp2p.io/concepts/security/security-considerations/). -### Network Coding-Specific Security: Pollution Attacks +### OptimumP2P avoids Pollution Attacks -The primary security challenge unique to network coding is the risk of **pollution attacks**. In such an attack, a malicious actor injects corrupted or invalid coded shards into the network, with the goal of preventing honest nodes from successfully decoding the original message. +In **pollution attacks** attack, a malicious actor injects corrupted or invalid coded shards into the network, with the goal of preventing honest nodes from successfully decoding the original message. OptimumP2P mitigates this risk through a multi-layered approach centered on **source authentication**. From 8c9088016455e670b21cfa7d05e3ffc3f9c7c1f6 Mon Sep 17 00:00:00 2001 From: kishori82 Date: Mon, 1 Sep 2025 18:41:54 -0400 Subject: [PATCH 45/46] misc: made some minor changes --- docs/guides/01-getting-started-cli.md | 5 ++--- docs/guides/02-getting-started-docker.md | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/guides/01-getting-started-cli.md b/docs/guides/01-getting-started-cli.md index 566673e..7a1b44d 100644 --- a/docs/guides/01-getting-started-cli.md +++ b/docs/guides/01-getting-started-cli.md @@ -28,11 +28,10 @@ If you connect directly to a P2P node, you need to: * Handle peer discovery. * Many more complex configuration operations. -The **Optimum Proxy** removes that complexity: +The **Optimum Proxies** removes that complexity: -* Acts as your **single point of entry**. +* Acts as **points of entry**. * Maintains connections to multiple OptimumP2P nodes. -* Reassembles messages from shards using RLNC. * Enforces thresholds and applies filters. * Tracks usage and applies fair rate limits. diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index 1e6024c..f29a8a2 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -460,7 +460,7 @@ func main() { } ``` -## 5. Mode B — Direct OptimumP2P (Advanced / Low Latency) +## 5. Mode B — Direct OptimumP2P (Advanced / Lower Latency) In this mode, clients connect `straight to node sidecar gRPC`. You’ll manage client-side reconnection, backoff, and which node to hit. From a16dfba96a380582a3d88b29451782821afa405f Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Tue, 2 Sep 2025 13:43:30 +0530 Subject: [PATCH 46/46] fix: changes based on docs review --- .vitepress/config.mts | 75 ++++++-------------- docs/guides/02-getting-started-docker.md | 17 ++++- docs/guides/overview.md | 89 +++++++++++++++--------- docs/learn/overview/intro.md | 70 ++++++++++++------- 4 files changed, 137 insertions(+), 114 deletions(-) diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 9e30644..67a0724 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -184,70 +184,38 @@ function nav() { function sidebarHome() { return [ { - text: "Learn", + text: "Overview of Optimum", collapsed: false, items: [ { - text: "Overview of Optimum", - collapsed: true, - items: [ - { - text: "Introduction", - link: "/docs/learn/overview/intro", - }, - { - text: "OptimumP2P", - link: "/docs/learn/overview/p2p.md", - }, - { - text: "Optimum DeRAM", - link: "/docs/learn/overview/deram.md", - }, - ], + text: "Introduction", + link: "/docs/learn/overview/intro", + }, + { + text: "OptimumP2P", + link: "/docs/learn/overview/p2p.md", + }, + { + text: "Optimum DeRAM", + link: "/docs/learn/overview/deram.md", }, - // { - // text: "OptimumP2P", - // collapsed: true, - // items: [ - // ], - // }, - // { - // text: "MUM", - // collapsed: true, - // items: [ - // { - // text: "Overview of MUM", - // link: "/docs/learn/mum", - // }, - // { - // text: "How to stake MUM", - // link: "/docs/learn/how-to-stake-mum", - // }, - // ], - // }, ], }, - { - text: "Quick Start", + { + text: "Getting Started", collapsed: false, items: [ { - text: "Overview", + text: "Quick Start", link: "/docs/guides/overview", }, { - text: "Getting Started", - collapsed: true, - items: [ - { - text: "Getting Started with CLI", - link: "/docs/guides/01-getting-started-cli", - }, - { - text: "Getting Started with Docker", - link: "/docs/guides/02-getting-started-docker", - }, - ], + text: "Getting Started with CLI", + link: "/docs/guides/01-getting-started-cli", + }, + { + text: "Getting Started with Docker", + link: "/docs/guides/02-getting-started-docker", }, { text: "Understanding Key Parameters", @@ -258,10 +226,9 @@ function sidebarHome() { link: "/docs/guides/04-experiments", }, { - text: "FAQs", + text: "FAQ", link: "/docs/guides/05-faq-glossary", }, - ], }, { diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index f29a8a2..53f0689 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -28,6 +28,21 @@ local deployment offers: * **Private Testing** — Run in isolated networks without using public proxies. * **Advanced Experiments** — Simulate network conditions, failure scenarios, and scaling. +## Which mode should I use? + +Choose the deployment mode that best fits your use case: + +| **Mode A: Proxy + OptimumP2P** | **Mode B: Direct OptimumP2P** | +|---|---| +| **One endpoint** — simpler client config | **Lowest latency** — fewer network hops | +| **Policy control** — rate limiting, auth | **Direct control** — no proxy overhead | +| **Auto failover** — proxy handles node selection | **Manual failover** — clients manage addresses | + +**Quick Decision:** + +* **Want simpler setup and client code?** → **[Start with Mode A](#4-mode-a--optimumproxy--optimump2p-recommended)** +* **Need maximum performance and control?** → **[Jump to Mode B](#5-mode-b--direct-optimump2p-advanced--lower-latency)** + ## 1. Before You Start ### Requirements @@ -262,7 +277,7 @@ You should see the mesh forming and node-2 discovering node-1 via the bootstrap ### Send & receive (Proxy mode) using mump2p-cli -If you haven’t already installed `mump2p`, see the [**Getting Started with mump2p-cli**](./01-getting-started-cli.md) chapter. +If you haven't already installed `mump2p-cli`, see the [**Getting Started with mump2p-cli**](./01-getting-started-cli.md) chapter. **Subscribe:** diff --git a/docs/guides/overview.md b/docs/guides/overview.md index f7dc89d..b702ae3 100644 --- a/docs/guides/overview.md +++ b/docs/guides/overview.md @@ -1,23 +1,68 @@ -# Overview +# Quick Start This developer guide is your complete reference for installing, configuring, and operating **OptimumP2P**. -This guide walks you through everything you need to **understand**, **deploy**, **run**, and **experiment** with OptimumP2P. -It’s designed for beginners but complete enough for advanced developers to jump in and integrate. +This guide walks you through everything you need to **understand**, **deploy**, **run**, and **experiment** with OptimumP2P. It's designed for beginners but complete enough for advanced developers to jump in and integrate. -For more details pelase see the **[OptimumP2P Technical Overview](../learn/overview/p2p.md)** — this guide stays hands-on. +Whether you are an application developer, systems engineer, or hackathon participant, this guide will help you: -Whether you are an application developer, or a systems engineer or a hackathon participant, this guide will help you: +1. **Install and run** OptimumP2P in different environments +2. **Connect clients** via gRPC, REST, or CLI +3. **Tune parameters** for performance or reliability +4. **Run experiments** to validate system behavior +5. **Monitor and debug** your deployment + +## Start Building + +Choose your path to get started with OptimumP2P: + +### **Try OptimumP2P (≤5 min)** + +**[Using mump2p-cli](01-getting-started-cli.md)** — Connect to hosted proxy, no setup required + +* One-command installation +* Instant messaging with hosted infrastructure +* Perfect for testing and prototyping + +### **Run Locally** + +**[Local Setup with Docker](02-getting-started-docker.md)** — Full control over configuration + +* Complete local network deployment +* Experiment with different parameters +* Compare OptimumP2P vs GossipSub performance + +### **Understanding & Experimenting** + +Essential for hackathon success: + +* **[Understanding Key Parameters](03-parameters.md)** — Tune thresholds, shards, and mesh settings +* **[Common Experiments](04-experiments.md)** — Test performance under different conditions +* **[FAQ](05-faq-glossary.md)** — Quick answers and debugging help + + +## What This Guide Covers + +This guide is organized into self-contained sections: + +1. **[Using mump2p-cli](01-getting-started-cli.md)** — Connect to hosted proxy with no setup required. +2. **[Local Setup with Docker](02-getting-started-docker.md)** — Run your own local proxy and P2P nodes for full control. +3. **[Understanding Key Parameters](03-parameters.md)** — Tune thresholds, shards, and mesh settings for your workload. +4. **[Common Experiments](04-experiments.md)** — Test performance and reliability under different conditions. +5. **[FAQ](05-faq-glossary.md)** — Quick answers and debugging help. + + +## Who This Guide Is For + +* **Application developers** who want to integrate fast, resilient messaging. +* **Infrastructure engineers** deploying distributed systems. +* **Hackathon teams** experimenting with real-time messaging. +* **Researchers** testing RLNC in real-world scenarios. -1. **Install and run** OptimumP2P in different environments. -2. **Connect clients** via gRPC, REST, or CLI. -3. **Tune parameters** for performance or reliability. -4. **Run experiments** to validate system behavior. -5. **Monitor and debug** your deployment. ## Key Concepts -Before diving in, you should be familiar with these terms and how they relate to OptimumP2P’s architecture: +Before diving deep, familiarize yourself with these terms and how they relate to OptimumP2P's architecture: | Term | Description | |--------------|-------------| @@ -36,25 +81,5 @@ Before diving in, you should be familiar with these terms and how they relate to | **Node Discovery** | The process by which proxies or nodes automatically learn about other nodes to connect to. | | **gRPC API** | The RPC interface provided by either a P2P node or a proxy for client communication. | ---- - - -## What This Guide Covers - -This guide is organized into self-contained section: - -1. **[Getting Started with CLI](01-getting-started-cli.md)** — Use `mump2p-cli` to connect to a hosted Optimum Proxy with no setup required. -2. **[Getting Started with Docker](02-getting-started-docker.md)** — Run your own local proxy and P2P nodes for full control. -3. **[Understanding Key Parameters](03-parameters.md)** — Tune thresholds, shards, and mesh settings for your workload. -4. **[Common Experiments](04-experiments.md)** — Test performance and reliability under different conditions. -5. **[FAQ & Glossary](05-faq-glossary.md)** — Quick answers and key term definitions. - - - -## Who This Guide Is For - -* **Application developers** who want to integrate fast, resilient messaging. -* **Infrastructure engineers** deploying distributed systems. -* **Hackathon teams** experimenting with real-time messaging. -* **Researchers** testing RLNC in real-world scenarios. +For more technical details, see the **[OptimumP2P Technical Overview](../learn/overview/p2p.md)**. diff --git a/docs/learn/overview/intro.md b/docs/learn/overview/intro.md index 7e438a6..2eb3595 100644 --- a/docs/learn/overview/intro.md +++ b/docs/learn/overview/intro.md @@ -4,31 +4,47 @@ description: Get a quick primer on the constituent components of the Optimum pro # Introduction to Optimum -**Optimum** is the world's first decentralized, network communication and high-performance shared memory infrastructure -for any blockchain — built to do low-latency gossip around geographically distributed nodes, to scale data access, reduce network congestion, and power the next generation of decentralized applications (dApps). -Powered by **Random Linear Network Coding (RLNC)** — a cutting-edge data encoding technique developed under the supervision of -Professor Muriel Medard, EECS, MIT. -By leveraging RLNC, Optimum transforms slow, redundant peer-to-peer networks into fast, efficient, and scalable communication layers. - -Optimum is a decentralized network of **flexnodes** that can be run by anyone and -permissionlessly connect to any blockchain. - -With Optimum, blockchains gain a **memory bus and RAM** that rivals the performance -of modern computing. At its core, Optimum is building a provably optimal memory -infrastructure that transforms blockchains into high-speed, scalable computing -networks. The architecture is modular, permissionless, and easy to integrate via -developer-friendly APIs. - -## Optimum Products - -Optimum is releasing its product [**Optimum P2P**](./p2p.md) and will soon be followed by **DeROM** (Decentralized Read Only Memory) and [**DeRAM** (Decentralized Random Access Memory)](./deram.md) - bringing measurable improvements across the entire blockchain stack: - -* **For L1 and L2 blockchains**: - Accelerated block propagation, reduced bandwidth usage, and optimized on-chain storage. -* **For Validators**: - Faster data propagation, reduced operational overhead, and increased rewards through higher APY and MEV. -* **For dApp developers**: - Improved transaction relay and prioritization — enabling latency-sensitive, high-throughput, and cost-aware applications. -* **For end users**: - Faster transactions, faster confirmations, and smoother interfaces — enhancing overall user experience. +**Optimum** is the world's first decentralized **shared-memory and network-communication** layer for blockchains. It accelerates **low-latency gossip** across geographically distributed nodes to scale data access and reduce network congestion for latency-sensitive dApps. + +Powered by [Random Linear Network Coding (RLNC)](./p2p.md#random-linear-network-coding-rlnc-fundamentals) — a cutting-edge data encoding technique developed under the supervision of **Professor Muriel Medard, EECS, MIT**. By applying RLNC to gossip, Optimum reduces redundancy and improves loss tolerance; under standard RLNC models, the dissemination strategy is **provably optimal** for throughput/latency under loss and contention. + +**Network & roles.** Optimum runs as a permissionless network of **[flexnodes](#flexnodes)** that anyone can operate alongside existing clients and P2P stacks. + +## Products + +Builders and operators can adopt **OptimumP2P** now for measurable latency gains. DeRAM and DeROM are next to unlock low-latency reads/writes. + +### OptimumP2P + +RLNC-accelerated, libp2p/gossipsub-compatible pub/sub for fast, resilient propagation of blocks, blobs, and transactions. +**Get started:** [Overview](../../learn/overview/p2p.md) · [Quickstart](../../guides/01-getting-started-cli.md) + +### Optimum DeRAM (Decentralized Random Access Memory) + +Decentralized **read-write** memory exposing low-latency shared-state semantics across nodes. +**Get started:** [Introduction](./deram.md) + +### Optimum DeROM (Decentralized Read-Only Memory) + +Decentralized **read-only/append-oriented** memory optimized for broadcast and caching. +**Get started:** [Coming next] + +## Flexnodes + +A **flexnode** is an operator-run node that participates in Optimum's coded gossip and serves memory requests. Flexnodes: + +* encode, decode, and forward RLNC-coded gossip frames; +* maintain bounded coded buffers to recover loss and smooth tail latency; +* serve **DeRAM/DeROM** reads/writes per policy and quotas via stable APIs; +* interoperate with existing clients and libp2p/gossipsub where applicable. + +## Start here + +* **Try OptimumP2P (≤5 min):** [Using mump2p-cli](../../guides/01-getting-started-cli.md) +* **Run locally:** [Local Setup with Docker](../../guides/02-getting-started-docker.md) +* **Integrate:** [Publish/Subscribe via Optimum Proxy endpoints](https://github.com/getoptimum/optimum-dev-setup-guide) + +### Intended users + +L1/L2 teams (faster block/blob propagation); validators (lower missed-slot risk → APY/MEV uplift); node operators & builders (lower tail latency); dApp developers (faster inclusion); end users (snappier UX).

WEZ*!Bn`T|Q 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 literal 0 HcmV?d00001 From 6d04580c34f3b898fb89251126b0a37480f8a294 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Thu, 21 Aug 2025 14:02:12 +0530 Subject: [PATCH 35/46] fix: add correct commands --- docs/guides/02-getting-started-docker.md | 43 ++++++++++++++++++------ 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index e4d23d7..e3efbc3 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -246,9 +246,8 @@ docker compose logs -f proxy | sed -n '1,120p ```sh # Proxy -curl -s http://localhost:8081/api/version - -TODO:: update with the correct version and health endpoint after fixing https://github.com/getoptimum/optimum-proxy/issues/145 +curl -s http://localhost:8081/api/v1/version +curl -s http://localhost:8081/api/v1/health # Nodes curl -s http://localhost:9091/api/v1/health @@ -282,11 +281,10 @@ You should see your subscriber print the message immediately. ### Use Proxy using REST API and WebSocket (optional) -TODO:: +**Publish a message:** ```sh -curl -X POST https://xxx/api/publish \ - -H "Authorization: Bearer YOUR_JWT_TOKEN" \ +curl -X POST http://localhost:8081/api/v1/publish \ -H "Content-Type: application/json" \ -d '{ "client_id": "your-client-id", @@ -295,9 +293,18 @@ curl -X POST https://xxx/api/publish \ }' ``` +**Parameters:** + +- `client_id` – Unique identifier for the client (required) +- `topic` – The topic to publish the message to +- `message` – The content to broadcast to subscribers + +> **Important:** The `client_id` field is required for all publish requests. This should be the same ID used when subscribing to topics. If you're using WebSocket connections, use the same `client_id` for consistency. + +**Subscribe to a topic:** + ```sh -curl -X POST https://xxx/api/subscribe \ - -H "Authorization: Bearer YOUR_JWT_TOKEN" \ +curl -X POST http://localhost:8081/api/v1/subscribe \ -H "Content-Type: application/json" \ -d '{ "client_id": "unique-client-id", @@ -306,11 +313,27 @@ curl -X POST https://xxx/api/subscribe \ }' ``` +**Parameters:** + +- `client_id` – Unique identifier for the client (required) +- `topic` – The topic to subscribe to +- `threshold` (optional, float) – Minimum percentage (0.1–1.0) of active nodes that must report a message before it's forwarded to this client + - Default: 0.1 (10% confirmation) + +**Connect via WebSocket:** + ```sh -wscat -c "wss://xxx/api/ws?client_id=unique-client-id" \ - -H "Authorization: Bearer YOUR_JWT_TOKEN" +wscat -c "ws://localhost:8081/api/v1/ws?client_id=unique-client-id" ``` +> **Important:** WebSocket has limitations, and you may experience unreliable delivery when publishing message bursts. A gRPC connection (shown below) provides more reliable streaming. + +**Rate Limits:** + +Rate limits are enforced based on client configuration. Exceeding limits results in 429 responses. + +> **Note:** Since authentication is disabled in our local setup (`ENABLE_AUTH=false`), no JWT tokens are required for these requests. + ### Use Proxy using gRPC Stream For a complete working proxy client with both REST subscription and gRPC streaming, see the full implementation: From 290cea311c9d899c4ae5c1d0a1358d4a195cfde3 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Thu, 21 Aug 2025 14:04:10 +0530 Subject: [PATCH 36/46] fix: lint --- docs/guides/02-getting-started-docker.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index e3efbc3..797f3e7 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -295,9 +295,9 @@ curl -X POST http://localhost:8081/api/v1/publish \ **Parameters:** -- `client_id` – Unique identifier for the client (required) -- `topic` – The topic to publish the message to -- `message` – The content to broadcast to subscribers +* `client_id` – Unique identifier for the client (required) +* `topic` – The topic to publish the message to +* `message` – The content to broadcast to subscribers > **Important:** The `client_id` field is required for all publish requests. This should be the same ID used when subscribing to topics. If you're using WebSocket connections, use the same `client_id` for consistency. @@ -315,10 +315,10 @@ curl -X POST http://localhost:8081/api/v1/subscribe \ **Parameters:** -- `client_id` – Unique identifier for the client (required) -- `topic` – The topic to subscribe to -- `threshold` (optional, float) – Minimum percentage (0.1–1.0) of active nodes that must report a message before it's forwarded to this client - - Default: 0.1 (10% confirmation) +* `client_id` – Unique identifier for the client (required) +* `topic` – The topic to subscribe to +* `threshold` (optional, float) – Minimum percentage (0.1–1.0) of active nodes that must report a message before it's forwarded to this client + * Default: 0.1 (10% confirmation) **Connect via WebSocket:** From ca29361c2f008a7a35bf8c7c50c25adca5623b19 Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Thu, 21 Aug 2025 22:50:10 +0530 Subject: [PATCH 37/46] fix: rc3 ->rc4 --- docs/guides/01-getting-started-cli.md | 71 +++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/docs/guides/01-getting-started-cli.md b/docs/guides/01-getting-started-cli.md index d1bfde1..566673e 100644 --- a/docs/guides/01-getting-started-cli.md +++ b/docs/guides/01-getting-started-cli.md @@ -53,7 +53,7 @@ Without authentication, you can only use **open/public topics** with strict limi ![mump2p CLI Architecture](../../static/img/mump2p.png) -* CLI talks to the Proxy via gRPC/WebSocket. +* CLI talks to the Proxy via HTTP/WebSocket or gRPC. * Proxy connects to the P2P Mesh (multiple nodes across regions). * Mesh uses RLNC for efficient message delivery and reconstruction. * Your client receives fully decoded messages in real-time. @@ -91,8 +91,8 @@ If you prefer manual installation: **Output:** ```bash -Version: v0.0.1-rc3-rc -Commit: 5962e6a +Version: v0.0.1-rc4 +Commit: fdbee67 ``` You can visit [mump2p-cli release page](https://github.com/getoptimum/mump2p-cli/releases) for the latest version. @@ -260,6 +260,24 @@ Opening WebSocket connection... Listening for messages on topic 'demo'... Press Ctrl+C to exit ``` +#### gRPC Subscription + +For high-performance streaming, use gRPC mode: + +```sh +./mump2p subscribe --topic=demo --grpc +``` + +**Output:** + +```bash +claims is &{google-oauth2|100677750055416883405 2025-08-21 16:01:29 +0530 IST 2025-08-22 16:01:29 +0530 IST true 4194304 1000 8 5368709120 google-oauth2|100677750055416883405 1755772288994} +claims is google-oauth2|100677750055416883405 +Sending HTTP POST subscription request... +HTTP POST subscription successful: {"client":"google-oauth2|100677750055416883405","status":"subscribed"} +Listening for messages on topic 'demo' via gRPC... Press Ctrl+C to exit +``` + --- ### 5. Publish a Message @@ -290,6 +308,20 @@ Listening for messages on topic 'demo'... Press Ctrl+C to exit {"status":"published","topic":"demo"} ``` +#### gRPC Publishing + +For high-performance publishing, use gRPC mode: + +```sh +./mump2p publish --topic=demo --message="Hello via gRPC!" --grpc +``` + +**Output:** + +```bash +✅ Published via gRPC inline message +``` + #### With threshold ```sh @@ -323,7 +355,34 @@ Shows: --- -### 7. Common Issues +### 7. Check Proxy Health + +Monitor the health and system metrics of the proxy server: + +```sh +./mump2p health +``` + +**Output:** + +```bash +Proxy Health Status: +------------------- +Status: ok +Memory Used: 7.06% +CPU Used: 0.30% +Disk Used: 44.91% +``` + +#### Check specific proxy + +```sh +./mump2p health --service-url="http://35.221.118.95:8080" +``` + +--- + +### 8. Common Issues #### Unauthorized @@ -381,7 +440,7 @@ Error: authentication required: token has expired, please login again → Run `./mump2p login` to authenticate. -### 8. Important Tips +### 9. Important Tips * Use descriptive topic names per team. * Keep `whoami` and `usage` handy. @@ -389,6 +448,8 @@ Error: authentication required: token has expired, please login again * Start with hosted proxy, then try local deployment for full control. * Subscribe to a topic before publishing to it. * Use the `--service-url` flag to connect to different gateways for better performance. +* Use `--grpc` flag for high-performance streaming and publishing. +* Monitor proxy health with `./mump2p health` for troubleshooting. --- From 398a8fe419394153bb0aba3bbab7f4e864c70b3f Mon Sep 17 00:00:00 2001 From: swarnabhasinha Date: Fri, 22 Aug 2025 10:53:44 +0530 Subject: [PATCH 38/46] fix: diagrams and faq --- docs/guides/02-getting-started-docker.md | 4 ++-- docs/guides/05-faq-glossary.md | 11 +---------- static/img/docker_1.png | Bin 55282 -> 57480 bytes static/img/docker_2.png | Bin 55341 -> 94113 bytes 4 files changed, 3 insertions(+), 12 deletions(-) diff --git a/docs/guides/02-getting-started-docker.md b/docs/guides/02-getting-started-docker.md index 797f3e7..6002ccc 100644 --- a/docs/guides/02-getting-started-docker.md +++ b/docs/guides/02-getting-started-docker.md @@ -8,7 +8,7 @@ You can run the network in two primary ways: ![OptimumProxy + OptimumP2P Architecture](../../static/img/docker_1.png) * Simplifies client configuration — only the Proxy address is needed. -* Proxy handles shard reassembly, threshold logic, and node selection. +* Proxy handles shard reassembly, threshold logic, and node selection automatically. * Easier scaling and centralized policy control. **2. Direct OptimumP2P** — Clients connect directly to **OptimumP2P nodes** (each node must run the gRPC API). @@ -16,7 +16,7 @@ You can run the network in two primary ways: ![Direct OptimumP2P Architecture](../../static/img/docker_2.png) * Fewer network hops = potentially lower latency. -* Clients must know node addresses and manage failover. +* Clients must know node addresses and manage failover logic. * Best for specialized or performance-critical workloads. diff --git a/docs/guides/05-faq-glossary.md b/docs/guides/05-faq-glossary.md index 9482154..6c890bf 100644 --- a/docs/guides/05-faq-glossary.md +++ b/docs/guides/05-faq-glossary.md @@ -1,12 +1,3 @@ -# FAQ & Glossary - -This section gives you: - -* **Quick answers** to common developer questions about OptimumP2P -* A **glossary** of important terms so you can follow discussions and logs without confusion - ---- - -## Frequently Asked Questions (FAQ) +# Frequently Asked Questions (FAQs) TODO:: diff --git a/static/img/docker_1.png b/static/img/docker_1.png index 080eb18f9831c32f62d12882af59241c632b5f67..a7106731bf7c59afb96e78fd1dd3f5676aa34a6e 100644 GIT binary patch literal 57480 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