diff --git a/.gitignore b/.gitignore
index 07ecc71..1ebc1df 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
+.configs/
+.wallets/
+circom/
\*shell\*
hardhat.config.js
# Logs
diff --git a/README.md b/README.md
index 8a56aad..54afda5 100644
--- a/README.md
+++ b/README.md
@@ -1,353 +1,99 @@
-# WeaveDB Rollup Development Kit
+# WeaveDB on AO
-
+## Deployment
-## How Rollup Works
+You need to set up 5 components for local testing.
-- A rollup node can have multiple DB instances.
-- The admin user can add/update/remove DB instances.
-- Once a DB is added, the gateway node dispatches rollup child process which contains an L2 DB, a WAL DB, and plugins DBs. All these DBs are offchain WeaveDB instances.
-- If an L1 DB contract is deployed and rollup is enabled, the rollup process dispatches yet another child process for Warp SDK that keeps bundling L2 transactions and roll them up to the Warp sequencer in parallel.
-- The L1 WeaveDB contract can receive bundle transactions in parallel in any order, but can resolve the correct order and compute the exact same state as the corresponding L2 contract. L2 transaction hashes are chaind in such a way that L1 contract can resolve L2 transaction order.
-- When the WeaveDB Gateway receives an L2 query, it dispatches the query to the L2 DB on the rollup process, which triggers a WAL DB query, which in turn triggers offchain plugin DB queries.
-- If the rollup node started without any local cache, it can recover the L2 DB state from the corresponding L1 contract.
-- Users can query the DB directly on the L1 Warp contract, since L2 and L1 share the identical contract. The L1 delay is only a few seconds as the rollup flow takes less than 2 seconds.
+- WAO Server
+- WeaveDB on AO
+- Rollup Node
+- WeaveLayer on AO
+- Frontend Demo
-## Set up a Node
-
-### Prerequisites
-
-Install `docker` and `docker-compose` globally to your machine. And open port `8080` for anyone.
-
-### weavedb.config.js
-
-Create `weavedb.config.js` in `/grpc-node/node-server` directory.
-
-#### The minimum requirements
-
-- `admin` : an EVM private key for rollup node admin. The admin can add DBs to the node.
-- `bundler` : Arweave RSA keys for rollup bundler.
-The bundler will pay for rollup transactions and receive rewards from PoS in the future.
-- `rollups` : this can be either empty or filled with pre-defined DB instances. Each key is the database name.
- - `secure` : passed down to the contract initial-state, allways use `true` in production (default).
- - `owner` : the DB contract owner EVM address.
- - `tick` : time span in millisecond in which [tick](https://weavedb.vercel.app/docs/sdk/crons#tick) query will be periodically executed.
- - `contractTxId` : Warp L1 contractTxId.
- - `plugins` : add offchain plugins, plugin scripts have to be placed in `/grpc-node/node-server/plugins` with the same name.
- - `rollup` : a bloolean value to enable rollup to Arweave/Warp
-
-```js title="/grpc-node/node-server/weavedb.config.js"
-module.exports = {
- admin: EVM_PRIVATE_KEY,
- bundler: ARWEAVE_RSA_KEYS,
- rollups: {},
-}
-```
-
-#### Other Parameters
-
-- `dir` : cache dirctory, default to `/grpc-node/node-server/cache`.
-- `dbname` : cache database name, cache will be stored in `dir/dbname`.
-- `sequencerUrl` : the Warp sequencer URL to use with SDK.
-- `apiKey` : a Warp gateway API key to use with SDK.
-- `arweave` : arweave network configuration
-- `weavedb_srcTxId` : WeaveDB contract srcTxId
-- `weavedb_version` : WeaveDB contract version
-- `nostr` : enable WebSocket for Nostr, this turns the node into a Nostr relay.
- - `db` : the database name for Nostr events, there can be only one DB instance to receive Nostr events.
-- `snapshot` : config to store snapshots to GCP/S3.
- - `count` : the number of bundles between snapshots (default to `100`).
- - `gcp` : GCP configurations
- - `bucket` : `[projectId].appspot.com`
- - `keyFilename` : `gcs.json`
- - `s3` : S3 configurations
-
-With everything included,
-
-```js title="/grpc-node/node-server/weavedb.config.js"
-module.exports = {
- dir: "/home/xyz/cache",
- dbname: "mydb",
- sequencerUrl: "https://gw.warp.cc/",
- apiKey: "xxxxx",
- snapshot:{
- count: 100,
- gcs: { bucket: "xyz.appspot.com", keyFilename: "gcs.json" }
- },
- admin: "privateky...",
- arweave: {
- host: "arweave.net",
- port: 443,
- protocol: "https",
- },
- weavedb_srcTxId: "Ohr4AU6jRUCLoNSTTqu3bZ8GulKZ0V8gUm-vwrRbmS4",
- weavedb_version: "0.37.2",
- bundler: {
- kty: "RSA",
- ...
- },
- nostr: { db: "nostr" },
- rollups: {
- testdb: {
- secure: true,
- owner: "0xdef...",
- tick: 1000 * 60 * 5,
- contractTxId: "abcdef...",
- rollup: true,
- plugins: { notifications: {} },
- },
- nostr: {
- owner: "0xdef...",
- rollup: false,
- }
- },
-}
-```
-
-#### Auto Recovery
-
-If `contractTxId` is specified and the rollup node is re-initialized without cache, it will auto-recover the rollup DB state from Warp L1 transaction history.
-
-### Run docker-compose
+### WAO Server (Local Arweave & AO Units)
```bash
-yarn run-rollup
-```
-### Admin Operations
-
-Anyone can access the rollup node stats, which returns the deployed DB information.
-
-```js
-const DB = require("weavedb-node-client")
-const db = new DB({ rpc: "localhost:8080", contractTxId: "testdb" })
-const stats = await db.node({op: "stats"})
-```
-
-The admin EOA account can manage the rollup node and DBs from anywhere.
-
-#### Add DB
-
-```js
-const tx = await db.admin(
- {
- op: "add_db",
- key: "testdb2",
- db: {
- app: "http://localhost:3000", // this will be shown on the explorer
- name: "Jots", // this will be shown on the explorer
- rollup: true,
- plugins: { notifications: {} },
- tick: 1000 * 60 * 5,
- },
- },
- { privateKey: admin.privateKey }
-)
-```
-You can recover existing db with `contractTxId` after starting a new node.
-
-```js
-const tx = await db.admin(
- {
- op: "add_db",
- key: "testdb2",
- db: {
- app: "http://localhost:3000", // this will be shown on the explorer
- name: "Jots", // this will be shown on the explorer
- rollup: true,
- plugins: { notifications: {} },
- tick: 1000 * 60 * 5,
- contractTxId: "Warp_L1_contractTxId"
- },
- },
- { privateKey: admin.privateKey }
-)
-```
-
-#### Deploy Warp L1 Contract
-
-```js
-const { contractTxId, srcTxId } = await db.admin(
- { op: "deploy_contract", key: "testdb2" },
- { privateKey: admin.privateKey }
-)
-// you will need the "contractTxId" for regular DB queries
+npx wao
```
-#### Update DB
+Check that the following units are running.
-```js
-const tx = await db.admin(
- { op: "deploy_contract", key: "testdb2" },
- { privateKey: admin.privateKey }
-)
-```
-
-#### Remove DB
-
-```js
-const tx = await db.admin(
- { op: "remove_db", key: "testdb2" },
- { privateKey: admin.privateKey }
-)
-```
+- Arweave : [localhost:4000](http://localhost:4000)
+- MU : [localhost:4002](http://localhost:4002)
+- SU : [localhost:4003](http://localhost:4003)
+- CU : [localhost:4004](http://localhost:4004)
+### WeaveDB Processes on AO
-#### Query DB
+Clone the repo and install dependencies.
-You will need the L1 `contractTxId` from the deployment operation to instantiate the DB client.
-All L2 transactions will be signed with L1 `contractTxId` for L1/L2 verifiability.
-
-```js
-const DB = require("weavedb-node-client")
-const db = new DB({ rpc: "localhost:8080", contractTxId })
-const db_info = await db.getInfo()
+```bash
+git clone https://github.com/weavedb/weavedb-ao.git
+cd weavedb-ao/lua && yarn
+mkdir scripts/.wallets
```
+Under `scripts/.wallets`, prepare the following wallets.
-### Plugins
-
-We currently have only one plugin for [Jots](https://weavedb.vercel.app/docs/get-started/jots#write-db-configurations) called `notifications` which generates personal notifications from onchain Jots activities. The notification DB will be an offchain WeaveDB instance, which won't be recorded onchain. Not every data should be onchain, and offchain plugins solve the problem. WeaveDB can seamlessly run in multiple environment such as blockchain, offchain (local), browser and centralized cloud.
+- Owner ( `owner.json` | Arweave )
+- Bundler ( `bundler.json` | Arweave )
+- DB-Creator ( `db.json` | Arweave )
+- Validator1 ( `validator1.json` | Arweave )
+- Validator2 ( `validator2.json` | Arweave )
+- Delegator ( `delegator.json` | Arweave )
+- Rollup-Admin ( `admin.json` | EVM )
+- ZK-Committer ( `committer.json` | EVM )
-## Local Development Tips
+The zk-committer must have a positive ETH balance. Alchemy has a faucet for [Sepolia](https://www.alchemy.com/faucets/ethereum-sepolia).
-### Clone Repo
+Or you can generate missing wallets.
```bash
-git clone https://github.com/weavedb/rdk.git
+node scripts/gen_wallets.js
```
-### Explorer
+Create `.env` in `weavedbb-ao/lua` directory and specify [alchemy](https://alchemy.com) key.
-If you are running the rollup node on `localhost:8080`, you can view blocks and transactions on our public [WeaveDB Scan](https://scan.weavedb.dev/node/localhost).
+```text
+ALCHEMY=XXXXXXXXXXXXXXXXXXXX
+```
-However, the public explorer may not be up-to-date. To run the latest explorer, go to `explorer` folder.
+Deploy contracts.
```bash
-cd rdk/explorer
-yarn
-yarn dev
+node scripts/deploy_all.js
```
-Now the explorer is running locally at [localhost:3000/node/localhost](http://localhost:3000/node/localhost).
+### WeaveDB Rollup
-### Run Envoy Separately
-
-You can run Envoy separately on your computer, and run the bare rollup file `index.js` without Docker. This way, you don't have to restart docker-compose every time you make changes in development.
+In another terminal, run envoy so frontend apps can access via port 8080.
```bash
+cd weavedb-ao
yarn envoy
```
-Then you can run the rollup server without Docker.
+Now start the rollup node in another terminal.
```bash
-cd rdk/node/node-server
-yarn
+cd weavedbb-ao/node/node-server && yarn
node index.js
```
-### Arweave Local Testnet
-
-To test rollup executions in your local environment, you can run [arlocal](https://github.com/textury/arlocal) (Arweave local testnet), and redirect WeaveDB SDK / Warp SDK to it.
-
-### Integration Tests with Mocha
-
-You don't need to run Envoy for local tests. Envoy is to access the node from web browsers. Also, stop arlocal if you are running test scripts with [mocha](https://mochajs.org/). The test scripts will start everything with a clean state.
-
-We have `Test` helper utility, to make testing easier. Here is some boilerplate for you to start writing tests.
+### WeaveLayer Staking on AO
-```javascript
-const { expect } = require("chai")
-const DB = require("weavedb-node-client")
-const SDK = require("weavedb-sdk-node")
-const { wait, Test } = require("./lib/utils")
+Set up staking.
-describe("rollup node", function () {
- this.timeout(0)
- let admin, network, bundler, test
-
- before(async () => {
- // testing in insecure mode, never do that in production
- test = new Test({ secure: false })
- ;({ network, bundler, admin } = await test.start())
- })
-
- after(async () => {
- await test.stop()
-
- // some processes linger, so force exit for now
- process.exit()
- })
-
- it("should start server", async () => {
- const db = new DB({
- rpc: "localhost:9090",
- contractTxId: "testdb",
- arweave: network,
- })
- const stats = await db.node({ op: "stats" })
- expect(stats).to.eql({ dbs: [] })
-
- // add a DB to node
- const tx = await db.admin(
- {
- op: "add_db",
- key: "testdb",
- db: {
- app: "http://localhost:3000",
- name: "Jots",
- rollup: true,
- owner: admin.address,
- },
- },
- { privateKey: admin.privateKey },
- )
- expect(tx.success).to.eql(true)
- await wait(2000)
-
- // deploy L1 warp contract (via node)
- const { contractTxId, srcTxId } = await db.admin(
- { op: "deploy_contract", key: "testdb" },
- { privateKey: admin.privateKey },
- )
- expect((await db.node({ op: "stats" })).dbs[0].data.rollup).to.eql(true)
- await wait(2000)
-
- // check L1 warp contract info directly with SDK (not via node)
- const warp_db = new SDK({
- type: 3,
- contractTxId,
- arweave: network,
- })
- await warp_db.init()
- expect((await warp_db.getInfo()).version).to.eql("0.37.2")
-
- // update the DB (via node)
- const db2 = new DB({
- rpc: "localhost:9090",
- contractTxId,
- })
- const Bob = { name: "Bob" }
- const tx2 = await db2.set(Bob, "ppl", "Bob", {
- privateKey: admin.privateKey,
- })
- expect(tx2.success).to.eql(true)
- expect(await db2.get("ppl", "Bob")).to.eql(Bob)
-
- // check rollup
- await wait(5000)
- expect(
- (await warp_db.db.readState()).cachedValue.state.rollup.height,
- ).to.eql(1)
-
- // check if L1 Warp state is the same as L2 DB state
- expect(await warp_db.get("ppl", "Bob")).to.eql(Bob)
- })
-})
+```bash
+node scripts/setup_staking.js
```
-Run the tests.
+### Frontend Demo
+
+In anotehr terminal, run the demo app.
```bash
-cd rdk/node/node-server
-yarn test
+cd weavedb-ao/demo && yarn
+yarn dev
```
+
+Now, the demo is runnint at [localhost:3000](http://localhost:3000).
diff --git a/assets/architecuture.png b/assets/architecuture.png
deleted file mode 100644
index aace778..0000000
Binary files a/assets/architecuture.png and /dev/null differ
diff --git a/demo/.eslintrc.json b/demo/.eslintrc.json
new file mode 100644
index 0000000..bffb357
--- /dev/null
+++ b/demo/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+ "extends": "next/core-web-vitals"
+}
diff --git a/demo/.gitignore b/demo/.gitignore
new file mode 100644
index 0000000..88bda13
--- /dev/null
+++ b/demo/.gitignore
@@ -0,0 +1,2 @@
+.env.*
+.vercel
diff --git a/demo/arweave.mjs b/demo/arweave.mjs
new file mode 100644
index 0000000..37310e9
--- /dev/null
+++ b/demo/arweave.mjs
@@ -0,0 +1,87 @@
+import {
+ rmdirSync,
+ unlinkSync,
+ writeFileSync,
+ readFileSync,
+ readdirSync,
+} from "fs"
+
+import { resolve, extname } from "path"
+import * as cheerio from "cheerio"
+
+const out = resolve(import.meta.dirname, "out")
+const dirs = readdirSync(out, { withFileTypes: true, recursive: true })
+
+const prefixWithPath = url => {
+ const cleanedUrl = url.replace(/^\.\//, "").replace(/^\//, "")
+ const txt = "${path}" + cleanedUrl
+ return "`" + txt + "`"
+}
+
+const isRelativeUrl = url => !/^https?:\/\//i.test(url)
+
+let _dirs = []
+
+for (const v of dirs) {
+ const ext = extname(v.name)
+ const htmlPath = resolve(v.path, v.name)
+ if (v.isFile() && ext === ".html") {
+ if (v.name !== "index.html") {
+ unlinkSync(htmlPath)
+ } else {
+ const txt = readFileSync(htmlPath, "utf8")
+ const $ = cheerio.load(txt)
+ let _tags = []
+ $("link[href]").each((i, elem) => {
+ const href = $(elem).attr("href")
+ if (isRelativeUrl(href)) {
+ const props = { ...elem.attribs }
+ props.href = prefixWithPath(href)
+ _tags.push({ elm: "link", props })
+ $(elem).remove()
+ }
+ })
+
+ $("script[src]").each((i, elem) => {
+ const src = $(elem).attr("src")
+ if (isRelativeUrl(src)) {
+ const props = { ...elem.attribs }
+ props.src = prefixWithPath(src)
+ _tags.push({ elm: "script", props })
+ $(elem).remove()
+ }
+ })
+
+ $("script").each((i, elem) => {
+ const scriptContent = $(elem).html()
+ if (scriptContent && scriptContent.includes("let tags = []")) {
+ const tagsString = JSON.stringify(_tags)
+ const updatedScriptContent = scriptContent
+ .replace(/let\s+tags\s*=\s*\[\s*\]/, `let tags = ${tagsString}`)
+ .replace(/"`/g, "`")
+ .replace(/`"/g, "`")
+ $(elem).html(updatedScriptContent)
+ }
+ })
+ const modifiedHtml = $.root().html()
+ writeFileSync(htmlPath, modifiedHtml)
+ }
+ } else if (v.isFile() && ext === ".js" && /^webpack/.test(v.name)) {
+ const txt = readFileSync(htmlPath, "utf8")
+ const x = txt.match(/(.)\.p="\/_next\/"/)[1]
+ const mod = txt.replace(
+ new RegExp(`o=${x}\.p`, "g"),
+ `o=_assetPath()+${x}.p`,
+ )
+ writeFileSync(htmlPath, mod)
+ }
+}
+
+const dirs2 = readdirSync(out, { withFileTypes: true })
+for (const v of dirs2) {
+ const htmlPath = resolve(v.path, v.name)
+ console.log(htmlPath)
+ if (v.isDirectory() && v.name !== "_next") {
+ rmdirSync(htmlPath, { recursive: true, force: true })
+ }
+}
diff --git a/demo/components/About.js b/demo/components/About.js
new file mode 100644
index 0000000..d1af67f
--- /dev/null
+++ b/demo/components/About.js
@@ -0,0 +1,118 @@
+import { Flex, Box } from "@chakra-ui/react"
+import { map } from "ramda"
+
+export default function About({ setTab }) {
+ return (
+
+
+ Decentralized NoSQL Database
+
+
+ Better Developer Experience than Web2
+
+
+ {map(v => {
+ return map(v2 => {
+ return (
+
+
+
+ {v2.title}
+
+
+ {v2.desc}
+
+
+
+ )
+ })(v)
+ })([
+ [
+ {
+ title: "Smart Contract NoSQL Database",
+ desc: "WeaveDB is an AO process, which is a decentralized smartcontract and all data are permanently stored on the Arweave blockchain.",
+ },
+ {
+ title: "Compatible with Firestore",
+ desc: "WeaveDB queries are mostly compatible with Google Firestore, but the query APIs are simpler and more powerful in JSON formats.",
+ },
+ {
+ title: "Web2 Cloud Performance",
+ desc: "WeaveDB achieves the web2-like performance and latency by being a rollup to AO. Each DB instance is an app-specific rollup.",
+ },
+ ],
+ [
+ {
+ title: "No Infra Maintenance",
+ desc: "Once your DB instance is deployed onchain, there is no maintenance required, which is a far better dev experience than web2 cloud services.",
+ },
+ {
+ title: "Hyper Optimized ZKP for JSON",
+ desc: "zkJSON is novel encoding and zk circuits optimized for JSON. It takes only 3 seconds to generate a zkp to prove any JSON data.",
+ },
+ {
+ title: "Query from Other Blockchains",
+ desc: "WeaveDB is an optimistic zk-rollup to other blockchains allowing queries from any chain, which hyper-extends blockchains with off-chan data.",
+ },
+ ],
+ [
+ {
+ title: "Advanced DSL FPJSON",
+ desc: "FPJSON is a functional programming language in JSON format, which enables advanced access control rules for permissionless DBs.",
+ },
+ {
+ title: "Social Logins & Passkeys",
+ desc: "WeaveDB allows crypto wallets using web2 social logins such as Google, Github, and Apple. It also integrates passkeys for biometric authentications.",
+ },
+ {
+ title: "Extensive Developer Tools",
+ desc: "WeaveDB comes with an extensive set of dev tools such as No Code Web Console, CLI Testing Tools, WeaveDB Scan, ArNext React Framework.",
+ },
+ ],
+ ])}
+
+
+ setTab("create")}
+ mx={6}
+ bg="#9C89F6"
+ w="250px"
+ py={2}
+ color="white"
+ justify="center"
+ sx={{
+ borderRadius: "5px",
+ cursor: "pointer",
+ ":hover": { opacity: 0.75 },
+ }}
+ >
+ Try Demo
+
+ setTab("usecases")}
+ mx={6}
+ bg="#9C89F6"
+ w="250px"
+ py={2}
+ color="white"
+ justify="center"
+ sx={{
+ borderRadius: "5px",
+ cursor: "pointer",
+ ":hover": { opacity: 0.75 },
+ }}
+ >
+ Use Cases
+
+
+
+ )
+}
diff --git a/demo/components/Footer.js b/demo/components/Footer.js
new file mode 100644
index 0000000..91dbefa
--- /dev/null
+++ b/demo/components/Footer.js
@@ -0,0 +1,84 @@
+import { Image, Flex, Box } from "@chakra-ui/react"
+import { Link } from "arnext"
+
+export default function Footer({ setTab }) {
+ let ml = [4, 6]
+ return (
+
+
+
+
+
+
+ WeaveDB
+
+
+
+
+ Blog
+ Docs
+
+ Scan
+
+
+ tDB Token
+
+ Web Console
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/demo/components/Header.js b/demo/components/Header.js
new file mode 100644
index 0000000..f8ed1ab
--- /dev/null
+++ b/demo/components/Header.js
@@ -0,0 +1,409 @@
+import { startAuthentication, startRegistration } from "@simplewebauthn/browser"
+import { map } from "ramda"
+import forge from "node-forge"
+import Arweave from "arweave"
+import {
+ generateRegistrationOptions,
+ generateAuthenticationOptions,
+} from "@simplewebauthn/server"
+import { Image, Flex, Box } from "@chakra-ui/react"
+import { Link } from "arnext"
+import { useEffect, useState } from "react"
+const { AO } = require("aonote")
+import { opt } from "@/lib/utils"
+import lf from "localforage"
+
+function to64(x) {
+ let modulus = Buffer.from(x.toByteArray())
+ if (modulus[0] === 0) modulus = modulus.slice(1)
+ return modulus
+ .toString("base64")
+ .replace(/\+/g, "-")
+ .replace(/\//g, "_")
+ .replace(/=+$/, "")
+}
+
+function generateDeterministicRSAKey(entropy) {
+ const rng = forge.random.createInstance()
+ rng.seedFileSync = () => entropy.toString("hex")
+ const rsaKeyPair = forge.pki.rsa.generateKeyPair({
+ bits: 4096,
+ e: 0x10001,
+ prng: rng,
+ })
+ const { publicKey, privateKey } = rsaKeyPair
+ const { n } = publicKey
+ const { d, p, q, dP, dQ, qInv } = privateKey
+ const jwk = {
+ kty: "RSA",
+ e: "AQAB",
+ n: to64(n),
+ d: to64(d),
+ p: to64(p),
+ q: to64(q),
+ dp: to64(dP),
+ dq: to64(dQ),
+ qi: to64(qInv),
+ }
+ return jwk
+}
+
+async function deriveEntropyForRSA(prfKey) {
+ const hkdfKeyMaterial = await crypto.subtle.importKey(
+ "raw",
+ prfKey,
+ "HKDF",
+ false,
+ ["deriveBits"],
+ )
+
+ const derivedEntropy = await crypto.subtle.deriveBits(
+ {
+ name: "HKDF",
+ hash: "SHA-256",
+ salt: new Uint8Array(32),
+ info: new Uint8Array(0),
+ },
+ hkdfKeyMaterial,
+ 4096,
+ )
+ return new Uint8Array(derivedEntropy)
+}
+
+export default function Header({
+ isWallet,
+ setIsWallet,
+ addr,
+ toast,
+ setBalance,
+ setDeposit,
+ setIsDashboard,
+ isDashboard,
+ setAddr,
+ jwk,
+ setJwk,
+}) {
+ const [connecting, setConnecting] = useState(false)
+ const [wallet, setWallet] = useState(null)
+ useEffect(() => {
+ if (typeof arweaveWallet === "undefined") {
+ ;(async () => {
+ const wallet = (await lf.getItem("wallet")) ?? null
+ setWallet(wallet)
+ })()
+ }
+ }, [])
+ const page = isDashboard ? "Dashboard" : isWallet ? "Wallet" : "Demo"
+ return (
+
+
+
+
+
+ {isDashboard
+ ? "Dashboard"
+ : isWallet
+ ? "WeaveWallet"
+ : "WeaveDB Demos"}
+
+
+
+ {!addr ? null : (
+
+ {map(v => {
+ return (
+ {
+ if (v.name === "Dashboard") {
+ setIsWallet(false)
+ setIsDashboard(true)
+ } else if (v.name === "Wallet") {
+ setIsWallet(true)
+ setIsDashboard(false)
+ } else {
+ setIsWallet(false)
+ setIsDashboard(false)
+ }
+ }}
+ >
+ {v.name}
+
+ )
+ })([{ name: "Demo" }, { name: "Dashboard" }, { name: "Wallet" }])}
+
+ )}
+ {
+ if (!connecting) {
+ let err = null
+ if (addr) {
+ if (confirm("Disconnect your wallet?")) {
+ setIsWallet(false)
+ setIsDashboard(false)
+ setAddr(null)
+ setJwk(null)
+ }
+ } else {
+ setConnecting(true)
+ try {
+ let __addr
+ if (typeof arweaveWallet === "undefined") {
+ const arweave = Arweave.init()
+ const createName = "WeaveDB"
+ const rpID = location.host.split(":")[0]
+ const rpName = "Weave Wallet"
+ const first = new Uint8Array(new Array(32).fill(1)).buffer
+ const user = { id: "weavedb", username: "weave_db" }
+
+ if (wallet) {
+ const dec = new TextDecoder()
+ const opt = await generateAuthenticationOptions({
+ rpID,
+ rpName,
+ allowCredentials: [
+ { id: wallet.id, transport: wallet.transport },
+ ],
+ extensions: {
+ largeBlob: { read: true },
+ prf: { support: "preferred", eval: { first } },
+ },
+ })
+ let res = null
+ try {
+ res = await startAuthentication({ optionsJSON: opt })
+ } catch (e) {
+ res = await startAuthentication({ optionsJSON: opt })
+ }
+ if (res.clientExtensionResults.prf?.results?.first) {
+ const key = new Uint8Array(
+ res.clientExtensionResults.prf.results.first,
+ )
+ const rsaEntropy = await deriveEntropyForRSA(key)
+ const jwk = generateDeterministicRSAKey(rsaEntropy)
+ const addr2 = await arweave.wallets.jwkToAddress(jwk)
+ setJwk(jwk)
+ setWallet(wallet)
+ setAddr(addr2)
+ __addr = addr2
+ } else {
+ const jwk = JSON.parse(
+ dec.decode(res.clientExtensionResults.largeBlob.blob),
+ )
+ const addr2 = await arweave.wallets.jwkToAddress(jwk)
+ setJwk(jwk)
+ setWallet(wallet)
+ setAddr(addr2)
+ __addr = addr2
+ }
+ toast({
+ title: "Wallet Connected!",
+ status: "success",
+ duration: 5000,
+ isClosable: true,
+ })
+ } else {
+ let optionsJSON = await generateRegistrationOptions({
+ rpID,
+ rpName,
+ userName: user.username,
+ extensions: {
+ prf: { support: "preferred", eval: { first } },
+ largeBlob: { support: "preferred" },
+ },
+ })
+ const attResp = await startRegistration({ optionsJSON })
+ if (attResp?.clientExtensionResults?.prf?.enabled) {
+ const opt2 = await generateAuthenticationOptions({
+ rpID,
+ allowCredentials: [
+ { id: attResp.id, transport: attResp.transport },
+ ],
+ extensions: { prf: { eval: { first } } },
+ })
+ const attResp3 = await startAuthentication({
+ optionsJSON: opt2,
+ })
+
+ const key = new Uint8Array(
+ attResp3?.clientExtensionResults.prf.results.first,
+ )
+ const rsaEntropy = await deriveEntropyForRSA(key)
+ const jwk = generateDeterministicRSAKey(rsaEntropy)
+ const addr = await arweave.wallets.jwkToAddress(jwk)
+ __addr = addr
+ const wallet = {
+ addr,
+ id: attResp.id,
+ transport: attResp.transport,
+ }
+ setJwk(jwk)
+ setWallet(wallet)
+ setAddr(addr)
+ await lf.setItem("wallet", wallet)
+ toast({
+ title: "Wallet Created!",
+ status: "success",
+ duration: 5000,
+ isClosable: true,
+ })
+ } else if (
+ attResp?.clientExtensionResults?.largeBlob?.supported
+ ) {
+ const jwk = await arweave.wallets.generate()
+ const addr = await arweave.wallets.jwkToAddress(jwk)
+ __addr = addr
+ const wallet = {
+ addr,
+ id: attResp.id,
+ transport: attResp.transport,
+ }
+ await lf.setItem("wallet", wallet)
+ const enc = new TextEncoder()
+ const opt2 = await generateAuthenticationOptions({
+ rpID,
+ allowCredentials: [
+ { id: attResp.id, transport: attResp.transport },
+ ],
+ extensions: {
+ largeBlob: {
+ write: enc.encode(JSON.stringify(jwk)),
+ },
+ },
+ })
+ const attResp3 = await startAuthentication({
+ optionsJSON: opt2,
+ })
+ if (
+ JSON.stringify(
+ attResp3.clientExtensionResults?.largeBlob?.written,
+ )
+ ) {
+ setJwk(jwk)
+ setWallet(wallet)
+ setAddr(addr)
+ toast({
+ title: "Wallet Created!",
+ status: "success",
+ duration: 5000,
+ isClosable: true,
+ })
+ } else {
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description: err,
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ } else {
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description: "This device is not supported!",
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ }
+ } else {
+ await arweaveWallet.connect([
+ "ACCESS_ADDRESS",
+ "SIGN_TRANSACTION",
+ "ACCESS_PUBLIC_KEY",
+ ])
+ const addr = await arweaveWallet.getActiveAddress()
+ __addr = addr
+ setAddr(addr)
+ setConnecting(false)
+ toast({
+ title: "Wallet Connected!",
+ status: "success",
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ try {
+ if (__addr) {
+ const ao = new AO(opt)
+ const { out } = await ao.dry({
+ pid: process.env.NEXT_PUBLIC_TDB,
+ act: "Balance",
+ tags: { Target: __addr },
+ get: "Balance",
+ })
+ setBalance({ amount: out * 1, addr })
+ const { out: out2 } = await ao.dry({
+ pid: process.env.NEXT_PUBLIC_ADMIN_CONTRACT,
+ act: "Balance",
+ tags: { Target: __addr },
+ get: true,
+ })
+ setDeposit(out2 * 1)
+ }
+ } catch (e) {
+ console.log(e)
+ }
+ } catch (e) {
+ err = e.toString()
+ }
+ if (err) {
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description: err,
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ }
+ setConnecting(false)
+ }
+ }}
+ >
+ {connecting ? (
+
+ ) : addr ? (
+ addr.slice(0, 10)
+ ) : (
+ "Connect Wallet"
+ )}
+
+
+
+ )
+}
diff --git a/demo/components/Masthead.js b/demo/components/Masthead.js
new file mode 100644
index 0000000..18c9d62
--- /dev/null
+++ b/demo/components/Masthead.js
@@ -0,0 +1,165 @@
+import { Image, Flex, Box } from "@chakra-ui/react"
+import { Link } from "arnext"
+
+export default function Header({}) {
+ return (
+
+
+
+
+
+
+ Zero Knowledge Provable
+ NoSQL Database
+
+
+
+
+
+ Hyper Extending Blockchains with zkJSON.
+ Web3 with Web2 UX is Finally Here.
+
+
+
+
+
+ CEO
+
+
+
+
+ Tech
+
+
+
+
+ Github
+
+
+
+
+ X
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/explorer/jsconfig.json b/demo/jsconfig.json
similarity index 100%
rename from explorer/jsconfig.json
rename to demo/jsconfig.json
diff --git a/demo/lib/a11y-dark.js b/demo/lib/a11y-dark.js
new file mode 100644
index 0000000..6eb8922
--- /dev/null
+++ b/demo/lib/a11y-dark.js
@@ -0,0 +1,96 @@
+export default {
+ "hljs-comment": {
+ color: "#d4d0ab",
+ },
+ "hljs-quote": {
+ color: "#d4d0ab",
+ },
+ "hljs-variable": {
+ color: "#ffa07a",
+ },
+ "hljs-template-variable": {
+ color: "#ffa07a",
+ },
+ "hljs-tag": {
+ color: "#ffa07a",
+ },
+ "hljs-name": {
+ color: "#ffa07a",
+ },
+ "hljs-selector-id": {
+ color: "#ffa07a",
+ },
+ "hljs-selector-class": {
+ color: "#ffa07a",
+ },
+ "hljs-regexp": {
+ color: "#ffa07a",
+ },
+ "hljs-deletion": {
+ color: "#ffa07a",
+ },
+ "hljs-number": {
+ color: "#f5ab35",
+ },
+ "hljs-built_in": {
+ color: "#f5ab35",
+ },
+ "hljs-builtin-name": {
+ color: "#f5ab35",
+ },
+ "hljs-literal": {
+ color: "#f5ab35",
+ },
+ "hljs-type": {
+ color: "#f5ab35",
+ },
+ "hljs-params": {
+ color: "#f5ab35",
+ },
+ "hljs-meta": {
+ color: "#f5ab35",
+ },
+ "hljs-link": {
+ color: "#f5ab35",
+ },
+ "hljs-attribute": {
+ color: "#ffd700",
+ },
+ "hljs-string": {
+ color: "#abe338",
+ },
+ "hljs-symbol": {
+ color: "#abe338",
+ },
+ "hljs-bullet": {
+ color: "#abe338",
+ },
+ "hljs-addition": {
+ color: "#abe338",
+ },
+ "hljs-title": {
+ color: "#00e0e0",
+ },
+ "hljs-section": {
+ color: "#00e0e0",
+ },
+ "hljs-keyword": {
+ color: "#dcc6e0",
+ },
+ "hljs-selector-tag": {
+ color: "#dcc6e0",
+ },
+ hljs: {
+ display: "block",
+ overflowX: "auto",
+ background: "#2b2b2b",
+ color: "#f8f8f2",
+ padding: "0.5em",
+ },
+ "hljs-emphasis": {
+ fontStyle: "italic",
+ },
+ "hljs-strong": {
+ fontWeight: "bold",
+ },
+}
diff --git a/demo/lib/utils.js b/demo/lib/utils.js
new file mode 100644
index 0000000..899fc50
--- /dev/null
+++ b/demo/lib/utils.js
@@ -0,0 +1,385 @@
+const abi = [
+ {
+ inputs: [
+ {
+ internalType: "address",
+ name: "_verifierRU",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "_verifierDB",
+ type: "address",
+ },
+ {
+ internalType: "address",
+ name: "_committer",
+ type: "address",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "constructor",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256[]",
+ name: "zkp",
+ type: "uint256[]",
+ },
+ ],
+ name: "commit",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256",
+ name: "_root",
+ type: "uint256",
+ },
+ ],
+ name: "commitRoot",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "nonpayable",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "committer",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256[]",
+ name: "path",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "zkp",
+ type: "uint256[]",
+ },
+ ],
+ name: "qBool",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256[]",
+ name: "path",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "cond",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "zkp",
+ type: "uint256[]",
+ },
+ ],
+ name: "qCond",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256[]",
+ name: "path",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "path2",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "zkp",
+ type: "uint256[]",
+ },
+ ],
+ name: "qCustom",
+ outputs: [
+ {
+ internalType: "int256",
+ name: "",
+ type: "int256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256[]",
+ name: "path",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "zkp",
+ type: "uint256[]",
+ },
+ ],
+ name: "qFloat",
+ outputs: [
+ {
+ internalType: "uint256[3]",
+ name: "",
+ type: "uint256[3]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256[]",
+ name: "path",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "zkp",
+ type: "uint256[]",
+ },
+ ],
+ name: "qInt",
+ outputs: [
+ {
+ internalType: "int256",
+ name: "",
+ type: "int256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256[]",
+ name: "path",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "zkp",
+ type: "uint256[]",
+ },
+ ],
+ name: "qNull",
+ outputs: [
+ {
+ internalType: "bool",
+ name: "",
+ type: "bool",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256[]",
+ name: "path",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "zkp",
+ type: "uint256[]",
+ },
+ ],
+ name: "qRaw",
+ outputs: [
+ {
+ internalType: "uint256[]",
+ name: "",
+ type: "uint256[]",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "txid",
+ type: "string",
+ },
+ {
+ internalType: "uint256[]",
+ name: "path",
+ type: "uint256[]",
+ },
+ {
+ internalType: "uint256[]",
+ name: "zkp",
+ type: "uint256[]",
+ },
+ ],
+ name: "qString",
+ outputs: [
+ {
+ internalType: "string",
+ name: "",
+ type: "string",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [
+ {
+ internalType: "string",
+ name: "",
+ type: "string",
+ },
+ ],
+ name: "roots",
+ outputs: [
+ {
+ internalType: "uint256",
+ name: "",
+ type: "uint256",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "verifierDB",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+ {
+ inputs: [],
+ name: "verifierRU",
+ outputs: [
+ {
+ internalType: "address",
+ name: "",
+ type: "address",
+ },
+ ],
+ stateMutability: "view",
+ type: "function",
+ },
+]
+
+const opt =
+ process.env.NEXT_PUBLIC_NODE === "localhost"
+ ? {
+ ar: { port: 4000 },
+ aoconnect: {
+ MU_URL: "http://localhost:4002",
+ CU_URL: "http://localhost:4004",
+ GATEWAY_URL: "http://localhost:4000",
+ },
+ }
+ : {}
+
+module.exports = { abi, opt }
diff --git a/demo/next.config.js b/demo/next.config.js
new file mode 100644
index 0000000..58cce1d
--- /dev/null
+++ b/demo/next.config.js
@@ -0,0 +1,17 @@
+const arnext = require("arnext/config")
+const nextConfig = {
+ reactStrictMode: true,
+ webpack5: true,
+ webpack: config => {
+ config.resolve.fallback = {
+ fs: false,
+ tls: false,
+ net: false,
+ http2: false,
+ dns: false,
+ }
+
+ return config
+ },
+}
+module.exports = arnext(nextConfig)
diff --git a/demo/package.json b/demo/package.json
new file mode 100644
index 0000000..be3145e
--- /dev/null
+++ b/demo/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "arnext-app",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "dev": "next dev",
+ "build": "next build",
+ "start": "next start",
+ "lint": "next lint",
+ "arweave": "npm run build:arweave && npx serve -s out",
+ "deploy": "node node_modules/arnext-arkb deploy out",
+ "deploy:turbo": "turbo upload-folder --folder-path out",
+ "build:arweave": "cross-env NEXT_PUBLIC_DEPLOY_TARGET='arweave' next build && node arweave.mjs",
+ "test": "mocha"
+ },
+ "dependencies": {
+ "@chakra-ui/icons": "2.2.4",
+ "@chakra-ui/next-js": "2.4.1",
+ "@chakra-ui/react": "2.10.1",
+ "@emotion/react": "11.13.3",
+ "@emotion/styled": "11.13.0",
+ "@simplewebauthn/browser": "^11.0.0",
+ "@simplewebauthn/server": "^11.0.0",
+ "aonote": "^0.10.1",
+ "arnext": "^0.1.4",
+ "arweave": "^1.15.5",
+ "ethers": "^6.13.4",
+ "framer-motion": "^11.11.1",
+ "html5-qrcode": "^2.3.8",
+ "localforage": "^1.10.0",
+ "next": "14.2.13",
+ "node-forge": "^1.3.1",
+ "ramda": "^0.30.1",
+ "react": "^18",
+ "react-dom": "^18",
+ "react-qr-code": "^2.0.15",
+ "react-syntax-highlighter": "^15.6.1",
+ "usehooks-ts": "^3.1.0",
+ "wao": "^0.7.0",
+ "weavedb-client": "^0.45.2",
+ "weavedb-node-client": "^0.45.2",
+ "zkjson": "^0.3.2"
+ },
+ "devDependencies": {
+ "@ardrive/turbo-sdk": "^1.19.0",
+ "arnext-arkb": "^0.0.1",
+ "cheerio": "^1.0.0",
+ "cross-env": "^7.0.3",
+ "eslint": "8.57.1",
+ "eslint-config-next": "14.2.13",
+ "express": "^4.21.0",
+ "http-proxy-middleware": "^3.0.2",
+ "starknet": "^6.11.0"
+ }
+}
diff --git a/demo/pages/404.js b/demo/pages/404.js
new file mode 100644
index 0000000..5fd4e79
--- /dev/null
+++ b/demo/pages/404.js
@@ -0,0 +1,9 @@
+import { Link } from "arnext"
+
+export default function Home() {
+ return (
+ <>
+ 404 | back
+ >
+ )
+}
diff --git a/demo/pages/_app.js b/demo/pages/_app.js
new file mode 100644
index 0000000..390f69e
--- /dev/null
+++ b/demo/pages/_app.js
@@ -0,0 +1,9 @@
+import { ArNext } from "arnext"
+import { ChakraProvider } from "@chakra-ui/react"
+export default function App(props) {
+ return (
+
+
+
+ )
+}
diff --git a/demo/pages/_document.js b/demo/pages/_document.js
new file mode 100644
index 0000000..9744d79
--- /dev/null
+++ b/demo/pages/_document.js
@@ -0,0 +1,22 @@
+import { Html, Main, NextScript } from "next/document"
+import { Head } from "arnext"
+
+export default function Document() {
+ return (
+
+
+ WeaveDB | Zero Knowledge Provable DB
+
+
+
+
+
+
+
+
+ )
+}
diff --git a/demo/pages/api/commitRoot.js b/demo/pages/api/commitRoot.js
new file mode 100644
index 0000000..82482f4
--- /dev/null
+++ b/demo/pages/api/commitRoot.js
@@ -0,0 +1,34 @@
+const { abi } = require("@/lib/utils")
+const { Wallet, getDefaultProvider, Contract } = require("ethers")
+const provider = getDefaultProvider("sepolia", {
+ alchemy: process.env.NEXT_PUBLIC_ALCHEMY_KEY,
+})
+import DB from "weavedb-node-client"
+const privateKey = process.env.PRIVATE_KEY
+const wallet = new Wallet(privateKey, provider)
+
+export default async function handler(req, res) {
+ const { key, contractTxId } = JSON.parse(req.body)
+ let success = false
+ const db2 = new DB({ rpc: process.env.NEXT_PUBLIC_RPC_NODE, contractTxId })
+ const hash = (await db2.node({ op: "hash", key })).hash
+ let updated = false
+ if (hash) {
+ const contract = new Contract(process.env.NEXT_PUBLIC_CONTRACT, abi, wallet)
+ const hash2 = await contract.roots(contractTxId)
+ console.log(hash2)
+ try {
+ if (BigInt(hash) === hash2) {
+ success = true
+ } else {
+ const tx = await contract.commitRoot(contractTxId, hash)
+ const res = await tx.wait()
+ if (res.status === 1) {
+ success = true
+ updated = true
+ }
+ }
+ } catch (e) {}
+ }
+ res.status(200).json({ updated, success, hash, contractTxId })
+}
diff --git a/demo/pages/index.js b/demo/pages/index.js
new file mode 100644
index 0000000..5850f5b
--- /dev/null
+++ b/demo/pages/index.js
@@ -0,0 +1,4727 @@
+import { AO } from "wao"
+import { Link, ssr } from "arnext"
+import { useInterval } from "usehooks-ts"
+import QRCode from "react-qr-code"
+import { Html5QrcodeScanner } from "html5-qrcode"
+import SyntaxHighlighter from "react-syntax-highlighter"
+import a11yDark from "../lib/a11y-dark"
+const { toIndex, path, encodeQuery } = require("zkjson")
+import { useEffect, useState } from "react"
+import DB from "weavedb-client"
+import { opt, abi } from "@/lib/utils"
+const network =
+ process.env.NEXT_PUBLIC_NODE === "localhost"
+ ? { host: "localhost", port: 4000, protocol: "http" }
+ : { host: "arweave.net", port: 443, protocol: "https" }
+const { Contract, getDefaultProvider } = require("ethers")
+import About from "@/components/About"
+import Footer from "@/components/Footer"
+import Header from "@/components/Header"
+import Masthead from "@/components/Masthead"
+import {
+ Image,
+ Flex,
+ Box,
+ Input,
+ Textarea,
+ Select,
+ useToast,
+} from "@chakra-ui/react"
+import {
+ without,
+ append,
+ range,
+ map,
+ pluck,
+ indexBy,
+ prop,
+ reverse,
+ isNil,
+ assoc,
+ includes,
+ is,
+ trim,
+ filter,
+} from "ramda"
+const n = (number, deci = 12) =>
+ new Intl.NumberFormat("en-US").format(
+ (Math.floor(number ?? 0) / 10 ** deci).toFixed(0),
+ )
+const wait = ms => new Promise(res => setTimeout(() => res(), ms))
+let gwei = ""
+for (let i = 0; i < 18; i++) gwei += "0"
+const getP = async (pid, jwk) => {
+ let addr
+ if (jwk) {
+ addr = addr
+ } else {
+ await arweaveWallet.connect([
+ "ACCESS_ADDRESS",
+ "SIGN_TRANSACTION",
+ "ACCESS_PUBLIC_KEY",
+ ])
+ addr = await arweaveWallet.getActiveAddress()
+ }
+ const p = (await new AO(opt).init(jwk ?? arweaveWallet)).p(pid)
+ return { addr, p }
+}
+const provider = getDefaultProvider("sepolia", {
+ alchemy: process.env.NEXT_PUBLIC_ALCHEMY_KEY,
+})
+let html5QrcodeScanner = null
+const validAddress = addr => /^[a-zA-Z0-9_-]{43}$/.test(addr)
+const getQ = ({
+ search,
+ selectedCol,
+ limit,
+ order,
+ query,
+ operator,
+ value,
+ sort,
+}) => {
+ if (search === "single") {
+ return [selectedCol, query]
+ } else {
+ let q = [selectedCol]
+
+ if (!includes(operator, ["array-contains", "array-contains-any"]))
+ q.push([sort, order])
+ if (operator !== "") {
+ let val = value
+ if (includes(operator, ["in", "not-in", "array-contains-any"])) {
+ val = map(v => {
+ let v2 = trim(v)
+ if (sort === "age") v2 *= 1
+ if (sort === "married") v2 = v2 === "false" ? false : true
+ return v2
+ })(val.split(","))
+ } else {
+ if (sort === "age") val *= 1
+ }
+ q.push([sort, operator, val])
+ }
+ if (limit !== "") q.push(+limit)
+ return q
+ }
+}
+const commit = async ({
+ _alert,
+ committing,
+ dbname2,
+ setCommitting,
+ dbs,
+ rpc,
+}) => {
+ let updated = false
+ if (!committing[dbname2]) {
+ setCommitting(assoc(dbname2, true, committing))
+ try {
+ const contractTxId = indexBy(prop("id"), dbs)[dbname2].data.contractTxId
+ const db = new DB({ rpc, contractTxId })
+ const res = await fetch("/api/commitRoot", {
+ method: "POST",
+ body: JSON.stringify({
+ rpc,
+ contractTxId,
+ key: dbname2,
+ }),
+ }).then(r => r.json())
+ if (res.success) {
+ if (_alert) alert("hash committed!")
+ updated = res.updated
+ } else {
+ if (_alert) alert("something went wrong!")
+ }
+ } catch (e) {
+ if (_alert) alert("something went wrong!")
+ }
+ setCommitting(assoc(dbname2, false, committing))
+ }
+ return updated
+}
+const codeDeploy = ({ dbname, owner }) => {
+ return `const owner = "${owner}"
+await db.admin({ op: "add_db", key: "${dbname}", db: { owner }})
+await db.admin({ op: "deploy_contract", key: "${dbname}" })
+`
+}
+
+const codeDeploy2 = ({ colName }) => {
+ return `const rules = [["write", [["allow()"]]]]
+await db.setRules(rules, "${colName}")
+const schema = {
+ type: "object",
+ required: ["name", "age", "married", "favorites"],
+ properties: {
+ name: { type: "string" },
+ age: { type: "number" },
+ married: { type: "boolean" },
+ favorites: { type: "array", items: { type: "string" } }
+ },
+}
+await db.setSchema(schema, "${colName}" })
+`
+}
+
+const codeDeploy3 = ({ col, age, name, married, favorites }) => {
+ return `const profile = {
+ name: "${name}",
+ age: ${age},
+ married: ${married},
+ favorites: [${map(v => `"${v}"`)(favorites).join(", ")}]
+}
+await db.set(profile, "${col}", "${name}")`
+}
+
+const codeDeploy4 = ({
+ selectedCol,
+ limit,
+ order,
+ query,
+ search,
+ operator,
+ value,
+ sort,
+}) => {
+ const q = getQ({
+ order,
+ query,
+ search,
+ selectedCol,
+ limit,
+ operator,
+ value,
+ sort,
+ })
+ return `await db.get(${JSON.stringify(q).replace(/^\[/, "").replace(/\]$/, "").replace(/,/g, ", ")})
+`
+}
+
+const codeDeploy5 = ({ db, col, doc, tar }) => {
+ return `const zkp = await db.node({
+ op: "zkp",
+ key: "${db}",
+ collection: "${col}",
+ doc: "${doc}",
+ path: "${tar}",
+})
+`
+}
+
+const codeDeploy6 = ({ txid, path, zkp, fn }) => {
+ return `await contract.${fn}(
+ "${txid}",
+ ${path},
+ ${zkp},
+)
+`
+}
+
+export default function Home({ _date = null }) {
+ const [as, setAS] = useState("Validator")
+ const [delegatee, setDelegatee] = useState(null)
+ const [to, setTo] = useState("")
+ const [sendAmount, setSendAmount] = useState("0")
+ const [token, setToken] = useState(process.env.NEXT_PUBLIC_TDB)
+ const [walletTab, setWalletTab] = useState("Tokens")
+ const [jwk, setJwk] = useState(null)
+ const [depositing, setDepositing] = useState(false)
+ const [adding, setAdding] = useState(false)
+ const [withdrawing, setWithdrawing] = useState(false)
+ const [staking, setStaking] = useState(false)
+ const [sending, setSending] = useState(false)
+ const toast = useToast()
+ const [isDashboard, setIsDashboard] = useState(false)
+ const [isWallet, setIsWallet] = useState(false)
+ const [isSend, setIsSend] = useState(false)
+ const [isScan, setIsScan] = useState(false)
+ const [isReceive, setIsReceive] = useState(false)
+ const [op, setOp] = useState("Deposit")
+ const [amount, setAmount] = useState("100")
+ const [grpc, setGRPC] = useState("https://")
+ const [where, setWhere] = useState("")
+ const [qtype, setQType] = useState("disclosure")
+ const [operator, setOperator] = useState("")
+ const [value, setValue] = useState("")
+ const [limit, setLimit] = useState("")
+ const [sort, setSort] = useState("name")
+ const [order, setOrder] = useState("asc")
+ const [search, setSearch] = useState("single")
+ const [showCode, setShowCode] = useState(false)
+ const [showCode2, setShowCode2] = useState(false)
+ const [showCode3, setShowCode3] = useState(false)
+ const [showCode4, setShowCode4] = useState(false)
+ const [showCode5, setShowCode5] = useState(false)
+ const [showCode6, setShowCode6] = useState(false)
+ const [profiles, setProfiles] = useState([])
+ const [favs, setFavs] = useState([])
+ const [tab, setTab] = useState("about")
+ const [hash, setHash] = useState(null)
+ const [committing, setCommitting] = useState({})
+ const [generating, setGenerating] = useState(false)
+ const [querying, setQuerying] = useState(false)
+ const [which, setWhich] = useState("WeaveDB Rollup")
+ const [zkp, setZKP] = useState(null)
+ const [name, setName] = useState("")
+ const [dbname, setDBName] = useState("")
+ const [dbname2, setDBName2] = useState("")
+ const [query, setQuery] = useState("")
+ const [tar, setTar] = useState("name")
+ const [age, setAge] = useState(5)
+ const [married, setMarried] = useState("true")
+ const [latency, setLatency] = useState(null)
+ const [latency2, setLatency2] = useState(null)
+ const [latency3, setLatency3] = useState(null)
+ const [latency4, setLatency4] = useState(null)
+ const [latency5, setLatency5] = useState(null)
+ const [latency6, setLatency6] = useState(null)
+ const [loading, setLoading] = useState(false)
+ const [deploying, setDeploying] = useState(false)
+ const [data, setData] = useState(null)
+ const [data2, setData2] = useState(null)
+ const [selectedData, setSelectedData] = useState(null)
+ const [dbs, setDBs] = useState([])
+ const [cols, setCols] = useState([])
+ const [colName, setColName] = useState("")
+ const [qvalue, setQValue] = useState("")
+ const [selectedCol, setSelectedCol] = useState(null)
+ const [addr, setAddr] = useState(null)
+ const [balance, setBalance] = useState(null)
+ const [balanceETH, setBalanceETH] = useState(null)
+ const [isStake, setIsStake] = useState(null)
+ const [deposit, setDeposit] = useState(0)
+ const [nodeDeposit, setNodeDeposit] = useState("1")
+ const [stats, setStats] = useState(null)
+ const [myStats, setMyStats] = useState(null)
+ const [count, setCount] = useState(0)
+ const [nodes, setNodes] = useState([])
+ const [node, setNode] = useState(null)
+ const [stakeStats, setStakeStats] = useState(null)
+ const [allDBs, setAllDBs] = useState({})
+ const [stakeAmount, setStakeAmount] = useState(1)
+ const _path = isNil(zkp)
+ ? null
+ : [Number(zkp.col_id).toString(), toIndex(zkp.data.name), ...path(zkp.tar)]
+
+ const tabs = [
+ { key: "about", name: "About" },
+ { key: "create", name: "Create DB" },
+ { key: "query", name: "Query" },
+ { key: "zkjson", name: "zkJSON" },
+ { key: "usecases", name: "Use Cases" },
+ ]
+ useEffect(() => {
+ ;(async () => {
+ const p = new AO(opt).p(process.env.NEXT_PUBLIC_STAKING)
+ setStakeStats(await p.d("Info"))
+ setAllDBs(await p.d("Get-DBs"))
+ const _nodes = await p.d("Get-Nodes")
+ let __nodes = []
+ let n = null
+ for (const k in _nodes) {
+ const _n = { id: k, info: _nodes[k] }
+ if (!n) n = _n
+ __nodes.push(_n)
+ }
+ setNode(n)
+ setNodes(__nodes)
+ })()
+ }, [])
+ useEffect(() => {
+ ;(async () => {
+ if (node) {
+ try {
+ const db = new DB({
+ rpc: node.info.url,
+ contractTxId: dbname,
+ arweave: network,
+ })
+ const stats = await db.node({ op: "stats" })
+ setStats(stats)
+ const _dbs = filter(
+ v => !isNil(v.data.admin) && !isNil(v.data.contractTxId),
+ )(stats.dbs)
+ console.log(_dbs)
+ setDBs(_dbs)
+ if (_dbs[0]) {
+ setDBName2(_dbs[0].id ?? null)
+ const db2 = new DB({
+ rpc: node.info.url,
+ contractTxId: _dbs[0].id,
+ arweave: network,
+ })
+ const _cols = await db2.listCollections()
+ setSelectedCol(_cols[0] ?? null)
+ setCols(_cols)
+ if (!isNil(_cols[0])) setProfiles(await db2.get(_cols[0]))
+ }
+ } catch (e) {
+ console.log(e)
+ }
+ }
+ })()
+ }, [node])
+ useInterval(async () => {
+ if (addr) {
+ const ao = new AO(opt)
+ const { err, out } = await ao.dry({
+ pid: process.env.NEXT_PUBLIC_TDB,
+ act: "Balance",
+ tags: { Target: addr },
+ get: "Balance",
+ })
+ if (balance && balance.addr === addr && balance.amount < out * 1) {
+ toast({
+ title: `Received ${Math.floor((out * 1 - balance.amount) / 10 ** 12)} tDB Token!`,
+ status: "success",
+ duration: 3000,
+ isClosable: true,
+ })
+ }
+ if (out) setBalance({ addr, amount: out * 1 })
+ const { err: err2, out: out2 } = await ao.dry({
+ pid: process.env.NEXT_PUBLIC_ETH,
+ act: "Balance",
+ tags: { Target: addr },
+ get: "Balance",
+ })
+ if (
+ balanceETH &&
+ balanceETH.addr === addr &&
+ balanceETH.amount < out2 * 1
+ ) {
+ toast({
+ title: `Received ${Math.floor((out2 * 1 - balanceETH.amount) / 10 ** 18)} taoETH Token!`,
+ status: "success",
+ duration: 3000,
+ isClosable: true,
+ })
+ }
+ if (out2) setBalanceETH({ addr, amount: out2 * 1 })
+ }
+ }, 5000)
+ useInterval(async () => {
+ if (addr) {
+ const ao = new AO(opt)
+ const { out: out3 } = await ao.dry({
+ pid: process.env.NEXT_PUBLIC_STAKING,
+ act: "Get-Stats",
+ tags: { Address: addr, TS: Date.now() },
+ get: true,
+ })
+ if (out3) setMyStats(out3)
+ }
+ }, 10000)
+
+ const _token =
+ token === process.env.NEXT_PUBLIC_TDB
+ ? { tick: "tDB", balance, decimal: 12 }
+ : { tick: "taoETH", balance: balanceETH, decimal: 18 }
+
+ const processId = isNil(zkp)
+ ? ""
+ : (indexBy(prop("id"), dbs)[zkp.db]?.data?.contractTxId ?? "")
+ const deploy_ok = !/^\s*$/.test(dbname) && deposit * 1 >= 100 * 10 ** 12
+ let add_node_ok =
+ nodeDeposit * 1 >= 1 &&
+ balanceETH &&
+ balanceETH.amount * 1 >= nodeDeposit * 10 ** 18 &&
+ /^http(s){0,1}:\/\/.+$/.test(grpc)
+ let staking_ok =
+ stakeAmount * 1 >= 1 &&
+ balanceETH &&
+ balanceETH.amount * 1 >= stakeAmount * 10 ** 18 &&
+ (as !== "Delegator" || delegatee)
+ let deposit_ok =
+ amount * 1 > 0 && balance && balance.amount * 1 >= amount * 10 ** 12
+ if (op === "Withdraw") {
+ deposit_ok = amount * 1 > 0 && deposit * 1 >= amount * 10 ** 12
+ }
+ const add_ok = !/^\s*$/.test(colName)
+ const save_ok = !/^\s*$/.test(name)
+ const query_ok = search === "multi" || !/^\s*$/.test(query)
+ const zkp_ok =
+ !isNil(selectedData) && (qtype === "disclosure" || !/^\s*$/.test(qvalue))
+ const eth_ok = !committing[zkp?.db]
+ const to_ok = validAddress(to)
+ const send_amount_ok =
+ sendAmount * 1 > 0 &&
+ _token.balance &&
+ _token.balance.amount * 1 >= sendAmount * 10 ** _token.decimal
+ const send_ok = to_ok && send_amount_ok
+ const ops = includes(tar, ["name", "age", "married"])
+ ? [
+ {
+ val: "disclosure",
+ name: "Disclosure",
+ },
+ { val: "gt", name: "$gt" },
+ { val: "gte", name: "$gte" },
+ { val: "lt", name: "$lt" },
+ { val: "lte", name: "$lte" },
+ { val: "eq", name: "$eq" },
+ { val: "ne", name: "$ne" },
+ { val: "in", name: "$in" },
+ ]
+ : [
+ { val: "contains", name: "$contains" },
+ {
+ val: "contains_any",
+ name: "$contains_any",
+ },
+ {
+ val: "contains_all",
+ name: "$contains_all",
+ },
+ {
+ val: "contains_none",
+ name: "$contains_none",
+ },
+ ]
+ const dbmap = indexBy(prop("id"))(dbs ?? [])
+ const pool = (stakeStats?.Rewards?.pool ?? 0) * 1
+ const day = pool / 10 ** 12 / 365
+ const mystake = (myStats?.stake ?? 0) * 1
+ const allstake = (stakeStats?.TotalStake ?? 0) * 1
+ const dayYield = Math.floor((day * mystake) / allstake)
+ const withdrawable =
+ (myStats?.["yield"] ?? 0) * 1 + (myStats?.["reward"] ?? 0) * 1
+ const alltime_yield =
+ (myStats?.["yield"] ?? 0) * 1 + (myStats?.["withdraw"] ?? 0) * 1
+ const alltime_reward =
+ (myStats?.["reward"] ?? 0) * 1 + (myStats?.["reward_withdraw"] ?? 0) * 1
+ const adbs = []
+ for (let k in allDBs) {
+ adbs.push({ id: k, info: allDBs[k] })
+ }
+ const _validators = allDBs?.[isStake]?.stakes
+
+ let validators = []
+ if (_validators) {
+ for (let k in _validators ?? {}) {
+ const _delegators = allDBs?.[isStake]?.delegates?.[k]
+ let obj = {
+ addr: k,
+ amount: _validators[k] * 1,
+ delegated: 0,
+ delegates: [],
+ }
+ for (let k2 in _delegators ?? {}) {
+ obj.delegated += _delegators[k2]
+ obj.delegates.push(k2)
+ }
+ validators.push(obj)
+ }
+ }
+ return (
+ <>
+
+ {isDashboard ? (
+
+
+
+
+
+
+ Your tDB
+
+
+
+ {n(balance?.amount)}
+
+
+ = {((balance?.amount ?? 0) / 10 ** 13).toFixed(0)} USD
+
+
+
+
+
+
+ :
+ tDB ( Testnet Database ) Token
+
+
+ Address :{" "}
+
+
+ {process.env.NEXT_PUBLIC_TDB}
+
+
+
+
+ Total Supply : 10,000,000,000
+
+
+ Reward Pool : {n(stakeStats?.Rewards?.pool)} tDB / year
+
+
+ Total Deposit : {n(stakeStats?.TotalDeposit, 18)} tDB
+
+
+ Total Stakes : {n(stakeStats?.TotalStake, 18)} taoETH
+
+
+
+
+
+
+
+
+ Staking Amount
+
+
+
+ {n(myStats?.stake, 18)}
+
+
+ Yield : {n(dayYield, 0)} tDB / day
+
+
+
+
+ Staking Yields
+
+
+
+ {n(myStats?.["yield"])}
+
+
+ All Time : {n(alltime_yield)}
+
+
+
+
+ Validator Rewards
+
+
+
+ {n(myStats?.reward)}
+
+
+ All Time : {n(alltime_reward)}
+
+
+
+
+ Total Earnings
+
+
+
+ {n(withdrawable)}
+
+ 0 ? "#5137C5" : "#999"}
+ color="white"
+ py={1}
+ sx={{
+ borderRadius: "3px",
+ cursor: withdrawable > 0 ? "pointer" : "default",
+ ":hover": { opacity: 0.75 },
+ }}
+ onClick={async () => {
+ if (!withdrawing && withdrawable > 0) {
+ setWithdrawing(true)
+ const { addr, p } = await getP(
+ process.env.NEXT_PUBLIC_STAKING,
+ jwk,
+ )
+ try {
+ await p.m("Withdraw-DB", null, {
+ check: /withdrew/,
+ jwk,
+ })
+ toast({
+ title: `Reward withdrawn!`,
+ status: "success",
+ duration: 3000,
+ isClosable: true,
+ })
+ } catch (e) {}
+ setWithdrawing(false)
+ }
+ }}
+ >
+ {withdrawing ? (
+
+ ) : (
+ Withdraw
+ )}
+
+
+
+
+ {map(_v => {
+ const v = _v.info
+ const node = nodes[v.node]
+ let mystake = 0
+ if (!is(Array, v.stakes)) {
+ for (let k in v.stakes) {
+ if (k === addr) mystake += v.stakes[k] * 1
+ }
+ }
+ if (!is(Array, v.delegates)) {
+ for (let k in v.delegates) {
+ for (let k2 in v.delegates[k]) {
+ if (k === addr) mystake += v.delegates[k][k2] * 1
+ }
+ }
+ }
+ return (
+
+
+
+ {_v.id.slice(0, 7)}
+
+
+ {(node?.info.url ?? "").replace(
+ /^http(s){0,1}:\/\//,
+ "",
+ )}
+
+
+
+
+ {n(v.price)}
+
+ tDB
+
+
+
+ Price / Tx
+
+
+
+
+ {v.txs}
+
+ txs
+
+
+
+ Writes
+
+
+
+
+ {n(v.deposit)}
+
+ tDB
+
+
+
+ Deposit
+
+
+
+
+ {n(v.profit)}
+
+ tDB
+
+
+
+ Total Profit
+
+
+
+
+ {n(v.stake, 18)}
+
+ taoETH
+
+
+
+ Total Stake
+
+
+
+
+ {n(mystake, 18)}
+
+ taoETH
+
+
+
+ Your Stake
+
+
+
+ setIsStake(_v.id)}
+ >
+ Stake
+
+
+
+ )
+ })(adbs)}
+
+
+
+
+ ) : isWallet ? (
+
+
+
+ {isReceive ? (
+ <>
+
+
+ {
+ setIsReceive(false)
+ }}
+ sx={{
+ borderRadius: "50%",
+ cursor: "pointer",
+ ":hover": { opacity: 0.75, bg: "#eee" },
+ }}
+ >
+
+
+
+
+ Receive
+
+
+
+
+
+
+ {addr}
+
+
+ >
+ ) : isSend ? (
+ <>
+ {isScan ? (
+
+
+ {
+ setIsScan(false)
+ try {
+ html5QrcodeScanner.clear()
+ } catch (e) {}
+ }}
+ sx={{
+ borderRadius: "50%",
+ cursor: "pointer",
+ ":hover": { opacity: 0.75, bg: "#eee" },
+ }}
+ >
+
+
+
+
+ Scan
+
+
+
+ ) : (
+
+
+ setIsSend(false)}
+ sx={{
+ borderRadius: "50%",
+ cursor: "pointer",
+ ":hover": { opacity: 0.75, bg: "#eee" },
+ }}
+ >
+
+
+
+
+ Send
+
+
+
+ )}
+
+ {isScan ? null : (
+
+
+ From
+
+
+
+ To
+
+ {
+ setIsScan(true)
+ function onScanSuccess(decodedText, decodedResult) {
+ if (!validAddress(decodedText)) {
+ toast({
+ title: `Not a Valid Arweave Address!`,
+ status: "error",
+ duration: 3000,
+ isClosable: true,
+ })
+ } else {
+ setTo(decodedText)
+ html5QrcodeScanner.clear()
+ setIsScan(false)
+ toast({
+ title: `Wallet Address Detected!`,
+ status: "success",
+ duration: 3000,
+ isClosable: true,
+ })
+ }
+ }
+ html5QrcodeScanner = new Html5QrcodeScanner(
+ "reader",
+ { fps: 10, qrbox: { width: 250, height: 250 } },
+ false,
+ )
+ html5QrcodeScanner.render(onScanSuccess)
+ }}
+ >
+ Scan
+
+
+ setTo(e.target.value)}
+ color={to_ok ? "#222" : "crimson"}
+ sx={{
+ border: to_ok
+ ? "#E2E8F0 1px solid"
+ : "crimson 1px solid",
+ }}
+ />
+
+
+ Balance:{" "}
+ {Math.floor(
+ (_token.balance ? _token.balance.amount : 0) /
+ 10 ** _token.decimal,
+ )}{" "}
+ {_token.tick}
+
+
+
+ setSendAmount(
+ Math.floor(
+ (_token.balance ? _token.balance.amount : 0) /
+ 10 ** _token.decimal,
+ ),
+ )
+ }
+ >
+ Max
+
+
+ {
+ if (
+ !Number.isNaN(+e.target.value) &&
+ Math.round(e.target.value * 1) === +e.target.value
+ ) {
+ setSendAmount(e.target.value)
+ }
+ }}
+ />
+ {
+ if (send_ok && !sending) {
+ let err
+ try {
+ setSending(true)
+ let _addr
+ if (jwk) {
+ _addr = addr
+ } else {
+ await arweaveWallet.connect([
+ "ACCESS_ADDRESS",
+ "SIGN_TRANSACTION",
+ "ACCESS_PUBLIC_KEY",
+ ])
+ _addr = await arweaveWallet.getActiveAddress()
+ }
+
+ const ao = await new AO(opt).init(
+ jwk ?? arweaveWallet,
+ )
+ let winston = ""
+ for (let i = 0; i < _token.decimal; i++) {
+ winston += "0"
+ }
+ const { err: _err, res } = await ao.msg({
+ pid: token,
+ act: "Transfer",
+ tags: {
+ Recipient: to,
+ Quantity: `${sendAmount}${winston}`,
+ },
+ })
+ if (_err) {
+ err = _err.toString()
+ } else {
+ toast({
+ title: `${sendAmount} ${_token.tick} Token Sent!`,
+ status: "success",
+ duration: 5000,
+ isClosable: true,
+ })
+ setSendAmount("0")
+ setIsSend(false)
+ try {
+ const { out } = await ao.dry({
+ pid: token,
+ act: "Balance",
+ tags: { Target: _addr },
+ get: "Balance",
+ })
+ if (_token.tick === "tDB") {
+ setBalance({ amount: out * 1, addr: _addr })
+ } else {
+ setBalanceETH({
+ amount: out * 1,
+ addr: _addr,
+ })
+ }
+ } catch (e) {}
+ }
+ } catch (e) {
+ err = e.toString()
+ }
+ setSending(false)
+ if (err) {
+ toast({
+ title: `Something Went Wrong!`,
+ status: "error",
+ description: err,
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ }
+ }}
+ >
+ {sending ? (
+
+ ) : (
+ "Send"
+ )}
+
+
+ )}
+ >
+ ) : (
+ <>
+
+ {
+ navigator.clipboard.writeText(addr)
+ toast({
+ title: `Copied!`,
+ status: "success",
+ duration: 3000,
+ isClosable: true,
+ })
+ }}
+ >
+ {addr}
+
+
+
+
+
+ {Math.floor(
+ (_token.balance ? _token.balance.amount : 0) /
+ 10 ** _token.decimal,
+ )}{" "}
+ {_token.tick}
+
+
+
+
+ setIsSend(true)}
+ bg="#5137C5"
+ color="white"
+ w="40px"
+ height="40px"
+ justify="center"
+ align="center"
+ sx={{
+ borderRadius: "50%",
+ cursor: "pointer",
+ ":hover": { opacity: 0.75 },
+ }}
+ >
+
+
+
+ Send
+
+
+
+ setIsReceive(true)}
+ bg="#5137C5"
+ color="white"
+ w="40px"
+ height="40px"
+ justify="center"
+ align="center"
+ sx={{
+ borderRadius: "50%",
+ cursor: "pointer",
+ ":hover": { opacity: 0.75 },
+ }}
+ >
+
+
+
+ Receive
+
+
+ {!jwk ? null : (
+
+ {
+ const jsonString = JSON.stringify(jwk, null, 2)
+ const blob = new Blob([jsonString], {
+ type: "application/json",
+ })
+ const url = URL.createObjectURL(blob)
+ const a = document.createElement("a")
+ a.href = url
+ a.download = `arweave-keyfile-${addr}.json`
+ a.click()
+ URL.revokeObjectURL(url)
+ }}
+ >
+
+
+
+ Keyfile
+
+
+ )}
+
+
+ {
+ if (confirm("Disconnect your wallet?")) {
+ setIsWallet(false)
+ setIsDashboard(false)
+ setAddr(null)
+ setJwk(null)
+ }
+ }}
+ >
+
+
+
+ Log out
+
+
+
+
+ {map(v => {
+ return (
+ setWalletTab(v)}
+ >
+ {v}
+
+ )
+ })(["Tokens", "Activity"])}
+
+ {walletTab === "Tokens" ? (
+ <>
+ {map(v => {
+ return (
+ setToken(v.addr)}
+ p={4}
+ bg={token === v.addr ? "#f7f7f7" : ""}
+ sx={{
+ borderBottom: "1px solid #ddd",
+ cursor: "pointer",
+ ":hover": { opacity: 0.75 },
+ }}
+ >
+
+
+ {v.tick}
+
+
+ {Math.floor(
+ (v.balance ? v.balance.amount : 0) /
+ 10 ** v.decimal,
+ )}{" "}
+ {v.tick}
+
+ )
+ })([
+ {
+ tick: "tDB",
+ logo: "/logo.svg",
+ balance,
+ decimal: 12,
+ addr: process.env.NEXT_PUBLIC_TDB,
+ },
+ {
+ tick: "taoETH",
+ logo: "/eth.png",
+ balance: balanceETH,
+ decimal: 18,
+ addr: process.env.NEXT_PUBLIC_ETH,
+ },
+ ])}
+ >
+ ) : (
+
+ No Activity Yet
+
+ )}
+ >
+ )}
+
+
+
+ ) : (
+ <>
+
+
+
+ {map(v => {
+ return (
+ {
+ if (v.soon) return alert("Coming Soon!")
+ setTab(v.key)
+ }}
+ >
+ {v.name}
+
+ )
+ })(tabs)}
+
+
+
+ {tab === "about" ? (
+
+ ) : tab === "create" ? (
+
+
+
+
+
+ Node Info
+
+
+
+
+
+
+ Select Node
+
+
+
+
+
+
+
+ gRPC
+
+
+ {node?.info.url}
+
+
+
+
+ Bundler
+
+
+
+ {node?.info.admin}
+
+
+
+
+
+ Subledger
+
+
+
+ {process.env.NEXT_PUBLIC_ADMIN_CONTRACT}
+
+
+
+
+
+ Security
+
+
+ {Math.floor(
+ (node?.info.deposit ?? 0) / 1000000000000000000,
+ )}{" "}
+ taoETH
+
+
+
+
+
+
+ DB Name
+
+
+ AO TxId
+
+
+ DB Admin
+
+
+ {map(v => {
+ return (
+
+
+
+
+ {v.id}
+
+
+
+
+
+
+ {v.data.contractTxId.slice(0, 20)}...
+
+
+
+
+ {!v.data.admin ? null : (
+
+
+ {v.data.admin.slice(0, 20)}...
+
+
+ )}
+
+
+ )
+ })(reverse(dbs))}
+
+
+
+
+
+ Deposit tDB
+
+
+
+ Balance:
+
+ {(balance ? balance.amount : 0) / 1000000000000} tDB
+
+
+
+ Deposit:
+ {deposit / 1000000000000} tDB
+
+
+ {!addr ? (
+
+ Connect wallet.
+
+ ) : (
+
+
+
+ Operation
+
+
+
+ Amount (tDB)
+ {
+ if (
+ !Number.isNaN(+e.target.value) &&
+ Math.round(e.target.value * 1) ===
+ +e.target.value
+ ) {
+ setAmount(e.target.value)
+ }
+ }}
+ />
+
+
+
+ {
+ if (!depositing && deposit_ok) {
+ setDepositing(true)
+ try {
+ let _addr
+ if (jwk) {
+ _addr = addr
+ } else {
+ await arweaveWallet.connect([
+ "ACCESS_ADDRESS",
+ "SIGN_TRANSACTION",
+ "ACCESS_PUBLIC_KEY",
+ ])
+ _addr =
+ await arweaveWallet.getActiveAddress()
+ }
+ const ao = await new AO(opt).init(
+ jwk ?? arweaveWallet,
+ )
+ const winston = "000000000000"
+ if (op === "Deposit") {
+ const { err, res } = await ao.msg({
+ pid: process.env.NEXT_PUBLIC_TDB,
+ act: "Transfer",
+ tags: {
+ Recipient:
+ process.env
+ .NEXT_PUBLIC_ADMIN_CONTRACT,
+ Quantity: `${amount}${winston}`,
+ },
+ })
+ } else {
+ const { err, res } = await ao.msg({
+ pid: process.env
+ .NEXT_PUBLIC_ADMIN_CONTRACT,
+ act: "Withdraw",
+ tags: {
+ Quantity: `${amount}${winston}`,
+ },
+ })
+ }
+ await wait(3000)
+ const { out } = await ao.dry({
+ pid: process.env.NEXT_PUBLIC_TDB,
+ act: "Balance",
+ tags: { Target: _addr },
+ get: "Balance",
+ })
+ setBalance({ amount: out * 1, addr: _addr })
+
+ const { out: out2 } = await ao.dry({
+ pid: process.env
+ .NEXT_PUBLIC_ADMIN_CONTRACT,
+ act: "Balance",
+ tags: { Target: _addr },
+ get: true,
+ })
+ setDeposit(out2 * 1)
+ setAddr(_addr)
+ } catch (e) {
+ console.log(e)
+ }
+ setDepositing(false)
+ }
+ }}
+ >
+ {depositing ? (
+
+ ) : (
+ op
+ )}
+
+
+
+
+ )}
+
+
+ Create DB
+
+
+
+ Deposit:
+ {deposit / 1000000000000} tDB
+
+
+ Cost:
+ 100 tDB
+
+
+ {!addr ? (
+
+ Connect wallet.
+
+ ) : (
+
+
+
+ New DB Name
+ setDBName(e.target.value)}
+ />
+
+
+ {
+ if (!deploying && deploy_ok) {
+ await arweaveWallet.connect([
+ "ACCESS_ADDRESS",
+ "SIGN_TRANSACTION",
+ "ACCESS_PUBLIC_KEY",
+ ])
+ const addr =
+ await arweaveWallet.getActiveAddress()
+ const ao = new AO(opt)
+ const { out: out2 } = await ao.dry({
+ pid: process.env.NEXT_PUBLIC_TDB,
+ act: "Balances",
+ get: { data: true, json: true },
+ })
+ const { out } = await ao.dry({
+ pid: process.env.NEXT_PUBLIC_ADMIN_CONTRACT,
+ act: "Balances",
+ get: { data: true, json: true },
+ })
+ const deposit = out?.[addr] ?? 0
+ if (deposit < 100000000000000) {
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description:
+ "Your tDB token deposit is not enough.",
+ duration: 5000,
+ isClosable: true,
+ })
+ return
+ }
+ setDeploying(true)
+ const db = new DB({
+ rpc: node.info.url,
+ contractTxId: dbname,
+ arweave: network,
+ })
+ try {
+ const start = Date.now()
+ const tx = await db.admin(
+ {
+ op: "add_db",
+ key: dbname,
+ db: {
+ rollup: true,
+ owner: addr,
+ },
+ },
+ { ar2: jwk ?? arweaveWallet },
+ )
+ const { contractTxId, srcTxId } =
+ await db.admin(
+ {
+ op: "deploy_contract",
+ key: dbname,
+ type: "ao",
+ },
+ { ar2: jwk ?? arweaveWallet },
+ )
+ const duration = Date.now() - start
+ setLatency4({
+ dbname,
+ txid: contractTxId,
+ duration,
+ })
+ const stats = await db.node({ op: "stats" })
+ setStats(stats)
+ const _dbs = filter(
+ v =>
+ !isNil(v.data.admin) &&
+ !isNil(v.data.contractTxId),
+ )(stats.dbs)
+ setDBs(_dbs)
+ setDBName("")
+ toast({
+ title: `DB Deployed in ${duration} ms!`,
+ description: contractTxId,
+ status: "success",
+ duration: 5000,
+ isClosable: true,
+ })
+ const p = new AO(opt).p(
+ process.env.NEXT_PUBLIC_STAKING,
+ )
+ setStakeStats(await p.d("Info"))
+ setAllDBs(await p.d("Get-DBs"))
+ if (dbname2 === "") setDBName2(dbname)
+ } catch (e) {
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description: e.toString(),
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ setDeploying(false)
+ }
+ }}
+ >
+ {deploying ? (
+
+ ) : (
+ "Create"
+ )}
+
+
+
+ setShowCode(!showCode)}
+ >
+ {showCode ? "Hide JS Code" : "Show JS Code"}
+
+
+ {!showCode ? null : (
+
+
+ {codeDeploy({ dbname, owner: addr ?? "" })}
+
+
+ )}
+
+ )}
+
+ {latency4 ? (
+ <>
+
+
+
+ WeaveDB
+
+
+
+
+
+ AO
+
+
+
+
+
+ Ethereum
+
+
+
+
+ DB deployed in{" "}
+
+ {latency4.duration} ms
+
+
+
+ >
+ ) : null}
+
+
+ Add Node
+
+
+
+ Balance:
+
+ {(balanceETH ? balanceETH.amount : 0) /
+ 1000000000000000000}{" "}
+ taoETH
+
+
+
+ Min Stake:
+ 1 taoETH
+
+
+
+
+
+ Node gRPC URL
+ setGRPC(e.target.value)}
+ />
+
+
+ Stake (taoETH)
+ {
+ if (
+ !Number.isNaN(+e.target.value) &&
+ Math.round(e.target.value * 1) ===
+ +e.target.value
+ ) {
+ setNodeDeposit(e.target.value)
+ }
+ }}
+ />
+
+
+ {
+ if (!adding && add_node_ok) {
+ let err
+ try {
+ setAdding(true)
+ const { addr, p } = await getP(
+ process.env.NEXT_PUBLIC_ETH,
+ jwk,
+ )
+ const { err: _err, res } = await p.msg(
+ "Transfer",
+ {
+ Recipient:
+ process.env.NEXT_PUBLIC_STAKING,
+ Quantity: `${nodeDeposit}${gwei}`,
+ "X-Action": "Add-Node",
+ "X-URL": grpc,
+ },
+ { check: /transferred/ },
+ )
+ if (_err) {
+ err = _err.toString()
+ } else {
+ toast({
+ title: `Node Added!`,
+ status: "success",
+ description: grpc,
+ duration: 5000,
+ isClosable: true,
+ })
+ setGRPC("https://")
+ try {
+ const out = await p.d(
+ "Balance",
+ { Target: addr },
+ { get: "Balance" },
+ )
+ setBalanceETH({ amount: out * 1, addr })
+ const { p: p2 } = await getP(
+ process.env.NEXT_PUBLIC_STAKING,
+ jwk,
+ )
+ await wait(3000)
+ const _nodes = await p2.d("Get-Nodes")
+ let __nodes = []
+ let n = null
+ for (const k in _nodes) {
+ const _n = { id: k, info: _nodes[k] }
+ if (!n) n = _n
+ __nodes.push(_n)
+ }
+ if (!node) setNode(n)
+ setNodes(__nodes)
+ } catch (e) {
+ console.log(e)
+ }
+ }
+ } catch (e) {
+ err = e.toString()
+ }
+ setAdding(false)
+ if (err) {
+ toast({
+ title: `Something Went Wrong!`,
+ status: "error",
+ description: err,
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ }
+ }}
+ >
+ {adding ? (
+
+ ) : (
+ Add
+ )}
+
+
+
+
+
+
+
+ ) : tab === "query" || tab === "zkjson" ? (
+
+
+
+
+
+ Database
+
+
+
+
+
+
+ Choose DB
+
+
+
+ Collections
+
+
+
+
+
+
+
+
+ DB Name
+
+
+
+ {dbname2}
+
+
+
+
+
+ AO Process
+
+
+
+ {dbmap[dbname2]?.data?.contractTxId}
+
+
+
+
+
+ Owner
+
+
+
+ {dbmap[dbname2]?.data?.admin}
+
+
+
+
+
+ Collections
+
+
+ [ {cols.length} ] {cols.join(", ")}
+
+
+
+
+
+ {dbname2}{" "}
+
+ {!selectedCol ? (
+ -
+ ) : (
+
+ {selectedCol} [ {profiles.length} items ]
+
+ )}
+
+
+
+
+
+ name
+
+
+ age
+
+
+ married
+
+
+ favorites
+
+
+ {map(v => {
+ return (
+ setSelectedData(v)}
+ >
+
+ {v.name}
+
+
+ {v.age}
+
+
+ {v.married ? "true" : "false"}
+
+
+ {(v.favorites ?? []).join(", ")}
+
+
+ )
+ })(profiles)}
+
+
+
+ {tab === "query" ? (
+ <>
+
+
+ Add Collection
+
+
+ {!addr ? (
+
+ Connect wallet.
+
+ ) : (
+
+
+
+ New Collection Name
+ setColName(e.target.value)}
+ />
+
+
+ Data Schema
+
+
+
+ {
+ if (add_ok) {
+ let err = null
+ let txid = null
+ let txid2 = null
+ try {
+ const contractTxId = indexBy(
+ prop("id"),
+ dbs,
+ )[dbname2].data.contractTxId
+ const db = new DB({
+ rpc: node.info.url,
+ contractTxId,
+ arweave: network,
+ })
+ const start = Date.now()
+ const rules = [["write", [["allow()"]]]]
+ const tx2 = await db.setRules(
+ rules,
+ colName,
+ {
+ ar2: jwk ?? arweaveWallet,
+ },
+ )
+ console.log(tx2)
+ if (!tx2.success) {
+ err = "error"
+ } else {
+ txid = tx2.originalTxId
+ const schema = {
+ type: "object",
+ required: [
+ "name",
+ "age",
+ "married",
+ ],
+ properties: {
+ name: { type: "string" },
+ age: { type: "number" },
+ married: { type: "boolean" },
+ favorites: {
+ type: "array",
+ items: { type: "string" },
+ },
+ },
+ }
+ const tx3 = await db.setSchema(
+ schema,
+ colName,
+ { ar2: jwk ?? arweaveWallet },
+ )
+ if (tx3.success) {
+ txid2 = tx3.originalTxId
+ setCols(await db.listCollections())
+ setLatency5({
+ dbname: dbname2,
+ duration: Date.now() - start,
+ txid,
+ txid2,
+ })
+ setSelectedCol(colName)
+ setProfiles([])
+ } else {
+ err = tx3.error.toString()
+ }
+ }
+ } catch (e) {
+ console.log(e)
+ err = "error"
+ }
+ if (err) {
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description: err,
+ duration: 5000,
+ isClosable: true,
+ })
+ } else {
+ toast({
+ title: "Collection Added!",
+ status: "success",
+ description: `${colName}`,
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ }
+ }}
+ >
+ Add
+
+
+
+ setShowCode2(!showCode2)}
+ >
+ {showCode2 ? "Hide JS Code" : "Show JS Code"}
+
+
+ {!showCode2 ? null : (
+
+
+ {codeDeploy2({ colName })}
+
+
+ )}
+
+ )}
+
+ {latency5 ? (
+ <>
+
+
+ Rules
+
+
+
+
+ Schema
+
+
+
+
+ Collection added in{" "}
+
+ {latency5.duration} ms
+
+
+ >
+ ) : null}
+
+
+
+ Store Data on WeaveDB
+
+
+ {!addr ? (
+
+ Connect wallet.
+
+ ) : (
+
+
+
+
+
+ Name
+ setName(e.target.value)}
+ />
+
+
+ Age
+
+
+
+ Married
+
+
+
+
+ Favorites
+
+ {map(v => {
+ return (
+ {
+ if (includes(v, favs)) {
+ setFavs(without([v], favs))
+ } else {
+ setFavs(append(v, favs))
+ }
+ }}
+ >
+
+ {v}
+
+ )
+ })([
+ "apple",
+ "orange",
+ "grape",
+ "peach",
+ "lemon",
+ ])}
+
+
+
+
+ setShowCode3(!showCode3)}
+ >
+ {showCode3 ? "Hide JS Code" : "Show JS Code"}
+
+
+ {!showCode3 ? null : (
+
+
+ {codeDeploy3({
+ name,
+ age,
+ married,
+ favorites: favs,
+ col: selectedCol,
+ })}
+
+
+ )}
+ {
+ if (save_ok) {
+ let err = null
+ try {
+ const contractTxId = indexBy(
+ prop("id"),
+ dbs,
+ )[dbname2].data.contractTxId
+ const db = new DB({
+ rpc: node.info.url,
+ contractTxId,
+ })
+ const ppl = {
+ name,
+ age: +age,
+ married:
+ married === "true" ? true : false,
+ favorites: favs,
+ }
+ const start = Date.now()
+ const tx3 = await db.set(
+ ppl,
+ selectedCol,
+ name,
+ {
+ ar2: jwk ?? arweaveWallet,
+ },
+ )
+ if (tx3.success) {
+ setLatency({
+ dbname: dbname2,
+ duration: Date.now() - start,
+ txid: tx3.originalTxId,
+ })
+ setProfiles(await db.get(selectedCol))
+ let updated = true
+ /*
+ setTimeout(async () => {
+ do {
+ updated = await commit({
+ rpc: node.info.url,
+ committing,
+ dbname2,
+ dbs,
+ setCommitting,
+ _alert: false,
+ })
+ } while (updated)
+ }, 5000)*/
+ toast({
+ title: "Doc Added!",
+ status: "success",
+ description: `${name}`,
+ duration: 5000,
+ isClosable: true,
+ })
+ setSelectedData(ppl)
+ } else {
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description: "error",
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ } catch (e) {
+ err = e.toString()
+ }
+ if (err) {
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description: err,
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ }
+ }}
+ >
+ Save
+
+
+ )}
+
+ {latency ? (
+ <>
+
+
+ Doc
+
+
+
+
+ Doc stored in{" "}
+
+ {latency.duration} ms
+
+
+ >
+ ) : null}
+
+
+
+ Query Data
+
+
+
+
+
+ {search === "single" ? (
+
+ Doc ID
+ setQuery(e.target.value)}
+ />
+
+ ) : (
+
+
+
+ Sort
+
+
+
+ Order
+
+
+
+ Limit
+ {
+ if (
+ !Number.isNaN(+e.target.value) &&
+ Math.round(e.target.value * 1) ===
+ +e.target.value
+ ) {
+ setLimit(e.target.value)
+ }
+ }}
+ />
+
+
+
+
+
+ Where
+
+
+
+
+
+ Operator
+
+
+
+
+
+ Value
+ {includes(operator, [
+ "in",
+ "not-in",
+ "array-contains-any",
+ ])
+ ? " (csv)"
+ : ""}
+
+ {
+ setValue(e.target.value)
+ }}
+ />
+
+
+
+ )}
+
+ setShowCode4(!showCode4)}
+ >
+ {showCode4 ? "Hide JS Code" : "Show JS Code"}
+
+
+ {!showCode4 ? null : (
+
+
+ {codeDeploy4({
+ selectedCol,
+ limit,
+ order,
+ query,
+ search,
+ operator,
+ value,
+ sort,
+ })}
+
+
+ )}
+
+ {
+ if (query_ok) {
+ setLoading(true)
+ setData(null)
+ const contractTxId = indexBy(prop("id"), dbs)[
+ dbname2
+ ].data.contractTxId
+ const db = new DB({
+ rpc: node.info.url,
+ contractTxId,
+ })
+ const start = Date.now()
+
+ const q = getQ({
+ order,
+ query,
+ search,
+ selectedCol,
+ limit,
+ operator,
+ value,
+ sort,
+ })
+ const tx3 = await db.get(...q)
+ setData(tx3)
+ if (search === "single") setSelectedData(tx3)
+ setLatency2({
+ txid: contractTxId,
+ duration: Date.now() - start,
+ })
+ setWhich("WeaveDB Rollup")
+ setLoading(false)
+ }
+ }}
+ >
+ Query Rollup
+
+ {
+ if (query_ok) {
+ setLoading(true)
+ setData(null)
+ const contractTxId = indexBy(prop("id"), dbs)[
+ dbname2
+ ].data.contractTxId
+ const ao = new AO(opt)
+ const start = Date.now()
+ const q = getQ({
+ order,
+ query,
+ search,
+ selectedCol,
+ limit,
+ operator,
+ value,
+ sort,
+ })
+ const b = (
+ await ao.dry({
+ pid: contractTxId,
+ act: "Get",
+ tags: {
+ Query: JSON.stringify(q),
+ },
+ get: true,
+ })
+ ).out
+
+ setLatency2({
+ txid: contractTxId,
+ duration: Date.now() - start,
+ })
+ setWhich("AO Process")
+ setData(b)
+ if (search === "single") setSelectedData(b)
+ setLoading(false)
+ }
+ }}
+ >
+ Query AO
+
+
+
+ {loading ? (
+ "querying..."
+ ) : !data ? (
+ "data not found..."
+ ) : (
+
+
+
+ name
+
+
+ age
+
+
+ married
+
+
+ favorites
+
+
+ {map(v => {
+ return (
+
+
+ {v.name}
+
+
+ {v.age}
+
+
+ {v.married ? "true" : "false"}
+
+
+ {(v.favorites ?? []).join(", ")}
+
+
+ )
+ })(is(Array, data) ? data : [data])}
+
+ )}
+
+
+
+ {latency2 ? (
+ <>
+
+
+ Queried on {which} in{" "}
+
+ {latency2.duration} ms
+
+
+ >
+ ) : null}
+
+ >
+ ) : (
+ <>
+
+
+ Generate ZKP
+
+
+
+ Deposit:
+ {deposit / 1000000000000} tDB
+
+
+ Cost:
+ 0 tDB
+
+
+ {!addr ? (
+
+ Connect wallet.
+
+ ) : isNil(selectedData) ? (
+
+ Select a doc.
+
+ ) : (
+ <>
+
+
+
+ Field
+
+
+
+ Query Type
+
+
+
+
+ Value
+ {includes(qtype, [
+ "in",
+ "contains_any",
+ "contains_all",
+ "contains_none",
+ ])
+ ? " (csv)"
+ : ""}
+
+ setQValue(e.target.value)}
+ />
+
+
+ {
+ let err = null
+ if (zkp_ok && !generating) {
+ setGenerating(true)
+ const contractTxId = indexBy(
+ prop("id"),
+ dbs,
+ )[dbname2].data.contractTxId
+ const db = new DB({
+ rpc: node.info.url,
+ contractTxId,
+ })
+ const start = Date.now()
+ try {
+ let _zkp = {
+ data: selectedData,
+ col: selectedCol,
+ db: dbname2,
+ txid: contractTxId,
+ tar: tar,
+ qtype,
+ }
+ let params = {
+ op: "zkp",
+ key: dbname2,
+ collection: selectedCol,
+ doc: selectedData.name,
+ path: tar,
+ }
+ if (
+ qtype !== "disclosure" &&
+ !/^\s*$/.test(qvalue)
+ ) {
+ params.query = ["$" + qtype]
+ let qv = null
+ if (
+ includes(qtype, [
+ "in",
+ "contains_any",
+ "contains_all",
+ "contains_none",
+ ])
+ ) {
+ qv = map(v => {
+ let v2 = trim(v)
+ if (tar === "age") {
+ return v2 * 1
+ } else if (tar === "married") {
+ return v2 === "false"
+ ? false
+ : true
+ } else {
+ return v2
+ }
+ })(qvalue.split(","))
+ } else {
+ if (tar === "age") {
+ qv = qvalue * 1
+ } else if (tar === "married") {
+ qv =
+ qvalue === "false" ? false : true
+ } else {
+ qv = qvalue
+ }
+ }
+ params.query.push(qv)
+ _zkp.qvalue = qv
+ }
+
+ _zkp.query = params.query
+ const zkp = await db.node(params)
+ if (!isNil(zkp.zkp)) {
+ setLatency3(Date.now() - start)
+ setZKP({
+ ..._zkp,
+ zkp: zkp.zkp,
+ col_id: zkp.col_id,
+ })
+ setData2(null)
+ toast({
+ title: "ZKP Generated!",
+ status: "success",
+ description: `${params.key} > ${params.collection} > ${params.doc} > ${params.path} (${qtype === "disclosure" ? "Selective Disclosure" : `${qvalue}`})`,
+ duration: 5000,
+ isClosable: true,
+ })
+ } else {
+ console.log(zkp)
+ err = "error"
+ }
+ } catch (e) {
+ console.log(e)
+ err = e.toString()
+ }
+ setGenerating(false)
+ if (err) {
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description: err,
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ }
+ }}
+ >
+ {generating ? (
+
+ ) : (
+ "Generate ZKP"
+ )}
+
+ {!zkp ? null : (
+ <>
+
+ AO Process TxID
+
+ {
+ navigator.clipboard.writeText(processId)
+ }}
+ >
+ Copy
+
+
+
+ {processId}
+
+
+ Data Path
+
+ {
+ navigator.clipboard.writeText(
+ JSON.stringify(_path).replace(
+ /"/g,
+ "",
+ ),
+ )
+ }}
+ >
+ Copy
+
+
+
+ {JSON.stringify(_path).replace(/"/g, "")}
+
+
+ Zero Knowledge Proof
+
+ {
+ navigator.clipboard.writeText(
+ JSON.stringify(zkp.zkp).replace(
+ /"/g,
+ "",
+ ),
+ )
+ }}
+ >
+ Copy
+
+
+
+ {JSON.stringify(zkp.zkp).replace(/"/g, "")}
+
+ >
+ )}
+ setShowCode5(!showCode5)}
+ >
+ {showCode5 ? "Hide JS Code" : "Show JS Code"}
+
+
+ {!showCode5 ? null : (
+
+
+ {codeDeploy5({
+ db: dbname2,
+ col: selectedCol,
+ doc: query,
+ tar,
+ })}
+
+
+ )}
+
+
+ {latency3 ? (
+ <>
+
+ Etherscan ({" "}
+ {!isNil(zkp.qvalue)
+ ? "qCond"
+ : zkp.tar === "name"
+ ? "qString"
+ : zkp.tar === "age"
+ ? "qInt"
+ : "qBool"}{" "}
+ )
+
+
+
+ ZKP generated in{" "}
+
+ {latency3} ms
+
+
+ >
+ ) : null}
+
+ >
+ )}
+
+
+
+ Query from Ethereum with ZKP
+
+
+ {!zkp ? (
+
+ Generate a ZKP.
+
+ ) : (
+ <>
+
+
+
+
+ DB
+
+ {zkp.db}
+
+
+
+ Collection
+
+ {zkp.col}
+
+
+
+ Doc
+
+ {zkp.data.name}
+
+
+
+ Field
+
+ {zkp.tar}
+
+
+
+ Query Type
+
+ {zkp.qtype === "disclosure"
+ ? "Selective Disclosure"
+ : "$" + zkp.qtype}{" "}
+ {isNil(zkp.qvalue) ? null : (
+ <>
+ {is(Array, zkp.qvalue)
+ ? zkp.qvalue.join(", ")
+ : zkp.qvalue}
+ >
+ )}
+
+
+
+
+
+ {data2 ?? ""}
+
+ {
+ if (eth_ok && !querying) {
+ let err = null
+ setQuerying(true)
+ try {
+ const contractTxId = indexBy(
+ prop("id"),
+ dbs,
+ )[zkp.db].data.contractTxId
+ const db = new DB({
+ rpc: node.info.url,
+ contractTxId,
+ })
+ const hash = (
+ await db.node({
+ op: "hash",
+ key: zkp.db,
+ })
+ ).hash
+ const contract = new Contract(
+ process.env.NEXT_PUBLIC_CONTRACT,
+ abi,
+ provider,
+ )
+ const start = Date.now()
+ let res = null
+ if (!isNil(zkp.qvalue)) {
+ const cond = zkp.zkp.slice(13, 18)
+ res = (await contract.qCond(
+ contractTxId,
+ _path,
+ cond,
+ zkp.zkp,
+ ))
+ ? "true"
+ : "false"
+ setData2(res)
+ } else if (zkp.tar === "age") {
+ res = (
+ await contract.qInt(
+ contractTxId,
+ _path,
+ zkp.zkp,
+ )
+ ).toString()
+ setData2(res)
+ } else if (zkp.tar === "married") {
+ res = (await contract.qBool(
+ contractTxId,
+ _path,
+ zkp.zkp,
+ ))
+ ? "true"
+ : "false"
+ setData2(res)
+ } else {
+ res = await contract.qString(
+ contractTxId,
+ _path,
+ zkp.zkp,
+ )
+ setData2(res)
+ }
+ setLatency6(Date.now() - start)
+ toast({
+ title: "Queried from Ethereum!",
+ status: "success",
+ description: res,
+ duration: 5000,
+ isClosable: true,
+ })
+ } catch (e) {
+ console.log(e)
+ err = e.toString()
+ }
+
+ setQuerying(false)
+ if (err) {
+ if (err.match(/mismatch/)) {
+ err = "Root Mismatch"
+ } else if (err.match(/match/)) {
+ err = "Network Error: Try again"
+ } else {
+ err = "Invalid ZKP"
+ }
+ toast({
+ title: "Something Went Wrong!",
+ status: "error",
+ description: err,
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ }
+ }}
+ >
+ {querying ? (
+
+ ) : (
+ "Query from Ethereum"
+ )}
+
+
+
+ setShowCode6(!showCode6)}
+ >
+ {showCode6 ? "Hide JS Code" : "Show JS Code"}
+
+ {!showCode6 ? null : (
+
+
+ {codeDeploy6({
+ txid: zkp.txid,
+ path: `[${map(v => `"${v}"`)(_path)}]`,
+ zkp: "zkp",
+ fn:
+ zkp.tar === "name"
+ ? "qString"
+ : zkp.tar === "age"
+ ? "qInt"
+ : "qBool",
+ })}
+
+
+ )}
+
+
+ <>
+ {committing[zkp?.db] ? (
+
+
+ Committing root...
+
+ ) : (
+ {
+ let updated = true
+ do {
+ updated = await commit({
+ rpc: node.info.url,
+ committing,
+ dbname2: zkp.db,
+ dbs,
+ setCommitting,
+ _alert: updated,
+ })
+ } while (updated)
+ }}
+ >
+ Commit Root
+
+ )}
+
+ {latency6 ? (
+
+ Queried in{" "}
+
+ {latency6} ms
+
+
+ ) : null}
+ >
+
+ >
+ )}
+ >
+ )}
+
+
+
+ ) : (
+
+
+
+ {map(v => {
+ return map(v2 => {
+ return (
+
+ alert("Coming Soon!")}
+ p={4}
+ color="#9C89F6"
+ sx={{
+ cursor: "pointer",
+ ":hover": { opacity: 0.75 },
+ borderRadius: "5px",
+ border: "#9C89F6 1px solid",
+ }}
+ >
+
+
+ {v2.title}
+
+
+
+ )
+ })(v)
+ })([
+ [
+ {
+ title: "Decentralized Social Apps",
+ },
+ {
+ title: "zkOracles",
+ },
+ {
+ title: "Token / Data Bridges",
+ },
+ ],
+ [
+ {
+ title: "zkNFT",
+ },
+ {
+ title: "DeSci",
+ },
+ {
+ title: "Blockchain History",
+ },
+ ],
+ [
+ {
+ title: "Private Databases",
+ },
+ {
+ title: "Decentalized Point Systems",
+ },
+ {
+ title: "AI Autonomous Databases",
+ },
+ ],
+ ])}
+
+
+
+ )}
+
+ {tab === "about" ? (
+ <>
+
+
+
+ Backers
+
+
+ {`Supported Worldwide by Industry's Best`}
+
+
+ {map(v => {
+ return v.name ? (
+
+
+
+ {v.name}
+
+
+ {v.at}
+
+
+
+ ) : (
+
+
+
+
+
+ )
+ })([
+ {
+ img: "permanent-ventures.webp",
+ href: "http://permanent.ventures",
+ },
+ { img: "iosg.png", href: "https://iosg.vc" },
+ { img: "mask.svg", href: "https://mask.io" },
+ {
+ img: "forward-research.png",
+ href: "https://fwd.g8way.io",
+ },
+ {
+ img: "hansa.svg",
+ py: 2,
+ href: "https://www.hansa.capital",
+ },
+ {
+ img: "next-web-capital.webp",
+ height: "80px",
+ href: "https://nextweb.capital",
+ },
+ { img: "cmtd.png", py: 2, href: "https://cmt.digital" },
+ {
+ img: "formless-capital.webp",
+ href: "https://formless.capital",
+ },
+ {
+ name: "Scott Moore",
+ at: "Gitcoin Founder",
+ href: "https://www.gitcoin.co",
+ },
+ {
+ img: "cogitent.png",
+ href: "https://cogitent.ventures",
+ },
+ {
+ name: "YY Lai",
+ at: "Signum Capital",
+ color: "#0082B9",
+ href: "https://signum.capital",
+ },
+ { img: "hub71.svg", py: 2, href: "https://hub71.com" },
+ ])}
+
+
+
+
+
+
+ Ecosystem
+
+
+ {`Who's Building on WeaveDB & zkJSON`}
+
+
+
+ >
+ ) : null}
+ >
+ )}
+ {isWallet ? null : }
+ {!isStake ? null : (
+
+
+
+
+ Stake on {isStake.slice(0, 7)}
+
+
+
+ Balance:
+
+ {(balanceETH ? balanceETH.amount : 0) / 1000000000000000000}{" "}
+ taoETH
+
+
+ setIsStake(null)}
+ />
+
+
+
+
+ As
+
+
+
+ Min: 1 taoETH
+ {
+ if (
+ !Number.isNaN(+e.target.value) &&
+ Math.round(e.target.value * 1) === +e.target.value
+ ) {
+ setStakeAmount(e.target.value)
+ }
+ }}
+ />
+
+
+ {
+ if (!staking && staking_ok) {
+ let err
+ try {
+ setStaking(true)
+ const { addr, p } = await getP(
+ process.env.NEXT_PUBLIC_ETH,
+ jwk,
+ )
+ let tags = {
+ Recipient: process.env.NEXT_PUBLIC_STAKING,
+ Quantity: `${stakeAmount}${gwei}`,
+ "X-DB": isStake,
+ }
+ if (as === "Delegator") {
+ ;(tags["X-Action"] = "Delegate"),
+ (tags["X-Delegate-To"] = delegatee)
+ }
+ const { err: _err, res } = await p.msg(
+ "Transfer",
+ tags,
+ { check: /transferred/ },
+ )
+ if (_err) {
+ err = _err.toString()
+ } else {
+ toast({
+ title: `Staked!`,
+ status: "success",
+ duration: 5000,
+ isClosable: true,
+ })
+ setGRPC("https://")
+ setIsStake(null)
+ try {
+ const out = await p.d(
+ "Balance",
+ { Target: addr },
+ { get: "Balance" },
+ )
+ setBalanceETH({ amount: out * 1, addr })
+ const p2 = new AO(opt).p(
+ process.env.NEXT_PUBLIC_STAKING,
+ )
+ setStakeStats(await p2.d("Info"))
+ setAllDBs(await p2.d("Get-DBs"))
+ } catch (e) {
+ console.log(e)
+ }
+ }
+ } catch (e) {
+ err = e.toString()
+ }
+ setStaking(false)
+ if (err) {
+ toast({
+ title: `Something Went Wrong!`,
+ status: "error",
+ description: err,
+ duration: 5000,
+ isClosable: true,
+ })
+ }
+ }
+ }}
+ >
+ {staking ? (
+
+ ) : (
+ Stake
+ )}
+
+
+
+
+
+
+
+ Validators
+
+
+ {as === "Delegator" ? Choose Delegatee : null}
+
+
+
+
+ Address
+
+
+ Amount
+
+
+ Delegated
+
+
+ {map(v => {
+ return (
+ setDelegatee(v.addr)}
+ sx={{
+ cursor: "pointer",
+ ":hover": { opacity: 0.75 },
+ borderBottom: "1px solid #9C89F6",
+ }}
+ align="center"
+ bg={
+ as === "Delegator" && delegatee === v.addr ? "#eee" : ""
+ }
+ >
+
+
+ {v.addr}
+
+
+
+ {Math.floor(v.amount / 10 ** 18)}
+
+
+ {Math.floor(v.delegated / 10 ** 18)}
+
+
+ )
+ })(validators)}
+
+
+
+
+ )}
+ >
+ )
+}
diff --git a/demo/proxy.mjs b/demo/proxy.mjs
new file mode 100644
index 0000000..ad23758
--- /dev/null
+++ b/demo/proxy.mjs
@@ -0,0 +1,21 @@
+import express from "express"
+import { createProxyMiddleware } from "http-proxy-middleware"
+
+const app = express()
+
+const port = (process.argv[2] ?? "4000") * 1
+const target = process.argv[3] ?? "http://localhost:3000"
+const sub = process.argv[4] ?? "7J-cq6dcJAz0zkzcrRNb-2FTZRuQXIij1P1FiaQxdaE"
+
+app.use(
+ `/${sub}`,
+ createProxyMiddleware({
+ target,
+ changeOrigin: true,
+ pathRewrite: { "^/arweave": "" },
+ }),
+)
+
+app.listen(port, () => {
+ console.log(`Proxy server running at http://localhost:${port}/${sub}`)
+})
diff --git a/demo/public/cmtd.png b/demo/public/cmtd.png
new file mode 100644
index 0000000..aa021af
Binary files /dev/null and b/demo/public/cmtd.png differ
diff --git a/demo/public/cogitent.png b/demo/public/cogitent.png
new file mode 100644
index 0000000..73ff352
Binary files /dev/null and b/demo/public/cogitent.png differ
diff --git a/demo/public/eth.png b/demo/public/eth.png
new file mode 100644
index 0000000..77b3d97
Binary files /dev/null and b/demo/public/eth.png differ
diff --git a/demo/public/favicon.ico b/demo/public/favicon.ico
new file mode 100644
index 0000000..718d6fe
Binary files /dev/null and b/demo/public/favicon.ico differ
diff --git a/demo/public/formless-capital.webp b/demo/public/formless-capital.webp
new file mode 100644
index 0000000..d95fa78
Binary files /dev/null and b/demo/public/formless-capital.webp differ
diff --git a/demo/public/forward-research.png b/demo/public/forward-research.png
new file mode 100644
index 0000000..aceaf51
Binary files /dev/null and b/demo/public/forward-research.png differ
diff --git a/demo/public/hansa.svg b/demo/public/hansa.svg
new file mode 100644
index 0000000..55c0dff
--- /dev/null
+++ b/demo/public/hansa.svg
@@ -0,0 +1,3 @@
+
diff --git a/demo/public/hub71.svg b/demo/public/hub71.svg
new file mode 100644
index 0000000..54c8836
--- /dev/null
+++ b/demo/public/hub71.svg
@@ -0,0 +1,17 @@
+
diff --git a/demo/public/iosg.png b/demo/public/iosg.png
new file mode 100644
index 0000000..36b71cf
Binary files /dev/null and b/demo/public/iosg.png differ
diff --git a/demo/public/logo.svg b/demo/public/logo.svg
new file mode 100644
index 0000000..8115b3e
--- /dev/null
+++ b/demo/public/logo.svg
@@ -0,0 +1,10 @@
+
+
+
\ No newline at end of file
diff --git a/demo/public/mask.svg b/demo/public/mask.svg
new file mode 100644
index 0000000..f4ae96f
--- /dev/null
+++ b/demo/public/mask.svg
@@ -0,0 +1,13 @@
+
+
\ No newline at end of file
diff --git a/demo/public/next-web-capital.webp b/demo/public/next-web-capital.webp
new file mode 100644
index 0000000..1f6e3d2
Binary files /dev/null and b/demo/public/next-web-capital.webp differ
diff --git a/demo/public/permanent-ventures.webp b/demo/public/permanent-ventures.webp
new file mode 100644
index 0000000..d2d822f
Binary files /dev/null and b/demo/public/permanent-ventures.webp differ
diff --git a/demo/public/weave.svg b/demo/public/weave.svg
new file mode 100644
index 0000000..f37b1ff
--- /dev/null
+++ b/demo/public/weave.svg
@@ -0,0 +1,169 @@
+
diff --git a/demo/yarn.lock b/demo/yarn.lock
new file mode 100644
index 0000000..b082252
--- /dev/null
+++ b/demo/yarn.lock
@@ -0,0 +1,9164 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@adraffy/ens-normalize@1.10.1":
+ version "1.10.1"
+ resolved "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz#63430d04bd8c5e74f8d7d049338f1cd9d4f02069"
+ integrity sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==
+
+"@ardrive/turbo-sdk@^1.19.0":
+ version "1.19.0"
+ resolved "https://registry.npmjs.org/@ardrive/turbo-sdk/-/turbo-sdk-1.19.0.tgz#18d3ad6e75208fc1e02ad66f8e40be245b459db5"
+ integrity sha512-KSPTvNcrl6cCeaxzYmZ2XcDDtQhgOBS8UqRggCjjla0OnurX7uvNo+kDJyDhe+d9sRHtCcoKcJz+jkhWY04QSw==
+ dependencies:
+ "@cosmjs/amino" "^0.32.4"
+ "@cosmjs/crypto" "^0.32.4"
+ "@cosmjs/encoding" "^0.32.4"
+ "@cosmjs/proto-signing" "^0.32.4"
+ "@dha-team/arbundles" "^1.0.1"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@kyvejs/sdk" "^1.3.3"
+ "@solana/web3.js" "^1.91.7"
+ arweave "^1.15.1"
+ axios "1.4.0"
+ axios-retry "^3.7.0"
+ bignumber.js "^9.1.2"
+ bs58 "^5.0.0"
+ commander "^12.1.0"
+ ethers "^6.12.0"
+ mime-types "^2.1.35"
+ plimit-lit "^3.0.1"
+ prompts "^2.4.2"
+ tweetnacl "^1.0.3"
+ winston "^3.14.1"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.0.tgz#9374b5cd068d128dac0b94ff482594273b1c2815"
+ integrity sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.9"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
+"@babel/generator@^7.25.9":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.0.tgz#505cc7c90d92513f458a477e5ef0703e7c91b8d7"
+ integrity sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==
+ dependencies:
+ "@babel/parser" "^7.26.0"
+ "@babel/types" "^7.26.0"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^3.0.2"
+
+"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715"
+ integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/helper-module-transforms@^7.25.9":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae"
+ integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
+ "@babel/traverse" "^7.25.9"
+
+"@babel/helper-plugin-utils@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46"
+ integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==
+
+"@babel/helper-simple-access@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739"
+ integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==
+ dependencies:
+ "@babel/traverse" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@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==
+
+"@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/parser@^7.25.9", "@babel/parser@^7.26.0":
+ version "7.26.1"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.1.tgz#44e02499960df2cdce2c456372a3e8e0c3c5c975"
+ integrity sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==
+ dependencies:
+ "@babel/types" "^7.26.0"
+
+"@babel/plugin-transform-modules-commonjs@^7.24.8":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686"
+ integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.25.9"
+ "@babel/helper-plugin-utils" "^7.25.9"
+ "@babel/helper-simple-access" "^7.25.9"
+
+"@babel/runtime@7.20.13":
+ version "7.20.13"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
+ integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
+ dependencies:
+ regenerator-runtime "^0.13.11"
+
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.3.1":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1"
+ integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/runtime@^7.15.4", "@babel/runtime@^7.25.0":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6"
+ integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016"
+ integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==
+ dependencies:
+ "@babel/code-frame" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/types" "^7.25.9"
+
+"@babel/traverse@^7.25.9":
+ version "7.25.9"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84"
+ integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==
+ dependencies:
+ "@babel/code-frame" "^7.25.9"
+ "@babel/generator" "^7.25.9"
+ "@babel/parser" "^7.25.9"
+ "@babel/template" "^7.25.9"
+ "@babel/types" "^7.25.9"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.25.9", "@babel/types@^7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff"
+ integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==
+ dependencies:
+ "@babel/helper-string-parser" "^7.25.9"
+ "@babel/helper-validator-identifier" "^7.25.9"
+
+"@cbor-extract/cbor-extract-darwin-arm64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz#8d65cb861a99622e1b4a268e2d522d2ec6137338"
+ integrity sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==
+
+"@cbor-extract/cbor-extract-darwin-x64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz#9fbec199c888c5ec485a1839f4fad0485ab6c40a"
+ integrity sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==
+
+"@cbor-extract/cbor-extract-linux-arm64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz#bf77e0db4a1d2200a5aa072e02210d5043e953ae"
+ integrity sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==
+
+"@cbor-extract/cbor-extract-linux-arm@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz#491335037eb8533ed8e21b139c59f6df04e39709"
+ integrity sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==
+
+"@cbor-extract/cbor-extract-linux-x64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz#672574485ccd24759bf8fb8eab9dbca517d35b97"
+ integrity sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==
+
+"@cbor-extract/cbor-extract-win32-x64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz#4b3f07af047f984c082de34b116e765cb9af975f"
+ integrity sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==
+
+"@chakra-ui/anatomy@2.3.4":
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/anatomy/-/anatomy-2.3.4.tgz#f671dae1dab5fa05e7184fc44521c58ce30a4182"
+ integrity sha512-fFIYN7L276gw0Q7/ikMMlZxP7mvnjRaWJ7f3Jsf9VtDOi6eAYIBRrhQe6+SZ0PGmoOkRaBc7gSE5oeIbgFFyrw==
+
+"@chakra-ui/hooks@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/hooks/-/hooks-2.4.1.tgz#bf557716f07f8f6674db384d573bcb593a0661aa"
+ integrity sha512-f81S0TiSh14LjiXBAvdezmIQLKGR7pckQ8kLMIxjngNW4VV92dhznOP+VcQmDOyXslfWsaWNFswlASE6clVw1g==
+ dependencies:
+ "@chakra-ui/utils" "2.2.1"
+ "@zag-js/element-size" "0.31.1"
+ copy-to-clipboard "3.3.3"
+ framesync "6.1.2"
+
+"@chakra-ui/icons@2.2.4":
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/icons/-/icons-2.2.4.tgz#fc3f59a7e377d6e4efdbe8ee0a3aec7f29a4ab32"
+ integrity sha512-l5QdBgwrAg3Sc2BRqtNkJpfuLw/pWRDwwT58J6c4PqQT6wzXxyNa8Q0PForu1ltB5qEiFb1kxr/F/HO1EwNa6g==
+
+"@chakra-ui/next-js@2.4.1":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/next-js/-/next-js-2.4.1.tgz#75b5cbd2f09965fc8e5b9247c371db13f63433fc"
+ integrity sha512-Vgrc4qq2LKSJbSdjAUmfiP1AC5MEPnw4mxgCf2e9wpTmD3GQaut3abWs6N02rTib7qiLTRz33B7E3UfP8C1PKA==
+ dependencies:
+ "@emotion/cache" "^11.11.0"
+
+"@chakra-ui/react@2.10.1":
+ version "2.10.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/react/-/react-2.10.1.tgz#e847ffd4ef8c817060b257cd0b1b466a0f152643"
+ integrity sha512-YUOPyuq6Z0P1TSURNQRccwV/YbiWlkHlRLEMqNMwFQeQe7lyXfkPHn8GZyxvaiu+S02iopG9xg+wl68K4G3FSQ==
+ dependencies:
+ "@chakra-ui/hooks" "2.4.1"
+ "@chakra-ui/styled-system" "2.11.1"
+ "@chakra-ui/theme" "3.4.5"
+ "@chakra-ui/utils" "2.2.1"
+ "@popperjs/core" "^2.11.8"
+ "@zag-js/focus-visible" "^0.31.1"
+ aria-hidden "^1.2.3"
+ react-fast-compare "3.2.2"
+ react-focus-lock "^2.9.6"
+ react-lorem-component "^0.13.0"
+ react-remove-scroll "^2.5.7"
+
+"@chakra-ui/styled-system@2.11.1":
+ version "2.11.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/styled-system/-/styled-system-2.11.1.tgz#1ec8dea69b73f3185d860be8ae69c06669d65091"
+ integrity sha512-1O4vQSSJqDYl+xkQLgNLVsBhEUkFd5BKQAIBEZC5ppppvCXAt+BPqrOLFAkNyo7piKYp5mf6fdYBAW/ESurqeg==
+ dependencies:
+ "@chakra-ui/utils" "2.2.1"
+ csstype "^3.1.2"
+
+"@chakra-ui/theme-tools@2.2.5":
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/theme-tools/-/theme-tools-2.2.5.tgz#8ca1429e0d6d7a4de544a5f32ab3dbcd62e60d19"
+ integrity sha512-tUIv04Pzm2W8v5Iugei15qREIFX2mslI3fEouIVih8vHzwY821neCfspxOsAhvYSLNX+1kzk6ArBo9WzUpqn+Q==
+ dependencies:
+ "@chakra-ui/anatomy" "2.3.4"
+ "@chakra-ui/utils" "2.2.1"
+ color2k "^2.0.2"
+
+"@chakra-ui/theme@3.4.5":
+ version "3.4.5"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/theme/-/theme-3.4.5.tgz#5e8d6484d8d61a589205f74ed34a391c304ea62f"
+ integrity sha512-h/00W3xFCrUnsosVdh/SNMKfaez9jo1MMz2ruZAcpg/b1Jk0WnYa/ONhUwN89DR3UrPHSR+/vigZBxaA1+3QUQ==
+ dependencies:
+ "@chakra-ui/anatomy" "2.3.4"
+ "@chakra-ui/theme-tools" "2.2.5"
+ "@chakra-ui/utils" "2.2.1"
+
+"@chakra-ui/utils@2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@chakra-ui/utils/-/utils-2.2.1.tgz#9dc0c3e42791e9f60daa37ff52dea0bd49b447c9"
+ integrity sha512-e9D6CDtQZWBx+rq7yW13mAeI3Vod4cWfUIip+XFNjPWQSJGOJb1MiXocoiJqaZ1S+jsN+mod4uCZmGcukv0iSg==
+ dependencies:
+ "@types/lodash.mergewith" "4.6.9"
+ lodash.mergewith "4.6.2"
+
+"@colors/colors@1.6.0", "@colors/colors@^1.6.0":
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0"
+ integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==
+
+"@confio/ics23@^0.6.8":
+ version "0.6.8"
+ resolved "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.8.tgz#2a6b4f1f2b7b20a35d9a0745bb5a446e72930b3d"
+ integrity sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w==
+ dependencies:
+ "@noble/hashes" "^1.0.0"
+ protobufjs "^6.8.8"
+
+"@cosmjs/amino@^0.32.3", "@cosmjs/amino@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.4.tgz#3908946c0394e6d431694c8992c5147079a1c860"
+ integrity sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==
+ dependencies:
+ "@cosmjs/crypto" "^0.32.4"
+ "@cosmjs/encoding" "^0.32.4"
+ "@cosmjs/math" "^0.32.4"
+ "@cosmjs/utils" "^0.32.4"
+
+"@cosmjs/crypto@^0.32.3", "@cosmjs/crypto@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.4.tgz#5d29633b661eaf092ddb3e7ea6299cfd6f4507a2"
+ integrity sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==
+ dependencies:
+ "@cosmjs/encoding" "^0.32.4"
+ "@cosmjs/math" "^0.32.4"
+ "@cosmjs/utils" "^0.32.4"
+ "@noble/hashes" "^1"
+ bn.js "^5.2.0"
+ elliptic "^6.5.4"
+ libsodium-wrappers-sumo "^0.7.11"
+
+"@cosmjs/encoding@^0.32.3", "@cosmjs/encoding@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.4.tgz#646e0e809f7f4f1414d8fa991fb0ffe6c633aede"
+ integrity sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==
+ dependencies:
+ base64-js "^1.3.0"
+ bech32 "^1.1.4"
+ readonly-date "^1.0.0"
+
+"@cosmjs/json-rpc@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.4.tgz#be91eb89ea78bd5dc02d0a9fa184dd6790790f0b"
+ integrity sha512-/jt4mBl7nYzfJ2J/VJ+r19c92mUKF0Lt0JxM3MXEJl7wlwW5haHAWtzRujHkyYMXOwIR+gBqT2S0vntXVBRyhQ==
+ dependencies:
+ "@cosmjs/stream" "^0.32.4"
+ xstream "^11.14.0"
+
+"@cosmjs/math@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.4.tgz#87ac9eadc06696e30a30bdb562a495974bfd0a1a"
+ integrity sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==
+ dependencies:
+ bn.js "^5.2.0"
+
+"@cosmjs/proto-signing@^0.32.3", "@cosmjs/proto-signing@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.4.tgz#5a06e087c6d677439c8c9b25b5223d5e72c4cd93"
+ integrity sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==
+ dependencies:
+ "@cosmjs/amino" "^0.32.4"
+ "@cosmjs/crypto" "^0.32.4"
+ "@cosmjs/encoding" "^0.32.4"
+ "@cosmjs/math" "^0.32.4"
+ "@cosmjs/utils" "^0.32.4"
+ cosmjs-types "^0.9.0"
+
+"@cosmjs/socket@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.4.tgz#86ab6adf3a442314774c0810b7a7cfcddf4f2082"
+ integrity sha512-davcyYziBhkzfXQTu1l5NrpDYv0K9GekZCC9apBRvL1dvMc9F/ygM7iemHjUA+z8tJkxKxrt/YPjJ6XNHzLrkw==
+ dependencies:
+ "@cosmjs/stream" "^0.32.4"
+ isomorphic-ws "^4.0.1"
+ ws "^7"
+ xstream "^11.14.0"
+
+"@cosmjs/stargate@^0.32.3":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.4.tgz#bd0e4d3bf613b629addbf5f875d3d3b50f640af1"
+ integrity sha512-usj08LxBSsPRq9sbpCeVdyLx2guEcOHfJS9mHGCLCXpdAPEIEQEtWLDpEUc0LEhWOx6+k/ChXTc5NpFkdrtGUQ==
+ dependencies:
+ "@confio/ics23" "^0.6.8"
+ "@cosmjs/amino" "^0.32.4"
+ "@cosmjs/encoding" "^0.32.4"
+ "@cosmjs/math" "^0.32.4"
+ "@cosmjs/proto-signing" "^0.32.4"
+ "@cosmjs/stream" "^0.32.4"
+ "@cosmjs/tendermint-rpc" "^0.32.4"
+ "@cosmjs/utils" "^0.32.4"
+ cosmjs-types "^0.9.0"
+ xstream "^11.14.0"
+
+"@cosmjs/stream@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.4.tgz#83e1f2285807467c56d9ea0e1113f79d9fa63802"
+ integrity sha512-Gih++NYHEiP+oyD4jNEUxU9antoC0pFSg+33Hpp0JlHwH0wXhtD3OOKnzSfDB7OIoEbrzLJUpEjOgpCp5Z+W3A==
+ dependencies:
+ xstream "^11.14.0"
+
+"@cosmjs/tendermint-rpc@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.4.tgz#b36f9ec657498e42c97e21bb7368798ef6279752"
+ integrity sha512-MWvUUno+4bCb/LmlMIErLypXxy7ckUuzEmpufYYYd9wgbdCXaTaO08SZzyFM5PI8UJ/0S2AmUrgWhldlbxO8mw==
+ dependencies:
+ "@cosmjs/crypto" "^0.32.4"
+ "@cosmjs/encoding" "^0.32.4"
+ "@cosmjs/json-rpc" "^0.32.4"
+ "@cosmjs/math" "^0.32.4"
+ "@cosmjs/socket" "^0.32.4"
+ "@cosmjs/stream" "^0.32.4"
+ "@cosmjs/utils" "^0.32.4"
+ axios "^1.6.0"
+ readonly-date "^1.0.0"
+ xstream "^11.14.0"
+
+"@cosmjs/utils@^0.32.4":
+ version "0.32.4"
+ resolved "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.4.tgz#a9a717c9fd7b1984d9cefdd0ef6c6f254060c671"
+ integrity sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==
+
+"@cosmostation/extension-client@^0.1.15":
+ version "0.1.15"
+ resolved "https://registry.npmjs.org/@cosmostation/extension-client/-/extension-client-0.1.15.tgz#cdc6d8fce42217704c1c0d5814f0ee7ce27e8dab"
+ integrity sha512-HlXYJjFrNpjiV/GUKhri1UL8/bhlOIFFLpRF78YDSqq16x0+plIqx5CAvEusFcKTDpVfpeD5sfUHiKvP7euNFg==
+
+"@dabh/diagnostics@^2.0.2":
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz#7f7e97ee9a725dffc7808d93668cc984e1dc477a"
+ integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==
+ dependencies:
+ colorspace "1.1.x"
+ enabled "2.0.x"
+ kuler "^2.0.0"
+
+"@dha-team/arbundles@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@dha-team/arbundles/-/arbundles-1.0.1.tgz#5e81039b74da241cf0e2b074ae77e489eec7887d"
+ integrity sha512-cgVxhZJLK1HG2+vcRBZ0CYGpxz7mA2QvLaspcw2gOzb2V/ZUxlifUu1aufBK3iz63Ww2OhgO0j9DstRJqrG1uA==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/providers" "^5.7.2"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wallet" "^5.7.0"
+ "@noble/ed25519" "^1.6.1"
+ arweave "^1.15.1"
+ base64url "^3.0.1"
+ bs58 "^4.0.1"
+ keccak "^3.0.2"
+ secp256k1 "^5.0.0"
+ optionalDependencies:
+ "@randlabs/myalgo-connect" "^1.1.2"
+ algosdk "^1.13.1"
+ arweave-stream-tx "^1.1.0"
+ multistream "^4.1.0"
+ tmp-promise "^3.0.2"
+
+"@emotion/babel-plugin@^11.12.0":
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz#7b43debb250c313101b3f885eba634f1d723fcc2"
+ integrity sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/runtime" "^7.18.3"
+ "@emotion/hash" "^0.9.2"
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/serialize" "^1.2.0"
+ babel-plugin-macros "^3.1.0"
+ convert-source-map "^1.5.0"
+ escape-string-regexp "^4.0.0"
+ find-root "^1.1.0"
+ source-map "^0.5.7"
+ stylis "4.2.0"
+
+"@emotion/cache@^11.11.0", "@emotion/cache@^11.13.0":
+ version "11.13.1"
+ resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.13.1.tgz#fecfc54d51810beebf05bf2a161271a1a91895d7"
+ integrity sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==
+ dependencies:
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/sheet" "^1.4.0"
+ "@emotion/utils" "^1.4.0"
+ "@emotion/weak-memoize" "^0.4.0"
+ stylis "4.2.0"
+
+"@emotion/hash@^0.9.2":
+ version "0.9.2"
+ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b"
+ integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==
+
+"@emotion/is-prop-valid@^1.3.0":
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz#8d5cf1132f836d7adbe42cf0b49df7816fc88240"
+ integrity sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==
+ dependencies:
+ "@emotion/memoize" "^0.9.0"
+
+"@emotion/memoize@^0.9.0":
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102"
+ integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==
+
+"@emotion/react@11.13.3":
+ version "11.13.3"
+ resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.13.3.tgz#a69d0de2a23f5b48e0acf210416638010e4bd2e4"
+ integrity sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.12.0"
+ "@emotion/cache" "^11.13.0"
+ "@emotion/serialize" "^1.3.1"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.1.0"
+ "@emotion/utils" "^1.4.0"
+ "@emotion/weak-memoize" "^0.4.0"
+ hoist-non-react-statics "^3.3.1"
+
+"@emotion/serialize@^1.2.0", "@emotion/serialize@^1.3.0", "@emotion/serialize@^1.3.1":
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.2.tgz#e1c1a2e90708d5d85d81ccaee2dfeb3cc0cccf7a"
+ integrity sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==
+ dependencies:
+ "@emotion/hash" "^0.9.2"
+ "@emotion/memoize" "^0.9.0"
+ "@emotion/unitless" "^0.10.0"
+ "@emotion/utils" "^1.4.1"
+ csstype "^3.0.2"
+
+"@emotion/sheet@^1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c"
+ integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==
+
+"@emotion/styled@11.13.0":
+ version "11.13.0"
+ resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.13.0.tgz#633fd700db701472c7a5dbef54d6f9834e9fb190"
+ integrity sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==
+ dependencies:
+ "@babel/runtime" "^7.18.3"
+ "@emotion/babel-plugin" "^11.12.0"
+ "@emotion/is-prop-valid" "^1.3.0"
+ "@emotion/serialize" "^1.3.0"
+ "@emotion/use-insertion-effect-with-fallbacks" "^1.1.0"
+ "@emotion/utils" "^1.4.0"
+
+"@emotion/unitless@^0.10.0":
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745"
+ integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==
+
+"@emotion/use-insertion-effect-with-fallbacks@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz#1a818a0b2c481efba0cf34e5ab1e0cb2dcb9dfaf"
+ integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==
+
+"@emotion/utils@^1.4.0", "@emotion/utils@^1.4.1":
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.1.tgz#b3adbb43de12ee2149541c4f1337d2eb7774f0ad"
+ integrity sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==
+
+"@emotion/weak-memoize@^0.4.0":
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6"
+ integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+ version "4.4.0"
+ resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+ integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+ dependencies:
+ eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1":
+ version "4.11.1"
+ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f"
+ integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==
+
+"@eslint/eslintrc@^2.1.4":
+ version "2.1.4"
+ resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
+ integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.6.0"
+ globals "^13.19.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"
+
+"@eslint/js@8.57.1":
+ version "8.57.1"
+ resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2"
+ integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
+
+"@ethereumjs/common@^2.6.4":
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30"
+ integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.1.5"
+
+"@ethereumjs/tx@3.5.2":
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c"
+ integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==
+ dependencies:
+ "@ethereumjs/common" "^2.6.4"
+ ethereumjs-util "^7.1.5"
+
+"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449"
+ integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef"
+ integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+
+"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2"
+ integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/address@5.7.0", "@ethersproject/address@^5.6.0", "@ethersproject/address@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37"
+ integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+
+"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c"
+ integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+
+"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b"
+ integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2"
+ integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ bn.js "^5.2.1"
+
+"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d"
+ integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e"
+ integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+
+"@ethersproject/contracts@5.7.0", "@ethersproject/contracts@^5.2.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e"
+ integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+
+"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.4.0", "@ethersproject/hash@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7"
+ integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf"
+ integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360"
+ integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a"
+ integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ js-sha3 "0.8.0"
+
+"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892"
+ integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==
+
+"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6"
+ integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102"
+ integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+
+"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30"
+ integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.2.0", "@ethersproject/providers@^5.7.2":
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb"
+ integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c"
+ integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304"
+ integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb"
+ integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3"
+ integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ bn.js "^5.2.1"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8"
+ integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2"
+ integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b"
+ integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+
+"@ethersproject/units@5.7.0", "@ethersproject/units@^5.4.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1"
+ integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.2.0", "@ethersproject/wallet@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d"
+ integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/json-wallets" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae"
+ integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==
+ dependencies:
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5"
+ integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@fastify/busboy@^2.0.0":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d"
+ integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==
+
+"@grpc/grpc-js@^1.1.0":
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.2.tgz#97eda82dd49bb9c24eaf6434ea8d7de446e95aac"
+ integrity sha512-bgxdZmgTrJZX50OjyVwz3+mNEnCTNkh3cIqGPWVNeW9jX6bn1ZkU80uPd+67/ZpIJIjRQ9qaHCjhavyoWYxumg==
+ dependencies:
+ "@grpc/proto-loader" "^0.7.13"
+ "@js-sdsl/ordered-map" "^4.4.2"
+
+"@grpc/proto-loader@^0.5.0":
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.6.tgz#1dea4b8a6412b05e2d58514d507137b63a52a98d"
+ integrity sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==
+ dependencies:
+ lodash.camelcase "^4.3.0"
+ protobufjs "^6.8.6"
+
+"@grpc/proto-loader@^0.7.13":
+ version "0.7.13"
+ resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf"
+ integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==
+ dependencies:
+ lodash.camelcase "^4.3.0"
+ long "^5.0.0"
+ protobufjs "^7.2.5"
+ yargs "^17.7.2"
+
+"@hexagon/base64@^1.1.25", "@hexagon/base64@^1.1.27":
+ version "1.1.28"
+ resolved "https://registry.yarnpkg.com/@hexagon/base64/-/base64-1.1.28.tgz#7d306a97f1423829be5b27c9d388fe50e3099d48"
+ integrity sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==
+
+"@humanwhocodes/config-array@^0.13.0":
+ version "0.13.0"
+ resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"
+ integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==
+ dependencies:
+ "@humanwhocodes/object-schema" "^2.0.3"
+ debug "^4.3.1"
+ minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^2.0.3":
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
+ integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
+
+"@iden3/bigarray@0.0.2":
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9"
+ integrity sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==
+
+"@iden3/binfileutils@0.0.12":
+ version "0.0.12"
+ resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.12.tgz#3772552f57551814ff606fa68ea1e0ef52795ce3"
+ integrity sha512-naAmzuDufRIcoNfQ1d99d7hGHufLA3wZSibtr4dMe6ZeiOPV1KwOZWTJ1YVz4HbaWlpDuzVU72dS4ATQS4PXBQ==
+ dependencies:
+ fastfile "0.0.20"
+ ffjavascript "^0.3.0"
+
+"@irys/arweave@^0.0.2":
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/@irys/arweave/-/arweave-0.0.2.tgz#c0e73eb8c15e323342d33ea92701d4036fd22ae3"
+ integrity sha512-ddE5h4qXbl0xfGlxrtBIwzflaxZUDlDs43TuT0u1OMfyobHul4AA1VEX72Rpzw2bOh4vzoytSqA1jCM7x9YtHg==
+ dependencies:
+ asn1.js "^5.4.1"
+ async-retry "^1.3.3"
+ axios "^1.4.0"
+ base64-js "^1.5.1"
+ bignumber.js "^9.1.1"
+
+"@isaacs/cliui@^8.0.2":
+ version "8.0.2"
+ resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+ integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ 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"
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@js-sdsl/ordered-map@^4.4.2":
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c"
+ integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==
+
+"@json-rpc-tools/provider@^1.5.5":
+ version "1.7.6"
+ resolved "https://registry.yarnpkg.com/@json-rpc-tools/provider/-/provider-1.7.6.tgz#8a17c34c493fa892632e278fd9331104e8491ec6"
+ integrity sha512-z7D3xvJ33UfCGv77n40lbzOYjZKVM3k2+5cV7xS8G6SCvKTzMkhkUYuD/qzQUNT4cG/lv0e9mRToweEEVLVVmA==
+ dependencies:
+ "@json-rpc-tools/utils" "^1.7.6"
+ axios "^0.21.0"
+ safe-json-utils "^1.1.1"
+ ws "^7.4.0"
+
+"@json-rpc-tools/types@^1.7.6":
+ version "1.7.6"
+ resolved "https://registry.yarnpkg.com/@json-rpc-tools/types/-/types-1.7.6.tgz#5abd5fde01364a130c46093b501715bcce5bdc0e"
+ integrity sha512-nDSqmyRNEqEK9TZHtM15uNnDljczhCUdBmRhpNZ95bIPKEDQ+nTDmGMFd2lLin3upc5h2VVVd9tkTDdbXUhDIQ==
+ dependencies:
+ keyvaluestorage-interface "^1.0.0"
+
+"@json-rpc-tools/utils@^1.7.6":
+ version "1.7.6"
+ resolved "https://registry.yarnpkg.com/@json-rpc-tools/utils/-/utils-1.7.6.tgz#67f04987dbaa2e7adb6adff1575367b75a9a9ba1"
+ integrity sha512-HjA8x/U/Q78HRRe19yh8HVKoZ+Iaoo3YZjakJYxR+rw52NHo6jM+VE9b8+7ygkCFXl/EHID5wh/MkXaE/jGyYw==
+ dependencies:
+ "@json-rpc-tools/types" "^1.7.6"
+ "@pedrouid/environment" "^1.0.1"
+
+"@keplr-wallet/common@0.12.141":
+ version "0.12.141"
+ resolved "https://registry.npmjs.org/@keplr-wallet/common/-/common-0.12.141.tgz#c58bb68bdb5f9346ae29315e78c4174b1cffd365"
+ integrity sha512-LFwTLK+wK5DvPVLk75ccazEDlxgaDIib9A1Cs+FDEzxW1XkDok+v5ysC0e54glkSxS3pHqCJMmKioTUOWPFbEw==
+ dependencies:
+ "@keplr-wallet/crypto" "0.12.141"
+ "@keplr-wallet/types" "0.12.141"
+ buffer "^6.0.3"
+ delay "^4.4.0"
+
+"@keplr-wallet/cosmos@^0.12.96":
+ version "0.12.141"
+ resolved "https://registry.npmjs.org/@keplr-wallet/cosmos/-/cosmos-0.12.141.tgz#5d20813256152cc5aa15895a45e768fd3f96876e"
+ integrity sha512-HbtPNGuB3kyni2BKWruAHHUx4sUE4rnhj4aWjYAYZJwKPqZoZpv/X9vW5dJ/5kH5Oh59hbxFIg7ZyRXqCxo1yA==
+ dependencies:
+ "@ethersproject/address" "^5.6.0"
+ "@keplr-wallet/common" "0.12.141"
+ "@keplr-wallet/crypto" "0.12.141"
+ "@keplr-wallet/proto-types" "0.12.141"
+ "@keplr-wallet/simple-fetch" "0.12.141"
+ "@keplr-wallet/types" "0.12.141"
+ "@keplr-wallet/unit" "0.12.141"
+ bech32 "^1.1.4"
+ buffer "^6.0.3"
+ long "^4.0.0"
+ protobufjs "^6.11.2"
+
+"@keplr-wallet/crypto@0.12.141":
+ version "0.12.141"
+ resolved "https://registry.npmjs.org/@keplr-wallet/crypto/-/crypto-0.12.141.tgz#2c551f267c70d6ec2735a08f3b905604fae0c42a"
+ integrity sha512-J5RDZerrar4q8+qz18zQKXHsyK47/uk1QcJm4C0GX0uIXrydEIiDIeaN+2jC/DAB4WY7fQezPw0RkwJqkjvScQ==
+ dependencies:
+ "@noble/curves" "^1.4.2"
+ "@noble/hashes" "^1.4.0"
+ bip32 "^2.0.6"
+ bip39 "^3.0.3"
+ bs58check "^2.1.2"
+ buffer "^6.0.3"
+
+"@keplr-wallet/proto-types@0.12.141":
+ version "0.12.141"
+ resolved "https://registry.npmjs.org/@keplr-wallet/proto-types/-/proto-types-0.12.141.tgz#73e3aa3868e16fca442fac6e2942ce3f9257bdaa"
+ integrity sha512-zJGpSppTYuztKx8VZpr0pVfg1lEPOxdEsP8VUk5s5xTcjWMLD7MHrOZQnTeHHlGh0yjhbzEslrPpgfCe2xZnWQ==
+ dependencies:
+ long "^4.0.0"
+ protobufjs "^6.11.2"
+
+"@keplr-wallet/simple-fetch@0.12.141":
+ version "0.12.141"
+ resolved "https://registry.npmjs.org/@keplr-wallet/simple-fetch/-/simple-fetch-0.12.141.tgz#337af4049240ee2878d6b99c14ecad4ed02e1657"
+ integrity sha512-AFITCQg0yN4h+1XvBTCZeo1lHUXyoSnla6bH96SCwDnQ4MZlDudken7hfrk/v7dDw0BGvMnUvLjGS9tZw1H3vA==
+
+"@keplr-wallet/types@0.12.141":
+ version "0.12.141"
+ resolved "https://registry.npmjs.org/@keplr-wallet/types/-/types-0.12.141.tgz#341cc45882a86a39701d726edc8febdc42cafcb3"
+ integrity sha512-och1uUeqL6bUgWGLBSlV87rwXUDZMDUOJaARue65mRzfD6ohp9WBVFZfFgpyxU3M6S6UnzQQ6HuKUnWh4WuDjw==
+ dependencies:
+ long "^4.0.0"
+
+"@keplr-wallet/unit@0.12.141":
+ version "0.12.141"
+ resolved "https://registry.npmjs.org/@keplr-wallet/unit/-/unit-0.12.141.tgz#a5e0df6e0dbe645841cbc9087716e70065c12784"
+ integrity sha512-YO7n7ueNNU3Mws2fSzNXkMHe+6AR2h8wn6cpWo4rlY97IDPB+JDxKLBOURVOsu3/rgDmYhtwmx9X38zMs00goA==
+ dependencies:
+ "@keplr-wallet/types" "0.12.141"
+ big-integer "^1.6.48"
+ utility-types "^3.10.0"
+
+"@kyvejs/sdk@^1.3.3":
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/@kyvejs/sdk/-/sdk-1.3.3.tgz#24931c3ebc964d93e78c09dfae78220ee8470d2f"
+ integrity sha512-t7o3dy9CHpJ7aHRJVbb2hix5F/QNA0FyHtVrvMLg6/p4DVhDnQXMkLhSNevCPaOL0cj3CZpZApjYUAAWrexawQ==
+ dependencies:
+ "@cosmjs/amino" "^0.32.3"
+ "@cosmjs/crypto" "^0.32.3"
+ "@cosmjs/encoding" "^0.32.3"
+ "@cosmjs/math" "^0.32.4"
+ "@cosmjs/proto-signing" "^0.32.3"
+ "@cosmjs/stargate" "^0.32.3"
+ "@cosmostation/extension-client" "^0.1.15"
+ "@keplr-wallet/cosmos" "^0.12.96"
+ "@kyvejs/types" "1.4.1"
+ axios "^0.27.2"
+ bech32 "2.0.0"
+ bignumber.js "9.1.2"
+ cosmjs-types "^0.9.0"
+ humanize-number "0.0.2"
+ qs "^6.10.5"
+
+"@kyvejs/types@1.4.1":
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/@kyvejs/types/-/types-1.4.1.tgz#8875550dabb5687f25ba2046b45720c7d66d31f0"
+ integrity sha512-35Pv9yqcFQIdYQrDeoMfVJzMNr26fKJE5cCEF4d7lHiMJDLVaJ4M8x9cPzAfis7Rd5sfZV9Hm3giB5pBbaZljA==
+
+"@levischuck/tiny-cbor@^0.2.2":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@levischuck/tiny-cbor/-/tiny-cbor-0.2.2.tgz#84239ce80e1107b810f1fe9f66546d4f79f31aea"
+ integrity sha512-f5CnPw997Y2GQ8FAvtuVVC19FX8mwNNC+1XJcIi16n/LTJifKO6QBgGLgN3YEmqtGMk17SKSuoWES3imJVxAVw==
+
+"@lit-protocol/sdk-browser@^1.3.3":
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/@lit-protocol/sdk-browser/-/sdk-browser-1.3.4.tgz#312c527f4c22e4fcefbd3445da743e08ea7fb561"
+ integrity sha512-ex+gn8Gq1za3OVm/6PpRfcUuM1nX1Qh9cFoEgl7Z8Vu4k01lJwOdUSMJk0bSwAWLbDQP5mn33foG0cs1uOU8Nw==
+ dependencies:
+ "@ethersproject/bytes" "^5.5.0"
+ "@ethersproject/contracts" "^5.2.0"
+ "@ethersproject/hash" "^5.4.0"
+ "@ethersproject/providers" "^5.2.0"
+ "@ethersproject/strings" "^5.5.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/units" "^5.4.0"
+ "@ethersproject/wallet" "^5.2.0"
+ "@walletconnect/ethereum-provider" "1.7.8"
+ buffer "^6.0.3"
+ bufferutil "^4.0.6"
+ cross-blob "^3.0.1"
+ js-base64 "^3.7.2"
+ jszip "^3.6.0"
+ lit-connect-modal "^0.1.11"
+ lit-siwe "^1.1.8"
+ node-fetch "^3.2.3"
+ pako "^2.0.4"
+ tslib "^2.3.1"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.1"
+ utf-8-validate "^5.0.8"
+
+"@metamask/eth-sig-util@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088"
+ integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==
+ dependencies:
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^6.2.1"
+ ethjs-util "^0.1.6"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.1"
+
+"@metamask/legacy-web3@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@metamask/legacy-web3/-/legacy-web3-2.0.0.tgz#10c506791ef248d79909ff6321a6b25a3f3d2549"
+ integrity sha512-hR5sbVR0wU3sXMXx2btRBKYzzTkBNTYoZbPHqqB7UARwxm9yEe9C/Y79YyciyzC9cnKetNV6s6VAwNQp5LNpLw==
+
+"@next/env@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/env/-/env-14.2.13.tgz#ba341ba9eb70db428fc1c754f49c3c516f7bab47"
+ integrity sha512-s3lh6K8cbW1h5Nga7NNeXrbe0+2jIIYK9YaA9T7IufDWnZpozdFUp6Hf0d5rNWUKu4fEuSX2rCKlGjCrtylfDw==
+
+"@next/eslint-plugin-next@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.13.tgz#af433f20273d67a6c9c4f840b799977fc101fe52"
+ integrity sha512-z8Mk0VljxhIzsSiZUSdt3wp+t2lKd+jk5a9Jsvh3zDGkItgDMfjv/ZbET6HsxEl/fSihVoHGsXV6VLyDH0lfTQ==
+ dependencies:
+ glob "10.3.10"
+
+"@next/swc-darwin-arm64@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.13.tgz#76f08d78360c4d27d444df7f35a56f59a48f4808"
+ integrity sha512-IkAmQEa2Htq+wHACBxOsslt+jMoV3msvxCn0WFSfJSkv/scy+i/EukBKNad36grRxywaXUYJc9mxEGkeIs8Bzg==
+
+"@next/swc-darwin-x64@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.13.tgz#1d4821d54bb01dacc6a6c32408f8468a4f4af269"
+ integrity sha512-Dv1RBGs2TTjkwEnFMVL5XIfJEavnLqqwYSD6LXgTPdEy/u6FlSrLBSSfe1pcfqhFEXRAgVL3Wpjibe5wXJzWog==
+
+"@next/swc-linux-arm64-gnu@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.13.tgz#79d9af8d3408df9990c8911889eca1ca6a308f19"
+ integrity sha512-yB1tYEFFqo4ZNWkwrJultbsw7NPAAxlPXURXioRl9SdW6aIefOLS+0TEsKrWBtbJ9moTDgU3HRILL6QBQnMevg==
+
+"@next/swc-linux-arm64-musl@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.13.tgz#b13180645865b120591db2f1e831743ebc02ab36"
+ integrity sha512-v5jZ/FV/eHGoWhMKYrsAweQ7CWb8xsWGM/8m1mwwZQ/sutJjoFaXchwK4pX8NqwImILEvQmZWyb8pPTcP7htWg==
+
+"@next/swc-linux-x64-gnu@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.13.tgz#8cb8480dfeee512648e4e08c2095aac0461b876f"
+ integrity sha512-aVc7m4YL7ViiRv7SOXK3RplXzOEe/qQzRA5R2vpXboHABs3w8vtFslGTz+5tKiQzWUmTmBNVW0UQdhkKRORmGA==
+
+"@next/swc-linux-x64-musl@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.13.tgz#df5ca922fa1e1ee81b15a06a2d3d3ace0efd2bd7"
+ integrity sha512-4wWY7/OsSaJOOKvMsu1Teylku7vKyTuocvDLTZQq0TYv9OjiYYWt63PiE1nTuZnqQ4RPvME7Xai+9enoiN0Wrg==
+
+"@next/swc-win32-arm64-msvc@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.13.tgz#8a7db6e71f526212587975f743b28e4d1cb829d1"
+ integrity sha512-uP1XkqCqV2NVH9+g2sC7qIw+w2tRbcMiXFEbMihkQ8B1+V6m28sshBwAB0SDmOe0u44ne1vFU66+gx/28RsBVQ==
+
+"@next/swc-win32-ia32-msvc@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.13.tgz#6aa664f36f2d70c5ae6ffcbbc56784d33f24522d"
+ integrity sha512-V26ezyjPqQpDBV4lcWIh8B/QICQ4v+M5Bo9ykLN+sqeKKBxJVDpEc6biDVyluTXTC40f5IqCU0ttth7Es2ZuMw==
+
+"@next/swc-win32-x64-msvc@14.2.13":
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.13.tgz#5a920eea82a58affa6146192586716cec6c87fed"
+ integrity sha512-WwzOEAFBGhlDHE5Z73mNU8CO8mqMNLqaG+AO9ETmzdCQlJhVtWZnOl2+rqgVQS+YHunjOWptdFmNfbpwcUuEsw==
+
+"@noble/curves@1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35"
+ integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==
+ dependencies:
+ "@noble/hashes" "1.3.2"
+
+"@noble/curves@^1.4.2":
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b"
+ integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==
+ dependencies:
+ "@noble/hashes" "1.5.0"
+
+"@noble/curves@~1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.3.0.tgz#01be46da4fd195822dab821e72f71bf4aeec635e"
+ integrity sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==
+ dependencies:
+ "@noble/hashes" "1.3.3"
+
+"@noble/curves@~1.4.0":
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9"
+ integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==
+ dependencies:
+ "@noble/hashes" "1.4.0"
+
+"@noble/ed25519@^1.6.1":
+ version "1.7.3"
+ resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123"
+ integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==
+
+"@noble/hashes@1.3.2":
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39"
+ integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==
+
+"@noble/hashes@1.3.3", "@noble/hashes@~1.3.3":
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699"
+ integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==
+
+"@noble/hashes@1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426"
+ integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==
+
+"@noble/hashes@1.5.0", "@noble/hashes@^1", "@noble/hashes@^1.0.0", "@noble/hashes@^1.2.0", "@noble/hashes@^1.4.0":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0"
+ integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ 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":
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@nolyfill/is-core-module@1.0.39":
+ version "1.0.39"
+ resolved "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e"
+ integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==
+
+"@peculiar/asn1-android@^2.3.10", "@peculiar/asn1-android@^2.3.3":
+ version "2.3.13"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-android/-/asn1-android-2.3.13.tgz#7c5fe42b5f11b4266a40d676476cec9df4ff56f2"
+ integrity sha512-0VTNazDGKrLS6a3BwTDZanqq6DR/I3SbvmDMuS8Be+OYpvM6x1SRDh9AGDsHVnaCOIztOspCPc6N1m+iUv1Xxw==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.3.13"
+ asn1js "^3.0.5"
+ tslib "^2.6.2"
+
+"@peculiar/asn1-ecc@^2.3.4", "@peculiar/asn1-ecc@^2.3.8":
+ version "2.3.14"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.3.14.tgz#f5997cd2050fc1f5bbf018d757ef0ebc9a1e4800"
+ integrity sha512-zWPyI7QZto6rnLv6zPniTqbGaLh6zBpJyI46r1yS/bVHJXT2amdMHCRRnbV5yst2H8+ppXG6uXu/M6lKakiQ8w==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.3.13"
+ "@peculiar/asn1-x509" "^2.3.13"
+ asn1js "^3.0.5"
+ tslib "^2.6.2"
+
+"@peculiar/asn1-rsa@^2.3.4", "@peculiar/asn1-rsa@^2.3.8":
+ version "2.3.13"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.3.13.tgz#e9630a2a976bde5dfaca969906f684dffce13039"
+ integrity sha512-wBNQqCyRtmqvXkGkL4DR3WxZhHy8fDiYtOjTeCd7SFE5F6GBeafw3EJ94PX/V0OJJrjQ40SkRY2IZu3ZSyBqcg==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.3.13"
+ "@peculiar/asn1-x509" "^2.3.13"
+ asn1js "^3.0.5"
+ tslib "^2.6.2"
+
+"@peculiar/asn1-schema@^2.3.13", "@peculiar/asn1-schema@^2.3.3", "@peculiar/asn1-schema@^2.3.8":
+ version "2.3.13"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.13.tgz#ec8509cdcbc0da3abe73fd7e690556b57a61b8f4"
+ integrity sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==
+ dependencies:
+ asn1js "^3.0.5"
+ pvtsutils "^1.3.5"
+ tslib "^2.6.2"
+
+"@peculiar/asn1-x509@^2.3.13", "@peculiar/asn1-x509@^2.3.4", "@peculiar/asn1-x509@^2.3.8":
+ version "2.3.13"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.3.13.tgz#3616fb879b61f1f161a61660ca92f6fe4107af7a"
+ integrity sha512-PfeLQl2skXmxX2/AFFCVaWU8U6FKW1Db43mgBhShCOFS1bVxqtvusq1hVjfuEcuSQGedrLdCSvTgabluwN/M9A==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.3.13"
+ asn1js "^3.0.5"
+ ipaddr.js "^2.1.0"
+ pvtsutils "^1.3.5"
+ tslib "^2.6.2"
+
+"@pedrouid/environment@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@pedrouid/environment/-/environment-1.0.1.tgz#858f0f8a057340e0b250398b75ead77d6f4342ec"
+ integrity sha512-HaW78NszGzRZd9SeoI3JD11JqY+lubnaOx7Pewj5pfjqWXOEATpeKIFb9Z4t2WBUK2iryiXX3lzWwmYWgUL0Ug==
+
+"@permaweb/ao-loader@^0.0.44":
+ version "0.0.44"
+ resolved "https://registry.yarnpkg.com/@permaweb/ao-loader/-/ao-loader-0.0.44.tgz#47d568c55068e213d47eeda058f027a26f02aeda"
+ integrity sha512-O/5XuwqxCD9dTIN/jZ6x4rmqIA/Css0bqaXScOrXc0xTz7VjYseM+PNXFf8vAXiOgnNFmrZzDJ0or94cjmqhZA==
+ dependencies:
+ "@permaweb/wasm-metering" "^0.2.2"
+
+"@permaweb/ao-scheduler-utils@~0.0.23":
+ version "0.0.24"
+ resolved "https://registry.yarnpkg.com/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.24.tgz#a7d2c1e09f9b6ea5d45127fa395bbbcef6688452"
+ integrity sha512-G6109Nz8+dQFPuG7mV8mz66kLVA+gl2uTSqU7qpaRwfujrWi6obM94CpmvyvAnrLo3dB29EYiuv7+KOKcns8ig==
+ dependencies:
+ lru-cache "^10.2.2"
+ ramda "^0.30.0"
+ zod "^3.23.5"
+
+"@permaweb/ao-scheduler-utils@~0.0.25":
+ version "0.0.25"
+ resolved "https://registry.yarnpkg.com/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.25.tgz#50c96a411d59f58010ace322d6abd3cd5e11e4cd"
+ integrity sha512-b0UYSTgnLMIYLScrfNBgcqK7ZMmd78L3J0Jz4RIsIq2P5PtkdRqQ7fYqLlltg7bD1f3dvl4TkO1925ED4ei7LA==
+ dependencies:
+ lru-cache "^10.2.2"
+ ramda "^0.30.0"
+ zod "^3.23.5"
+
+"@permaweb/aoconnect@^0.0.61":
+ version "0.0.61"
+ resolved "https://registry.yarnpkg.com/@permaweb/aoconnect/-/aoconnect-0.0.61.tgz#471afcd99a528b25407567cfdfe582df9e30fc7d"
+ integrity sha512-qFIFG29pL7+SUEgW/jHeA4GCuz89XOh5abrsRS8l3dASk6OX00mqMlDT9zJcuewxu21HeDwTW2bO230rvdzGQQ==
+ dependencies:
+ "@permaweb/ao-scheduler-utils" "~0.0.23"
+ "@permaweb/protocol-tag-utils" "~0.0.2"
+ buffer "^6.0.3"
+ debug "^4.3.6"
+ hyper-async "^1.1.2"
+ mnemonist "^0.39.8"
+ ramda "^0.30.1"
+ warp-arbundles "^1.0.4"
+ zod "^3.23.8"
+
+"@permaweb/aoconnect@^0.0.62":
+ version "0.0.62"
+ resolved "https://registry.yarnpkg.com/@permaweb/aoconnect/-/aoconnect-0.0.62.tgz#404d9f506b70385027447a9bd7d3d51b93104ce2"
+ integrity sha512-e42yASru6ze09rugKzi2yD3E57OK0xSbjDM5TI7gKnDVMo8JHweiLCntglItJ44vuNUA7Sdool83v4bmEohaZw==
+ dependencies:
+ "@permaweb/ao-scheduler-utils" "~0.0.25"
+ "@permaweb/protocol-tag-utils" "~0.0.2"
+ buffer "^6.0.3"
+ debug "^4.3.7"
+ hyper-async "^1.1.2"
+ mnemonist "^0.39.8"
+ ramda "^0.30.1"
+ warp-arbundles "^1.0.4"
+ zod "^3.23.8"
+
+"@permaweb/protocol-tag-utils@~0.0.2":
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/@permaweb/protocol-tag-utils/-/protocol-tag-utils-0.0.2.tgz#c8a2eddf7da15d70a6e60aecff839730cb59aee3"
+ integrity sha512-2IiKu71W7pkHKIzxabCGQ5q8DSppZaE/sPcPF2hn+OWwfe04M7b5X5LHRXQNPRuxHWuioieGdPQb3F7apOlffQ==
+
+"@permaweb/wasm-json-toolkit@^0.2.9":
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/@permaweb/wasm-json-toolkit/-/wasm-json-toolkit-0.2.9.tgz#241cdf37c1690a751a73dd05987336142e5576d1"
+ integrity sha512-CGCeUwS+UeqUdvORiyG0LykkQXLTwS5TWc590CUkDfOYyBUSPv8pse0sJStvTC9LKAzuNx3ELBvmqHCI4muUAA==
+ dependencies:
+ buffer-pipe "0.0.3"
+ leb128 "0.0.4"
+ safe-buffer "^5.1.2"
+
+"@permaweb/wasm-metering@^0.2.2":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@permaweb/wasm-metering/-/wasm-metering-0.2.2.tgz#a854c485d9ddbbefb4a17a3692822b696d54a2c7"
+ integrity sha512-xM2MbPkHc4rzhTR6VH5eXtfC+liaYSuNCa0kPRaqSZO2gr1SirJWnzUBDa5VOfTBTgIlIVv5RW+Mkbt/VuK+oA==
+ dependencies:
+ "@permaweb/wasm-json-toolkit" "^0.2.9"
+ leb128 "^0.0.4"
+
+"@pkgjs/parseargs@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
+"@popperjs/core@^2.11.8":
+ version "2.11.8"
+ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
+ integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
+
+"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
+ integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==
+
+"@protobufjs/base64@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
+ integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
+
+"@protobufjs/codegen@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
+ integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
+
+"@protobufjs/eventemitter@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
+ integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==
+
+"@protobufjs/fetch@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
+ integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.1"
+ "@protobufjs/inquire" "^1.1.0"
+
+"@protobufjs/float@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
+ integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==
+
+"@protobufjs/inquire@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
+ integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==
+
+"@protobufjs/path@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
+ integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==
+
+"@protobufjs/pool@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
+ integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==
+
+"@protobufjs/utf8@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
+ integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
+
+"@randlabs/communication-bridge@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@randlabs/communication-bridge/-/communication-bridge-1.0.1.tgz#d1ecfc29157afcbb0ca2d73122d67905eecb5bf3"
+ integrity sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg==
+
+"@randlabs/myalgo-connect@^1.1.2":
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/@randlabs/myalgo-connect/-/myalgo-connect-1.4.2.tgz#ce3ad97b3889ea21da75852187511d3f6be0fa05"
+ integrity sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA==
+ dependencies:
+ "@randlabs/communication-bridge" "1.0.1"
+
+"@remix-run/router@1.20.0":
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.20.0.tgz#03554155b45d8b529adf635b2f6ad1165d70d8b4"
+ integrity sha512-mUnk8rPJBI9loFDZ+YzPGdeniYK+FTmRD1TMCz7ev2SNIozyKKpnGgsxO34u6Z4z/t0ITuu7voi/AshfsGsgFg==
+
+"@rtsao/scc@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
+ integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
+
+"@rushstack/eslint-patch@^1.3.3":
+ version "1.10.4"
+ resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz#427d5549943a9c6fce808e39ea64dbe60d4047f1"
+ integrity sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==
+
+"@scure/base@~1.1.3":
+ version "1.1.9"
+ resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.9.tgz#e5e142fbbfe251091f9c5f1dd4c834ac04c3dbd1"
+ integrity sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==
+
+"@scure/starknet@~1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@scure/starknet/-/starknet-1.0.0.tgz#4419bc2fdf70f3dd6cb461d36c878c9ef4419f8c"
+ integrity sha512-o5J57zY0f+2IL/mq8+AYJJ4Xpc1fOtDhr+mFQKbHnYFmm3WQrC+8zj2HEgxak1a+x86mhmBC1Kq305KUpVf0wg==
+ dependencies:
+ "@noble/curves" "~1.3.0"
+ "@noble/hashes" "~1.3.3"
+
+"@simplewebauthn/browser@^11.0.0":
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/@simplewebauthn/browser/-/browser-11.0.0.tgz#270b47039b4561199bc16f25197431c8f10dbfb5"
+ integrity sha512-KEGCStrl08QC2I561BzxqGiwoknblP6O1YW7jApdXLPtIqZ+vgJYAv8ssLCdm1wD8HGAHd49CJLkUF8X70x/pg==
+ dependencies:
+ "@simplewebauthn/types" "^11.0.0"
+
+"@simplewebauthn/iso-webcrypto@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@simplewebauthn/iso-webcrypto/-/iso-webcrypto-7.4.0.tgz#f994132bd7bbcb762fc08021566971aad9005500"
+ integrity sha512-LSx8zghjH+z9IFOhBdDv2AyhqnzDUCYFxFiwJbToowOigCgf4Y8fyZle9Y+0NS232bIoU6j/lgv5iT32m3eGyA==
+ dependencies:
+ "@simplewebauthn/typescript-types" "^7.4.0"
+ "@types/node" "^18.11.9"
+
+"@simplewebauthn/server@^11.0.0":
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/@simplewebauthn/server/-/server-11.0.0.tgz#577eb8beefd1e371f09fbf9c99eac0c2ddf50599"
+ integrity sha512-zu8dxKcPiRUNSN2kmrnNOzNbRI8VaR/rL4ENCHUfC6PEE7SAAdIql9g5GBOd/wOVZolIsaZz3ccFxuGoVP0iaw==
+ dependencies:
+ "@hexagon/base64" "^1.1.27"
+ "@levischuck/tiny-cbor" "^0.2.2"
+ "@peculiar/asn1-android" "^2.3.10"
+ "@peculiar/asn1-ecc" "^2.3.8"
+ "@peculiar/asn1-rsa" "^2.3.8"
+ "@peculiar/asn1-schema" "^2.3.8"
+ "@peculiar/asn1-x509" "^2.3.8"
+ "@simplewebauthn/types" "^11.0.0"
+ cross-fetch "^4.0.0"
+
+"@simplewebauthn/server@^7.2.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@simplewebauthn/server/-/server-7.4.0.tgz#eb76e30f0c6d9e7fb323b8598c1b2d132e5873e0"
+ integrity sha512-Y6jj2WsE3zBDagSdOg3b7+SMw7zHku0Od45Q1ZpA19Wd5aUbV2mH281SbdhFN4UuKcGQSeeAgUObAWHvgxNOVA==
+ dependencies:
+ "@hexagon/base64" "^1.1.25"
+ "@peculiar/asn1-android" "^2.3.3"
+ "@peculiar/asn1-ecc" "^2.3.4"
+ "@peculiar/asn1-rsa" "^2.3.4"
+ "@peculiar/asn1-schema" "^2.3.3"
+ "@peculiar/asn1-x509" "^2.3.4"
+ "@simplewebauthn/iso-webcrypto" "^7.4.0"
+ "@simplewebauthn/typescript-types" "^7.4.0"
+ "@types/debug" "^4.1.7"
+ "@types/node" "^18.11.9"
+ cbor-x "^1.4.1"
+ cross-fetch "^3.1.5"
+ debug "^4.3.2"
+
+"@simplewebauthn/types@^11.0.0":
+ version "11.0.0"
+ resolved "https://registry.yarnpkg.com/@simplewebauthn/types/-/types-11.0.0.tgz#f329abc4c1bc3b18d6c7a4346af9fdec90d8a67e"
+ integrity sha512-b2o0wC5u2rWts31dTgBkAtSNKGX0cvL6h8QedNsKmj8O4QoLFQFR3DBVBUlpyVEhYKA+mXGUaXbcOc4JdQ3HzA==
+
+"@simplewebauthn/typescript-types@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@simplewebauthn/typescript-types/-/typescript-types-7.4.0.tgz#1f5d55e187cbd30727a75543caf1bade747625ce"
+ integrity sha512-8/ZjHeUPe210Bt5oyaOIGx4h8lHdsQs19BiOT44gi/jBEgK7uBGA0Fy7NRsyh777al3m6WM0mBf0UR7xd4R7WQ==
+
+"@solana/buffer-layout@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15"
+ integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==
+ dependencies:
+ buffer "~6.0.3"
+
+"@solana/wallet-adapter-base@^0.9.2":
+ version "0.9.23"
+ resolved "https://registry.yarnpkg.com/@solana/wallet-adapter-base/-/wallet-adapter-base-0.9.23.tgz#3b17c28afd44e173f44f658bf9700fd637e12a11"
+ integrity sha512-apqMuYwFp1jFi55NxDfvXUX2x1T0Zh07MxhZ/nCCTGys5raSfYUh82zen2BLv8BSDj/JxZ2P/s7jrQZGrX8uAw==
+ dependencies:
+ "@solana/wallet-standard-features" "^1.1.0"
+ "@wallet-standard/base" "^1.0.1"
+ "@wallet-standard/features" "^1.0.3"
+ eventemitter3 "^4.0.7"
+
+"@solana/wallet-standard-features@^1.1.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@solana/wallet-standard-features/-/wallet-standard-features-1.2.0.tgz#be8b3824abf5ebcfeaa7298445bf53f76a27c935"
+ integrity sha512-tUd9srDLkRpe1BYg7we+c4UhRQkq+XQWswsr/L1xfGmoRDF47BPSXf4zE7ZU2GRBGvxtGt7lwJVAufQyQYhxTQ==
+ dependencies:
+ "@wallet-standard/base" "^1.0.1"
+ "@wallet-standard/features" "^1.0.3"
+
+"@solana/web3.js@^1.91.7":
+ version "1.95.3"
+ resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.3.tgz#70b5f4d76823f56b5af6403da51125fffeb65ff3"
+ integrity sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==
+ dependencies:
+ "@babel/runtime" "^7.25.0"
+ "@noble/curves" "^1.4.2"
+ "@noble/hashes" "^1.4.0"
+ "@solana/buffer-layout" "^4.0.1"
+ agentkeepalive "^4.5.0"
+ bigint-buffer "^1.1.5"
+ bn.js "^5.2.1"
+ borsh "^0.7.0"
+ bs58 "^4.0.1"
+ buffer "6.0.3"
+ fast-stable-stringify "^1.0.0"
+ jayson "^4.1.1"
+ node-fetch "^2.7.0"
+ rpc-websockets "^9.0.2"
+ superstruct "^2.0.2"
+
+"@spruceid/siwe-parser@1.1.3":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@spruceid/siwe-parser/-/siwe-parser-1.1.3.tgz#0eebe8bbd63c6de89cb44c06b6329b00b305df65"
+ integrity sha512-oQ8PcwDqjGWJvLmvAF2yzd6iniiWxK0Qtz+Dw+gLD/W5zOQJiKIUXwslHOm8VB8OOOKW9vfR3dnPBhHaZDvRsw==
+ dependencies:
+ apg-js "^4.1.1"
+
+"@stablelib/binary@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@stablelib/binary/-/binary-1.0.1.tgz#c5900b94368baf00f811da5bdb1610963dfddf7f"
+ integrity sha512-ClJWvmL6UBM/wjkvv/7m5VP3GMr9t0osr4yVgLZsLCOz4hGN9gIAFEqnJ0TsSMAN+n840nf2cHZnA5/KFqHC7Q==
+ dependencies:
+ "@stablelib/int" "^1.0.1"
+
+"@stablelib/int@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@stablelib/int/-/int-1.0.1.tgz#75928cc25d59d73d75ae361f02128588c15fd008"
+ integrity sha512-byr69X/sDtDiIjIV6m4roLVWnNNlRGzsvxw+agj8CIEazqWGOQp2dTYgQhtyVXV9wpO6WyXRQUzLV/JRNumT2w==
+
+"@stablelib/random@^1.0.1":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@stablelib/random/-/random-1.0.2.tgz#2dece393636489bf7e19c51229dd7900eddf742c"
+ integrity sha512-rIsE83Xpb7clHPVRlBj8qNe5L8ISQOzjghYQm/dZ7VaM2KHYwMW5adjQjrzTZCchFnNCNhkwtnOBa9HTMJCI8w==
+ dependencies:
+ "@stablelib/binary" "^1.0.1"
+ "@stablelib/wipe" "^1.0.1"
+
+"@stablelib/wipe@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@stablelib/wipe/-/wipe-1.0.1.tgz#d21401f1d59ade56a62e139462a97f104ed19a36"
+ integrity sha512-WfqfX/eXGiAd3RJe4VU2snh/ZPwtSjLG4ynQ/vYzvghTh7dHFcI1wl+nrkWG6lGhukOxOsUHfv8dUXr58D0ayg==
+
+"@starknet-io/types-js@^0.7.7":
+ version "0.7.7"
+ resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.7.tgz#444be5e4e585ec6f599d42d3407280d98b2dfdf8"
+ integrity sha512-WLrpK7LIaIb8Ymxu6KF/6JkGW1sso988DweWu7p5QY/3y7waBIiPvzh27D9bX5KIJNRDyOoOVoHVEKYUYWZ/RQ==
+
+"@supercharge/promise-pool@^1.7.0":
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/@supercharge/promise-pool/-/promise-pool-1.9.0.tgz#7630c760535919db93711ca35716ada59d86feb7"
+ integrity sha512-UqQrree8uGTCEDKAnGJci1B7NGIZ1xepXHjUEqbH16Wgvr/j5+54hxebkpTpDcz5t2SrzY6J6USSlmgQeo66/g==
+
+"@swc/counter@^0.1.3":
+ version "0.1.3"
+ resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9"
+ integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==
+
+"@swc/helpers@0.5.5":
+ version "0.5.5"
+ resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz#12689df71bfc9b21c4f4ca00ae55f2f16c8b77c0"
+ integrity sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==
+ dependencies:
+ "@swc/counter" "^0.1.3"
+ tslib "^2.4.0"
+
+"@swc/helpers@^0.5.11":
+ version "0.5.13"
+ resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c"
+ integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==
+ dependencies:
+ tslib "^2.4.0"
+
+"@textury/ardb@^1.1.3":
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/@textury/ardb/-/ardb-1.1.3.tgz#a16c2cac807eef955fe0ff21bcce0f2597a6adef"
+ integrity sha512-Q7mQH56zLNIpbEJ2E7/UM1e2b0lgaU8ARr/KCEq/m9aXJwvNJBCB+YCbPe9oQcZgXtybgNR0hEwBaYSaoicF3w==
+ dependencies:
+ arweave "^1.10.15"
+
+"@types/bn.js@5.1.1":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682"
+ integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^4.11.3":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^5.1.0":
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203"
+ integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==
+ dependencies:
+ "@types/node" "*"
+
+"@types/connect@^3.4.33":
+ version "3.4.38"
+ resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858"
+ integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==
+ dependencies:
+ "@types/node" "*"
+
+"@types/debug@^4.1.7":
+ version "4.1.12"
+ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917"
+ integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==
+ dependencies:
+ "@types/ms" "*"
+
+"@types/hast@^2.0.0":
+ version "2.3.10"
+ resolved "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.10.tgz#5c9d9e0b304bbb8879b857225c5ebab2d81d7643"
+ integrity sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==
+ dependencies:
+ "@types/unist" "^2"
+
+"@types/http-proxy@^1.17.15":
+ version "1.17.15"
+ resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz#12118141ce9775a6499ecb4c01d02f90fc839d36"
+ integrity sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
+"@types/lodash.mergewith@4.6.9":
+ version "4.6.9"
+ resolved "https://registry.yarnpkg.com/@types/lodash.mergewith/-/lodash.mergewith-4.6.9.tgz#7093028a36de3cae4495d03b9d92c351cab1f8bf"
+ integrity sha512-fgkoCAOF47K7sxrQ7Mlud2TH023itugZs2bUg8h/KzT+BnZNrR2jAOmaokbLunHNnobXVWOezAeNn/lZqwxkcw==
+ dependencies:
+ "@types/lodash" "*"
+
+"@types/lodash@*":
+ version "4.17.12"
+ resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.17.12.tgz#25d71312bf66512105d71e55d42e22c36bcfc689"
+ integrity sha512-sviUmCE8AYdaF/KIHLDJBQgeYzPBI0vf/17NaYehBJfYD1j6/L95Slh07NlyK2iNyBNaEkb3En2jRt+a8y3xZQ==
+
+"@types/long@^4.0.1":
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a"
+ integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==
+
+"@types/ms@*":
+ version "0.7.34"
+ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433"
+ integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
+
+"@types/node@*", "@types/node@>=13.7.0":
+ version "22.7.6"
+ resolved "https://registry.npmjs.org/@types/node/-/node-22.7.6.tgz#3ec3e2b071e136cd11093c19128405e1d1f92f33"
+ integrity sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==
+ dependencies:
+ undici-types "~6.19.2"
+
+"@types/node@10.12.18":
+ version "10.12.18"
+ resolved "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67"
+ integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==
+
+"@types/node@22.7.5":
+ version "22.7.5"
+ resolved "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b"
+ integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==
+ dependencies:
+ undici-types "~6.19.2"
+
+"@types/node@^12.12.54":
+ version "12.20.55"
+ resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240"
+ integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==
+
+"@types/node@^18.11.9":
+ version "18.19.60"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.60.tgz#3fca49e78e78588ab873af85e2bc2bbb9db8cdc4"
+ integrity sha512-cYRj7igVqgxhlHFdBHHpU2SNw3+dN2x0VTZJtLYk6y/ieuGN4XiBgtDjYVktM/yk2y/8pKMileNc6IoEzEJnUw==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/parse-json@^4.0.0":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239"
+ integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc"
+ integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==
+ dependencies:
+ "@types/node" "*"
+
+"@types/retry@0.12.0":
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d"
+ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf"
+ integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/triple-beam@^1.3.2":
+ version "1.3.5"
+ resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c"
+ integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==
+
+"@types/unist@^2":
+ version "2.0.11"
+ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4"
+ integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==
+
+"@types/uuid@^8.3.4":
+ version "8.3.4"
+ resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc"
+ integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==
+
+"@types/ws@^7.4.4":
+ version "7.4.7"
+ resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702"
+ integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==
+ dependencies:
+ "@types/node" "*"
+
+"@types/ws@^8.2.2":
+ version "8.5.12"
+ resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e"
+ integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==
+ dependencies:
+ "@types/node" "*"
+
+"@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0":
+ version "8.10.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.10.0.tgz#9c8218ed62f9a322df10ded7c34990f014df44f2"
+ integrity sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==
+ dependencies:
+ "@eslint-community/regexpp" "^4.10.0"
+ "@typescript-eslint/scope-manager" "8.10.0"
+ "@typescript-eslint/type-utils" "8.10.0"
+ "@typescript-eslint/utils" "8.10.0"
+ "@typescript-eslint/visitor-keys" "8.10.0"
+ graphemer "^1.4.0"
+ ignore "^5.3.1"
+ natural-compare "^1.4.0"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0":
+ version "8.10.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.10.0.tgz#3cbe7206f5e42835878a74a76da533549f977662"
+ integrity sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==
+ dependencies:
+ "@typescript-eslint/scope-manager" "8.10.0"
+ "@typescript-eslint/types" "8.10.0"
+ "@typescript-eslint/typescript-estree" "8.10.0"
+ "@typescript-eslint/visitor-keys" "8.10.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@8.10.0":
+ version "8.10.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz#606ffe18314d7b5c2f118f2f02aaa2958107a19c"
+ integrity sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==
+ dependencies:
+ "@typescript-eslint/types" "8.10.0"
+ "@typescript-eslint/visitor-keys" "8.10.0"
+
+"@typescript-eslint/type-utils@8.10.0":
+ version "8.10.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.10.0.tgz#99f1d2e21f8c74703e7d9c4a67a87271eaf57597"
+ integrity sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "8.10.0"
+ "@typescript-eslint/utils" "8.10.0"
+ debug "^4.3.4"
+ ts-api-utils "^1.3.0"
+
+"@typescript-eslint/types@8.10.0":
+ version "8.10.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz#eb29c4bc2ed23489348c297469c76d28c38fb618"
+ integrity sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==
+
+"@typescript-eslint/typescript-estree@8.10.0":
+ version "8.10.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz#36cc66e06c5f44d6781f95cb03b132e985273a33"
+ integrity sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==
+ dependencies:
+ "@typescript-eslint/types" "8.10.0"
+ "@typescript-eslint/visitor-keys" "8.10.0"
+ 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 "^1.3.0"
+
+"@typescript-eslint/utils@8.10.0":
+ version "8.10.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.10.0.tgz#d78d1ce3ea3d2a88a2593ebfb1c98490131d00bf"
+ integrity sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@typescript-eslint/scope-manager" "8.10.0"
+ "@typescript-eslint/types" "8.10.0"
+ "@typescript-eslint/typescript-estree" "8.10.0"
+
+"@typescript-eslint/visitor-keys@8.10.0":
+ version "8.10.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz#7ce4c0c3b82140415c9cd9babe09e0000b4e9979"
+ integrity sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==
+ dependencies:
+ "@typescript-eslint/types" "8.10.0"
+ eslint-visitor-keys "^3.4.3"
+
+"@ungap/structured-clone@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
+ integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
+
+"@wallet-standard/base@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@wallet-standard/base/-/base-1.0.1.tgz#860dd94d47c9e3c5c43b79d91c6afdbd7a36264e"
+ integrity sha512-1To3ekMfzhYxe0Yhkpri+Fedq0SYcfrOfJi3vbLjMwF2qiKPjTGLwZkf2C9ftdQmxES+hmxhBzTwF4KgcOwf8w==
+
+"@wallet-standard/features@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@wallet-standard/features/-/features-1.0.3.tgz#c992876c5e4f7a0672f8869c4146c87e0dfe48c8"
+ integrity sha512-m8475I6W5LTatTZuUz5JJNK42wFRgkJTB0I9tkruMwfqBF2UN2eomkYNVf9RbrsROelCRzSFmugqjKZBFaubsA==
+ dependencies:
+ "@wallet-standard/base" "^1.0.1"
+
+"@walletconnect/browser-utils@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/browser-utils/-/browser-utils-1.8.0.tgz#33c10e777aa6be86c713095b5206d63d32df0951"
+ integrity sha512-Wcqqx+wjxIo9fv6eBUFHPsW1y/bGWWRboni5dfD8PtOmrihrEpOCmvRJe4rfl7xgJW8Ea9UqKEaq0bIRLHlK4A==
+ dependencies:
+ "@walletconnect/safe-json" "1.0.0"
+ "@walletconnect/types" "^1.8.0"
+ "@walletconnect/window-getters" "1.0.0"
+ "@walletconnect/window-metadata" "1.0.0"
+ detect-browser "5.2.0"
+
+"@walletconnect/client@^1.7.8", "@walletconnect/client@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.8.0.tgz#6f46b5499c7c861c651ff1ebe5da5b66225ca696"
+ integrity sha512-svyBQ14NHx6Cs2j4TpkQaBI/2AF4+LXz64FojTjMtV4VMMhl81jSO1vNeg+yYhQzvjcGH/GpSwixjyCW0xFBOQ==
+ dependencies:
+ "@walletconnect/core" "^1.8.0"
+ "@walletconnect/iso-crypto" "^1.8.0"
+ "@walletconnect/types" "^1.8.0"
+ "@walletconnect/utils" "^1.8.0"
+
+"@walletconnect/core@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.8.0.tgz#6b2748b90c999d9d6a70e52e26a8d5e8bfeaa81e"
+ integrity sha512-aFTHvEEbXcZ8XdWBw6rpQDte41Rxwnuk3SgTD8/iKGSRTni50gI9S3YEzMj05jozSiOBxQci4pJDMVhIUMtarw==
+ dependencies:
+ "@walletconnect/socket-transport" "^1.8.0"
+ "@walletconnect/types" "^1.8.0"
+ "@walletconnect/utils" "^1.8.0"
+
+"@walletconnect/crypto@^1.0.2":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@walletconnect/crypto/-/crypto-1.0.3.tgz#7b8dd4d7e2884fe3543c7c07aea425eef5ef9dd4"
+ integrity sha512-+2jdORD7XQs76I2Odgr3wwrtyuLUXD/kprNVsjWRhhhdO9Mt6WqVzOPu0/t7OHSmgal8k7SoBQzUc5hu/8zL/g==
+ dependencies:
+ "@walletconnect/encoding" "^1.0.2"
+ "@walletconnect/environment" "^1.0.1"
+ "@walletconnect/randombytes" "^1.0.3"
+ aes-js "^3.1.2"
+ hash.js "^1.1.7"
+ tslib "1.14.1"
+
+"@walletconnect/encoding@^1.0.1", "@walletconnect/encoding@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@walletconnect/encoding/-/encoding-1.0.2.tgz#cb3942ad038d6a6bf01158f66773062dd25724da"
+ integrity sha512-CrwSBrjqJ7rpGQcTL3kU+Ief+Bcuu9PH6JLOb+wM6NITX1GTxR/MfNwnQfhLKK6xpRAyj2/nM04OOH6wS8Imag==
+ dependencies:
+ is-typedarray "1.0.0"
+ tslib "1.14.1"
+ typedarray-to-buffer "3.1.5"
+
+"@walletconnect/environment@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/environment/-/environment-1.0.1.tgz#1d7f82f0009ab821a2ba5ad5e5a7b8ae3b214cd7"
+ integrity sha512-T426LLZtHj8e8rYnKfzsw1aG6+M0BT1ZxayMdv/p8yM0MU+eJDISqNY3/bccxRr4LrF9csq02Rhqt08Ibl0VRg==
+ dependencies:
+ tslib "1.14.1"
+
+"@walletconnect/ethereum-provider@1.7.8":
+ version "1.7.8"
+ resolved "https://registry.yarnpkg.com/@walletconnect/ethereum-provider/-/ethereum-provider-1.7.8.tgz#8b969b394e14c68855b6ae2660f2e39dec857f5f"
+ integrity sha512-dnl560zFMdK/LD4MD2XwHbWj7RXOaeXWPc9jzDaosLQLAXfA5mKe4XbCFFUPbVMYuyBdRI9NZv3Ci/qDb5wncQ==
+ dependencies:
+ "@walletconnect/client" "^1.7.8"
+ "@walletconnect/jsonrpc-http-connection" "^1.0.0"
+ "@walletconnect/jsonrpc-provider" "^1.0.3"
+ "@walletconnect/signer-connection" "^1.7.8"
+ "@walletconnect/types" "^1.7.8"
+ "@walletconnect/utils" "^1.7.8"
+ eip1193-provider "1.0.1"
+ eventemitter3 "4.0.7"
+
+"@walletconnect/iso-crypto@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.8.0.tgz#44ddf337c4f02837c062dbe33fa7ab36789df451"
+ integrity sha512-pWy19KCyitpfXb70hA73r9FcvklS+FvO9QUIttp3c2mfW8frxgYeRXfxLRCIQTkaYueRKvdqPjbyhPLam508XQ==
+ dependencies:
+ "@walletconnect/crypto" "^1.0.2"
+ "@walletconnect/types" "^1.8.0"
+ "@walletconnect/utils" "^1.8.0"
+
+"@walletconnect/jsonrpc-http-connection@^1.0.0":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-http-connection/-/jsonrpc-http-connection-1.0.8.tgz#2f4c3948f074960a3edd07909560f3be13e2c7ae"
+ integrity sha512-+B7cRuaxijLeFDJUq5hAzNyef3e3tBDIxyaCNmFtjwnod5AGis3RToNqzFU33vpVcxFhofkpE7Cx+5MYejbMGw==
+ dependencies:
+ "@walletconnect/jsonrpc-utils" "^1.0.6"
+ "@walletconnect/safe-json" "^1.0.1"
+ cross-fetch "^3.1.4"
+ events "^3.3.0"
+
+"@walletconnect/jsonrpc-provider@^1.0.3":
+ version "1.0.14"
+ resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-provider/-/jsonrpc-provider-1.0.14.tgz#696f3e3b6d728b361f2e8b853cfc6afbdf2e4e3e"
+ integrity sha512-rtsNY1XqHvWj0EtITNeuf8PHMvlCLiS3EjQL+WOkxEOA4KPxsohFnBDeyPYiNm4ZvkQdLnece36opYidmtbmow==
+ dependencies:
+ "@walletconnect/jsonrpc-utils" "^1.0.8"
+ "@walletconnect/safe-json" "^1.0.2"
+ events "^3.3.0"
+
+"@walletconnect/jsonrpc-types@^1.0.1", "@walletconnect/jsonrpc-types@^1.0.3":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-types/-/jsonrpc-types-1.0.4.tgz#ce1a667d79eadf2a2d9d002c152ceb68739c230c"
+ integrity sha512-P6679fG/M+wuWg9TY8mh6xFSdYnFyFjwFelxyISxMDrlbXokorEVXYOxiqEbrU3x1BmBoCAJJ+vtEaEoMlpCBQ==
+ dependencies:
+ events "^3.3.0"
+ keyvaluestorage-interface "^1.0.0"
+
+"@walletconnect/jsonrpc-utils@^1.0.3", "@walletconnect/jsonrpc-utils@^1.0.6", "@walletconnect/jsonrpc-utils@^1.0.8":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@walletconnect/jsonrpc-utils/-/jsonrpc-utils-1.0.8.tgz#82d0cc6a5d6ff0ecc277cb35f71402c91ad48d72"
+ integrity sha512-vdeb03bD8VzJUL6ZtzRYsFMq1eZQcM3EAzT0a3st59dyLfJ0wq+tKMpmGH7HlB7waD858UWgfIcudbPFsbzVdw==
+ dependencies:
+ "@walletconnect/environment" "^1.0.1"
+ "@walletconnect/jsonrpc-types" "^1.0.3"
+ tslib "1.14.1"
+
+"@walletconnect/mobile-registry@^1.4.0":
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.4.0.tgz#502cf8ab87330841d794819081e748ebdef7aee5"
+ integrity sha512-ZtKRio4uCZ1JUF7LIdecmZt7FOLnX72RPSY7aUVu7mj7CSfxDwUn6gBuK6WGtH+NZCldBqDl5DenI5fFSvkKYw==
+
+"@walletconnect/qrcode-modal@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.8.0.tgz#ddd6f5c9b7ee52c16adf9aacec2a3eac4994caea"
+ integrity sha512-BueaFefaAi8mawE45eUtztg3ZFbsAH4DDXh1UNwdUlsvFMjqcYzLUG0xZvDd6z2eOpbgDg2N3bl6gF0KONj1dg==
+ dependencies:
+ "@walletconnect/browser-utils" "^1.8.0"
+ "@walletconnect/mobile-registry" "^1.4.0"
+ "@walletconnect/types" "^1.8.0"
+ copy-to-clipboard "^3.3.1"
+ preact "10.4.1"
+ qrcode "1.4.4"
+
+"@walletconnect/randombytes@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@walletconnect/randombytes/-/randombytes-1.0.3.tgz#e795e4918367fd1e6a2215e075e64ab93e23985b"
+ integrity sha512-35lpzxcHFbTN3ABefC9W+uBpNZl1GC4Wpx0ed30gibfO/y9oLdy1NznbV96HARQKSBV9J9M/rrtIvf6a23jfYw==
+ dependencies:
+ "@walletconnect/encoding" "^1.0.2"
+ "@walletconnect/environment" "^1.0.1"
+ randombytes "^2.1.0"
+ tslib "1.14.1"
+
+"@walletconnect/safe-json@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.0.tgz#12eeb11d43795199c045fafde97e3c91646683b2"
+ integrity sha512-QJzp/S/86sUAgWY6eh5MKYmSfZaRpIlmCJdi5uG4DJlKkZrHEF7ye7gA+VtbVzvTtpM/gRwO2plQuiooIeXjfg==
+
+"@walletconnect/safe-json@^1.0.1", "@walletconnect/safe-json@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@walletconnect/safe-json/-/safe-json-1.0.2.tgz#7237e5ca48046e4476154e503c6d3c914126fa77"
+ integrity sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==
+ dependencies:
+ tslib "1.14.1"
+
+"@walletconnect/signer-connection@^1.7.8":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/signer-connection/-/signer-connection-1.8.0.tgz#6cdf490df770e504cc1a550bdb5bac7696b130bc"
+ integrity sha512-+YAaTAP52MWZJ2wWnqKClKCPlPHBo6reURFe0cWidLADh9mi/kPWGALZ5AENK22zpem1bbKV466rF5Rzvu0ehA==
+ dependencies:
+ "@walletconnect/client" "^1.8.0"
+ "@walletconnect/jsonrpc-types" "^1.0.1"
+ "@walletconnect/jsonrpc-utils" "^1.0.3"
+ "@walletconnect/qrcode-modal" "^1.8.0"
+ "@walletconnect/types" "^1.8.0"
+ eventemitter3 "4.0.7"
+
+"@walletconnect/socket-transport@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.8.0.tgz#9a1128a249628a0be11a0979b522fe82b44afa1b"
+ integrity sha512-5DyIyWrzHXTcVp0Vd93zJ5XMW61iDM6bcWT4p8DTRfFsOtW46JquruMhxOLeCOieM4D73kcr3U7WtyR4JUsGuQ==
+ dependencies:
+ "@walletconnect/types" "^1.8.0"
+ "@walletconnect/utils" "^1.8.0"
+ ws "7.5.3"
+
+"@walletconnect/types@^1.7.8", "@walletconnect/types@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.8.0.tgz#3f5e85b2d6b149337f727ab8a71b8471d8d9a195"
+ integrity sha512-Cn+3I0V0vT9ghMuzh1KzZvCkiAxTq+1TR2eSqw5E5AVWfmCtECFkVZBP6uUJZ8YjwLqXheI+rnjqPy7sVM4Fyg==
+
+"@walletconnect/utils@^1.7.8", "@walletconnect/utils@^1.8.0":
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.8.0.tgz#2591a197c1fa7429941fe428876088fda6632060"
+ integrity sha512-zExzp8Mj1YiAIBfKNm5u622oNw44WOESzo6hj+Q3apSMIb0Jph9X3GDIdbZmvVZsNPxWDL7uodKgZcCInZv2vA==
+ dependencies:
+ "@walletconnect/browser-utils" "^1.8.0"
+ "@walletconnect/encoding" "^1.0.1"
+ "@walletconnect/jsonrpc-utils" "^1.0.3"
+ "@walletconnect/types" "^1.8.0"
+ bn.js "4.11.8"
+ js-sha3 "0.8.0"
+ query-string "6.13.5"
+
+"@walletconnect/window-getters@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.0.tgz#1053224f77e725dfd611c83931b5f6c98c32bfc8"
+ integrity sha512-xB0SQsLaleIYIkSsl43vm8EwETpBzJ2gnzk7e0wMF3ktqiTGS6TFHxcprMl5R44KKh4tCcHCJwolMCaDSwtAaA==
+
+"@walletconnect/window-getters@^1.0.0":
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/@walletconnect/window-getters/-/window-getters-1.0.1.tgz#f36d1c72558a7f6b87ecc4451fc8bd44f63cbbdc"
+ integrity sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==
+ dependencies:
+ tslib "1.14.1"
+
+"@walletconnect/window-metadata@1.0.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@walletconnect/window-metadata/-/window-metadata-1.0.0.tgz#93b1cc685e6b9b202f29c26be550fde97800c4e5"
+ integrity sha512-9eFvmJxIKCC3YWOL97SgRkKhlyGXkrHwamfechmqszbypFspaSk+t2jQXAEU7YClHF6Qjw5eYOmy1//zFi9/GA==
+ dependencies:
+ "@walletconnect/window-getters" "^1.0.0"
+
+"@weavery/clarity@^0.1.5":
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@weavery/clarity/-/clarity-0.1.5.tgz#f06bbb0dac7c63c6e2ccd76cda3e8b32b57f82c2"
+ integrity sha512-0ms2/sBx+uyW3EmXte5otIzNVAXpfJ3lBl6FS8JuLdWmPU6SxiAoGTMUT0N0SL3Ogiz2PZt6NV+mfApbSvYBaQ==
+
+"@zag-js/dom-query@0.31.1":
+ version "0.31.1"
+ resolved "https://registry.yarnpkg.com/@zag-js/dom-query/-/dom-query-0.31.1.tgz#f40be43d0eb1eabdf51538abeeccad46c5b88ed6"
+ integrity sha512-oiuohEXAXhBxpzzNm9k2VHGEOLC1SXlXSbRPcfBZ9so5NRQUA++zCE7cyQJqGLTZR0t3itFLlZqDbYEXRrefwg==
+
+"@zag-js/element-size@0.31.1":
+ version "0.31.1"
+ resolved "https://registry.yarnpkg.com/@zag-js/element-size/-/element-size-0.31.1.tgz#1b3d237618d12b00c0a7dd8e33e29fb8f8cd4f0c"
+ integrity sha512-4T3yvn5NqqAjhlP326Fv+w9RqMIBbNN9H72g5q2ohwzhSgSfZzrKtjL4rs9axY/cw9UfMfXjRjEE98e5CMq7WQ==
+
+"@zag-js/focus-visible@^0.31.1":
+ version "0.31.1"
+ resolved "https://registry.yarnpkg.com/@zag-js/focus-visible/-/focus-visible-0.31.1.tgz#bd6b94e48eff0566c047b55a3c9ccd9890f5eaaa"
+ integrity sha512-dbLksz7FEwyFoANbpIlNnd3bVm0clQSUsnP8yUVQucStZPsuWjCrhL2jlAbGNrTrahX96ntUMXHb/sM68TibFg==
+ dependencies:
+ "@zag-js/dom-query" "0.31.1"
+
+JSONStream@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
+ integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
+ dependencies:
+ jsonparse "^1.2.0"
+ through ">=2.2.7 <3"
+
+abi-wan-kanabi@^2.2.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/abi-wan-kanabi/-/abi-wan-kanabi-2.2.3.tgz#d1c410325aac866f31f3d589279a87b341e5641f"
+ integrity sha512-JlqiAl9CPvTm5kKG0QXmVCWNWoC/XyRMOeT77cQlbxXWllgjf6SqUmaNqFon72C2o5OSZids+5FvLdsw6dvWaw==
+ dependencies:
+ ansicolors "^0.3.2"
+ cardinal "^2.1.1"
+ fs-extra "^10.0.0"
+ yargs "^17.7.2"
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.4.tgz#3ad8d684c51cc9cbc9cf9612a7100b716c414b57"
+ integrity sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==
+ dependencies:
+ buffer "^6.0.3"
+ catering "^2.1.0"
+ is-buffer "^2.0.5"
+ level-supports "^4.0.0"
+ level-transcoder "^1.0.1"
+ module-error "^1.0.1"
+ queue-microtask "^1.2.3"
+
+accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
+ integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
+
+acorn@^8.9.0:
+ version "8.13.0"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3"
+ integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d"
+ integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==
+
+aes-js@4.0.0-beta.5:
+ version "4.0.0-beta.5"
+ resolved "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873"
+ integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==
+
+aes-js@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a"
+ integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==
+
+agentkeepalive@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923"
+ integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==
+ dependencies:
+ humanize-ms "^1.2.1"
+
+ajv-formats@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
+ integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
+ dependencies:
+ ajv "^8.0.0"
+
+ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ 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"
+
+ajv@^8.0.0, ajv@^8.6.3:
+ version "8.17.1"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
+ integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+
+algo-msgpack-with-bigint@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz#38bb717220525b3ff42232eefdcd9efb9ad405d6"
+ integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==
+
+algosdk@^1.13.1:
+ version "1.24.1"
+ resolved "https://registry.npmjs.org/algosdk/-/algosdk-1.24.1.tgz#afc4102457ae0c38a32de6b84f4d713aedfc9e89"
+ integrity sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==
+ dependencies:
+ algo-msgpack-with-bigint "^2.1.1"
+ buffer "^6.0.2"
+ cross-fetch "^3.1.5"
+ hi-base32 "^0.5.1"
+ js-sha256 "^0.9.0"
+ js-sha3 "^0.8.0"
+ js-sha512 "^0.8.0"
+ json-bigint "^1.0.0"
+ tweetnacl "^1.0.3"
+ vlq "^2.0.4"
+
+ansi-escapes@^4.2.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
+ integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654"
+ integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
+
+ansi-styles@^3.2.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^6.1.0:
+ version "6.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
+ integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
+
+ansicolors@^0.3.2, ansicolors@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
+ integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==
+
+aonote@^0.10.1:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/aonote/-/aonote-0.10.1.tgz#ee58857ff52145080f9f4f187f1dec1e980f34cb"
+ integrity sha512-pgG+BV4Rea2HDBvKw7de94We2Aq9TLRimWRY3BEoSpInzCdH7DxIBhTF14vD5bTP1yqmlHeyg6Wy5EX3qWsD8A==
+ dependencies:
+ "@babel/plugin-transform-modules-commonjs" "^7.24.8"
+ "@permaweb/aoconnect" "^0.0.61"
+ arbundles "^0.11.1"
+ arweave "^1.15.1"
+ ramda "^0.30.1"
+ test "^3.3.0"
+
+apg-js@^4.1.1:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/apg-js/-/apg-js-4.4.0.tgz#09dcecab0731fbde233b9f2352fdd2d07e56b2cf"
+ integrity sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==
+
+arbundles@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/arbundles/-/arbundles-0.11.2.tgz#60375c0d5bda0eeecd9ce9a2aa42da7a89efa3f9"
+ integrity sha512-vyX7vY6S8B4RFhGSoCixbnR/Z7ckpJjK+b/H7zcgRWJqqXjZqQ+3DQIJ19vKl5AvzNSsj5ja9kQDoZhMiGpBFw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/providers" "^5.7.2"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wallet" "^5.7.0"
+ "@irys/arweave" "^0.0.2"
+ "@noble/ed25519" "^1.6.1"
+ base64url "^3.0.1"
+ bs58 "^4.0.1"
+ keccak "^3.0.2"
+ secp256k1 "^5.0.0"
+ optionalDependencies:
+ "@randlabs/myalgo-connect" "^1.1.2"
+ algosdk "^1.13.1"
+ arweave-stream-tx "^1.1.0"
+ multistream "^4.1.0"
+ tmp-promise "^3.0.2"
+
+arbundles@^0.6.19:
+ version "0.6.23"
+ resolved "https://registry.yarnpkg.com/arbundles/-/arbundles-0.6.23.tgz#c00cda953df67fa65d4297486237cc8e0c072c47"
+ integrity sha512-+gr93F3fivN+6dhiImT6BQNaXz4oECPn2GYjCZjS2yEoq7hM78FRvVp6kQyjEdhnuBFQr/q4oS/nkjnQlHdj9Q==
+ dependencies:
+ "@noble/ed25519" "^1.6.1"
+ "@randlabs/myalgo-connect" "^1.1.2"
+ "@solana/wallet-adapter-base" "^0.9.2"
+ algosdk "^1.13.1"
+ arweave "^1.11.4"
+ arweave-stream-tx "^1.1.0"
+ avsc "https://github.com/Irys-xyz/avsc#csp-fixes"
+ axios "^0.21.3"
+ base64url "^3.0.1"
+ bs58 "^4.0.1"
+ ethers "^5.5.1"
+ keccak "^3.0.2"
+ multistream "^4.1.0"
+ process "^0.11.10"
+ secp256k1 "^4.0.2"
+ tmp-promise "^3.0.2"
+
+archiver-utils@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.1.0.tgz#e8a460e94b693c3e3da182a098ca6285ba9249e2"
+ integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==
+ dependencies:
+ glob "^7.1.4"
+ graceful-fs "^4.2.0"
+ lazystream "^1.0.0"
+ lodash.defaults "^4.2.0"
+ lodash.difference "^4.5.0"
+ lodash.flatten "^4.4.0"
+ lodash.isplainobject "^4.0.6"
+ lodash.union "^4.6.0"
+ normalize-path "^3.0.0"
+ readable-stream "^2.0.0"
+
+archiver-utils@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-3.0.4.tgz#a0d201f1cf8fce7af3b5a05aea0a337329e96ec7"
+ integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==
+ dependencies:
+ glob "^7.2.3"
+ graceful-fs "^4.2.0"
+ lazystream "^1.0.0"
+ lodash.defaults "^4.2.0"
+ lodash.difference "^4.5.0"
+ lodash.flatten "^4.4.0"
+ lodash.isplainobject "^4.0.6"
+ lodash.union "^4.6.0"
+ normalize-path "^3.0.0"
+ readable-stream "^3.6.0"
+
+archiver@^5.3.0:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/archiver/-/archiver-5.3.2.tgz#99991d5957e53bd0303a392979276ac4ddccf3b0"
+ integrity sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==
+ dependencies:
+ archiver-utils "^2.1.0"
+ async "^3.2.4"
+ buffer-crc32 "^0.2.1"
+ readable-stream "^3.6.0"
+ readdir-glob "^1.1.2"
+ tar-stream "^2.2.0"
+ zip-stream "^4.1.0"
+
+arconnect@^0.2.9:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/arconnect/-/arconnect-0.2.9.tgz#be07d2281f20d864a91cdcb44e3eed7fccb97f12"
+ integrity sha512-Us49eN/+8l6BrkAPdXnJVPwWlxxUPR7QaBjA0j3OBAcioIFRpwTdoPN9FxtwDGN91lgM6ebOudTXJToRiNizoA==
+ dependencies:
+ arweave "^1.10.13"
+
+arconnect@^0.4.2:
+ version "0.4.2"
+ resolved "https://registry.npmjs.org/arconnect/-/arconnect-0.4.2.tgz#83de7638fb46183e82d7ec7efb5594c5f7cdc806"
+ integrity sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw==
+ dependencies:
+ arweave "^1.10.13"
+
+ardb@^1.1.8:
+ version "1.1.10"
+ resolved "https://registry.yarnpkg.com/ardb/-/ardb-1.1.10.tgz#9f2de81e6ff7613c962e39536f881d58c11b79ff"
+ integrity sha512-LtDa0T6FXiNG9D9kcyboEFfmvVJ9Y+W8404UTQS3BkvgqHHKsgFUuftft3RepAZVvR2bc+z5z+/koqgUe7LIUA==
+ dependencies:
+ arweave "^1.10.15"
+ blockweave "^1.0.17"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+aria-hidden@^1.2.3:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522"
+ integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==
+ dependencies:
+ tslib "^2.0.0"
+
+aria-query@~5.1.3:
+ version "5.1.3"
+ resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e"
+ integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==
+ dependencies:
+ deep-equal "^2.0.5"
+
+arnext-arkb@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/arnext-arkb/-/arnext-arkb-0.0.1.tgz#af1a84a9ba03557ab57c19cda687c4e84c6f5e77"
+ integrity sha512-30YrbF3oIZ8HIhSlBK8mywzfEANIUnQofe++ZvczVJJ0+CzgHK7Bd82jpVNbHTp0OdCEcNFmlP778ZgJZ5Fw9w==
+ dependencies:
+ "@supercharge/promise-pool" "^1.7.0"
+ "@textury/ardb" "^1.1.3"
+ arbundles "^0.6.19"
+ arweave "^1.15.5"
+ arweave-stream-tx "^1.1.0"
+ axios "^0.21.4"
+ blockweave "^1.0.15"
+ clear "^0.1.0"
+ cli-color "^2.0.0"
+ clui "^0.3.6"
+ community-js "^1.1.68"
+ conf "^10.0.2"
+ exponential-backoff "^3.1.0"
+ fast-glob "^3.2.7"
+ figlet "^1.5.2"
+ fuse.js "^6.4.6"
+ inquirer "^8.1.2"
+ mime "^2.5.2"
+ minimist "^1.2.5"
+ normalize-path "^3.0.0"
+ p-retry "^4.6.1"
+ spdx-license-ids "^3.0.10"
+ stream-chunker "^1.2.8"
+ temp-dir "^2.0.0"
+
+arnext@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/arnext/-/arnext-0.1.4.tgz#beb090e1d6c0bbc316ee85546377b1a61d930bea"
+ integrity sha512-7Pe1hf6kIqrmV+krSAlg2DmubO+7bVXcTBqCSgYPpey2V/31bmG21qltd4rOPtoODkRY5RPaP1ongMuHCH1SXA==
+ dependencies:
+ react-router-dom "^6.27.0"
+
+array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f"
+ integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
+ dependencies:
+ call-bind "^1.0.5"
+ is-array-buffer "^3.0.4"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+array-includes@^3.1.6, array-includes@^3.1.8:
+ version "3.1.8"
+ resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d"
+ integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
+ is-string "^1.0.7"
+
+array.prototype.findlast@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904"
+ integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.findlastindex@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d"
+ integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-shim-unscopables "^1.0.2"
+
+array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18"
+ integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.flatmap@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527"
+ integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.tosorted@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc"
+ integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.3"
+ es-errors "^1.3.0"
+ es-shim-unscopables "^1.0.2"
+
+arraybuffer.prototype.slice@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6"
+ integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ es-abstract "^1.22.3"
+ es-errors "^1.2.1"
+ get-intrinsic "^1.2.3"
+ is-array-buffer "^3.0.4"
+ is-shared-array-buffer "^1.0.2"
+
+arweave-multihost@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/arweave-multihost/-/arweave-multihost-0.1.0.tgz#6f5dd1f42638dad8414cb20c0a19fee0a6a59844"
+ integrity sha512-biIkzQ3oc4RLV1MORQnqWz51IazP++K/8SsYMjUokK0cUfBLqom4pufKFCjTkGQIZMWWanXxnZqL66hHPgTCgA==
+ dependencies:
+ arweave "^1.10.15"
+ axios "^0.21.1"
+
+arweave-stream-tx@^1.1.0:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz#2d5c66554301baacd02586a152fbb198b422112f"
+ integrity sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ==
+ dependencies:
+ exponential-backoff "^3.1.0"
+
+arweave@1.11.4:
+ version "1.11.4"
+ resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.11.4.tgz#19e5850d3b9f655cacb0953b36a12ac6596b195c"
+ integrity sha512-EPUms1OMet/VFmYMefgxIpj17PIlIZzIteiHAn0tetN+d/LRV6N9CCsrg/t22hL6yLGdGRHrYlDEdsWqjwSSYg==
+ dependencies:
+ arconnect "^0.4.2"
+ asn1.js "^5.4.1"
+ axios "^0.27.2"
+ base64-js "^1.5.1"
+ bignumber.js "^9.0.2"
+ util "^0.12.4"
+
+arweave@1.14.4:
+ version "1.14.4"
+ resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.14.4.tgz#5ba22136aa0e7fd9495258a3931fb770c9d6bf21"
+ integrity sha512-tmqU9fug8XAmFETYwgUhLaD3WKav5DaM4p1vgJpEj/Px2ORPPMikwnSySlFymmL2qgRh2ZBcZsg11+RXPPGLsA==
+ dependencies:
+ arconnect "^0.4.2"
+ asn1.js "^5.4.1"
+ base64-js "^1.5.1"
+ bignumber.js "^9.0.2"
+
+arweave@^1.10.13, arweave@^1.10.15, arweave@^1.10.16, arweave@^1.11.4, arweave@^1.11.8, arweave@^1.12.2, arweave@^1.13.7, arweave@^1.15.1, arweave@^1.15.5:
+ version "1.15.5"
+ resolved "https://registry.yarnpkg.com/arweave/-/arweave-1.15.5.tgz#d0fb209de01bfc9dc97d5da70270928a83ecee83"
+ integrity sha512-Zj3b8juz1ZtDaQDPQlzWyk2I4wZPx3RmcGq8pVJeZXl2Tjw0WRy5ueHPelxZtBLqCirGoZxZEAFRs6SZUSCBjg==
+ dependencies:
+ arconnect "^0.4.2"
+ asn1.js "^5.4.1"
+ base64-js "^1.5.1"
+ bignumber.js "^9.0.2"
+
+asn1.js@^5.4.1:
+ version "5.4.1"
+ resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1js@^3.0.5:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38"
+ integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==
+ dependencies:
+ pvtsutils "^1.3.2"
+ pvutils "^1.1.3"
+ tslib "^2.4.0"
+
+ast-types-flow@^0.0.8:
+ version "0.0.8"
+ resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz#0a85e1c92695769ac13a428bb653e7538bea27d6"
+ integrity sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==
+
+async-mutex@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.4.1.tgz#bccf55b96f2baf8df90ed798cb5544a1f6ee4c2c"
+ integrity sha512-WfoBo4E/TbCX1G95XTjbWTE3X2XLG0m1Xbv2cwOtuPdyH9CZvnaA5nCt1ucjaKEgW2A5IF71hxrRhr83Je5xjA==
+ dependencies:
+ tslib "^2.4.0"
+
+async-retry@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/async-retry/-/async-retry-1.3.3.tgz#0e7f36c04d8478e7a58bdbed80cedf977785f280"
+ integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==
+ dependencies:
+ retry "0.13.1"
+
+async@^3.2.3, async@^3.2.4:
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce"
+ integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+atomically@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/atomically/-/atomically-1.7.0.tgz#c07a0458432ea6dbc9a3506fffa424b48bccaafe"
+ integrity sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==
+
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+ dependencies:
+ possible-typed-array-names "^1.0.0"
+
+"avsc@https://github.com/Irys-xyz/avsc#csp-fixes":
+ version "5.4.7"
+ resolved "https://github.com/Irys-xyz/avsc#a730cc8018b79e114b6a3381bbb57760a24c6cef"
+
+axe-core@^4.10.0:
+ version "4.10.1"
+ resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.10.1.tgz#7d2589b0183f05b0f23e55c2f4cdf97b5bdc66d9"
+ integrity sha512-qPC9o+kD8Tir0lzNGLeghbOrWMr3ZJpaRlCIb6Uobt/7N4FiEDvqUMnxzCHRHmg8vOg14kr5gVNyScRmbMaJ9g==
+
+axios-retry@^3.7.0:
+ version "3.9.1"
+ resolved "https://registry.npmjs.org/axios-retry/-/axios-retry-3.9.1.tgz#c8924a8781c8e0a2c5244abf773deb7566b3830d"
+ integrity sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w==
+ dependencies:
+ "@babel/runtime" "^7.15.4"
+ is-retry-allowed "^2.2.0"
+
+axios@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f"
+ integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==
+ dependencies:
+ follow-redirects "^1.15.0"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
+axios@^0.21.0, axios@^0.21.1, axios@^0.21.3, axios@^0.21.4:
+ version "0.21.4"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
+ integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
+ dependencies:
+ follow-redirects "^1.14.0"
+
+axios@^0.27.2:
+ version "0.27.2"
+ resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972"
+ integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
+ dependencies:
+ follow-redirects "^1.14.9"
+ form-data "^4.0.0"
+
+axios@^1.4.0, axios@^1.6.0:
+ version "1.7.7"
+ resolved "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f"
+ integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==
+ dependencies:
+ follow-redirects "^1.15.6"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
+axobject-query@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz#28768c76d0e3cff21bc62a9e2d0b6ac30042a1ee"
+ integrity sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==
+
+b4a@^1.0.1:
+ version "1.6.7"
+ resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.7.tgz#a99587d4ebbfbd5a6e3b21bdb5d5fa385767abe4"
+ integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==
+
+babel-plugin-macros@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1"
+ integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==
+ dependencies:
+ "@babel/runtime" "^7.12.5"
+ cosmiconfig "^7.0.0"
+ resolve "^1.19.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2:
+ version "3.0.10"
+ resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75"
+ integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base-x@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a"
+ integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==
+
+base64-js@^1.3.0, base64-js@^1.3.1, base64-js@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base64url@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d"
+ integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==
+
+bech32@1.1.4, bech32@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bech32@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz#078d3686535075c8c79709f054b1b226a133b355"
+ integrity sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==
+
+bfj@^7.0.2:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b"
+ integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==
+ dependencies:
+ bluebird "^3.7.2"
+ check-types "^11.2.3"
+ hoopy "^0.1.4"
+ jsonpath "^1.1.1"
+ tryer "^1.0.1"
+
+big-integer@^1.6.48:
+ version "1.6.52"
+ resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85"
+ integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==
+
+bigint-buffer@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442"
+ integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==
+ dependencies:
+ bindings "^1.3.0"
+
+bignumber.js@9.1.1:
+ version "9.1.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6"
+ integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig==
+
+bignumber.js@9.1.2, bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2, bignumber.js@^9.1.1, bignumber.js@^9.1.2:
+ version "9.1.2"
+ resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c"
+ integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==
+
+bindings@^1.3.0, bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bip32@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/bip32/-/bip32-2.0.6.tgz#6a81d9f98c4cd57d05150c60d8f9e75121635134"
+ integrity sha512-HpV5OMLLGTjSVblmrtYRfFFKuQB+GArM0+XP8HGWfJ5vxYBqo+DesvJwOdC2WJ3bCkZShGf0QIfoIpeomVzVdA==
+ dependencies:
+ "@types/node" "10.12.18"
+ bs58check "^2.1.1"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ tiny-secp256k1 "^1.1.3"
+ typeforce "^1.11.5"
+ wif "^2.0.6"
+
+bip39@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz#c55a418deaf48826a6ceb34ac55b3ee1577e18a3"
+ integrity sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==
+ dependencies:
+ "@noble/hashes" "^1.2.0"
+
+bip66@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22"
+ integrity sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+bl@^4.0.3, bl@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
+blake-hash@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/blake-hash/-/blake-hash-2.0.0.tgz#af184dce641951126d05b7d1c3de3224f538d66e"
+ integrity sha512-Igj8YowDu1PRkRsxZA7NVkdFNxH5rKv5cpLxQ0CVXSIA77pVYwCPRQJ2sMew/oneUpfuYRyjG6r8SmmmnbZb1w==
+ dependencies:
+ node-addon-api "^3.0.0"
+ node-gyp-build "^4.2.2"
+ readable-stream "^3.6.0"
+
+blake2b-wasm@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be"
+ integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==
+ dependencies:
+ b4a "^1.0.1"
+ nanoassert "^2.0.0"
+
+blake2b@^2.1.3:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/blake2b/-/blake2b-2.1.4.tgz#817d278526ddb4cd673bfb1af16d1ad61e393ba3"
+ integrity sha512-AyBuuJNI64gIvwx13qiICz6H6hpmjvYS5DGkG6jbXMOT8Z3WUJ3V1X0FlhIoT1b/5JtHE3ki+xjtMvu1nn+t9A==
+ dependencies:
+ blake2b-wasm "^2.4.0"
+ nanoassert "^2.0.0"
+
+blakejs@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814"
+ integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==
+
+blob-polyfill@^7.0.20220408:
+ version "7.0.20220408"
+ resolved "https://registry.yarnpkg.com/blob-polyfill/-/blob-polyfill-7.0.20220408.tgz#38bf5e046c41a21bb13654d9d19f303233b8218c"
+ integrity sha512-oD8Ydw+5lNoqq+en24iuPt1QixdPpe/nUF8azTHnviCZYu9zUC+TwdzIp5orpblJosNlgNbVmmAb//c6d6ImUQ==
+
+blockweave@^1.0.15, blockweave@^1.0.17:
+ version "1.0.18"
+ resolved "https://registry.yarnpkg.com/blockweave/-/blockweave-1.0.18.tgz#d1007a85adc234d6ab2a4c8c5f36c6032d2bd23d"
+ integrity sha512-EEv7phLUTXkHIHdBFjMgqYTzKtRX0jASC974G64oe9CgYHkiSXUCjtbngzcpRroivErD+Y7+WCc2Vggtqklq/w==
+ dependencies:
+ arconnect "^0.2.9"
+ axios "^0.21.4"
+ bignumber.js "^9.0.1"
+ redstone-smartweave "^0.3.10-alpha.3"
+ util "^0.12.4"
+
+bluebird@^3.7.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bn.js@4.11.8:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+ integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
+
+bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9:
+ version "4.12.0"
+ resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70"
+ integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
+
+body-parser@1.20.3, body-parser@^1.20.3:
+ version "1.20.3"
+ resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
+ integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.5"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.13.0"
+ raw-body "2.5.2"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+borsh@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a"
+ integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==
+ dependencies:
+ bn.js "^5.2.0"
+ bs58 "^4.0.0"
+ text-encoding-utf-8 "^1.0.2"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+ integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
+
+browser-level@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011"
+ integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==
+ dependencies:
+ abstract-level "^1.0.2"
+ catering "^2.1.1"
+ module-error "^1.0.2"
+ run-parallel-limit "^1.1.0"
+
+browserify-aes@^1.0.6, browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+bs58@^4.0.0, bs58@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a"
+ integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==
+ dependencies:
+ base-x "^3.0.2"
+
+bs58@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279"
+ integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==
+ dependencies:
+ base-x "^4.0.0"
+
+bs58check@<3.0.0, bs58check@^2.1.1, bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+bson@^4.5.0:
+ version "4.7.2"
+ resolved "https://registry.yarnpkg.com/bson/-/bson-4.7.2.tgz#320f4ad0eaf5312dd9b45dc369cc48945e2a5f2e"
+ integrity sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==
+ dependencies:
+ buffer "^5.6.0"
+
+buffer-alloc-unsafe@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+ integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+ integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+ dependencies:
+ buffer-alloc-unsafe "^1.1.0"
+ buffer-fill "^1.0.0"
+
+buffer-crc32@^0.2.1, buffer-crc32@^0.2.13:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer-fill@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+ integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==
+
+buffer-from@^1.0.0, buffer-from@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer-pipe@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-pipe/-/buffer-pipe-0.0.0.tgz#186ec257d696e8e74c3051160a0e9e9a9811a387"
+ integrity sha512-PvKbsvQOH4dcUyUEvQQSs3CIkkuPcOHt3gKnXwf4HsPKFDxSN7bkmICVIWgOmW/jx/fAEGGn4mIayIJPLs7G8g==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+buffer-pipe@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-pipe/-/buffer-pipe-0.0.3.tgz#242197681d4591e7feda213336af6c07a5ce2409"
+ integrity sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA==
+ dependencies:
+ safe-buffer "^5.1.2"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
+
+buffer@6.0.3, buffer@^6.0.2, buffer@^6.0.3, buffer@~6.0.3:
+ version "6.0.3"
+ resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
+ integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.2.1"
+
+buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bufferutil@^4.0.1, bufferutil@^4.0.6:
+ version "4.0.8"
+ resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea"
+ integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==
+ dependencies:
+ node-gyp-build "^4.3.0"
+
+busboy@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893"
+ integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==
+ dependencies:
+ streamsearch "^1.1.0"
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+caniuse-lite@^1.0.30001579:
+ version "1.0.30001669"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz#fda8f1d29a8bfdc42de0c170d7f34a9cf19ed7a3"
+ integrity sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==
+
+cardinal@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505"
+ integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==
+ dependencies:
+ ansicolors "~0.3.2"
+ redeyed "~2.1.0"
+
+catering@^2.1.0, catering@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510"
+ integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==
+
+cbor-extract@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/cbor-extract/-/cbor-extract-2.2.0.tgz#cee78e630cbeae3918d1e2e58e0cebaf3a3be840"
+ integrity sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==
+ dependencies:
+ node-gyp-build-optional-packages "5.1.1"
+ optionalDependencies:
+ "@cbor-extract/cbor-extract-darwin-arm64" "2.2.0"
+ "@cbor-extract/cbor-extract-darwin-x64" "2.2.0"
+ "@cbor-extract/cbor-extract-linux-arm" "2.2.0"
+ "@cbor-extract/cbor-extract-linux-arm64" "2.2.0"
+ "@cbor-extract/cbor-extract-linux-x64" "2.2.0"
+ "@cbor-extract/cbor-extract-win32-x64" "2.2.0"
+
+cbor-x@^1.4.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.6.0.tgz#89c35d2d805efc30e09a28349425cc05d57aacd7"
+ integrity sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==
+ optionalDependencies:
+ cbor-extract "^2.2.0"
+
+chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+character-entities-legacy@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+ integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
+
+character-entities@^1.0.0:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+ integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
+
+character-reference-invalid@^1.0.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+ integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+
+chardet@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+ integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
+charenc@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
+ integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
+
+check-types@^11.2.3:
+ version "11.2.3"
+ resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71"
+ integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==
+
+cheerio-select@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4"
+ integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==
+ dependencies:
+ boolbase "^1.0.0"
+ css-select "^5.1.0"
+ css-what "^6.1.0"
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+ domutils "^3.0.1"
+
+cheerio@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz#1ede4895a82f26e8af71009f961a9b8cb60d6a81"
+ integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==
+ dependencies:
+ cheerio-select "^2.1.0"
+ dom-serializer "^2.0.0"
+ domhandler "^5.0.3"
+ domutils "^3.1.0"
+ encoding-sniffer "^0.2.0"
+ htmlparser2 "^9.1.0"
+ parse5 "^7.1.2"
+ parse5-htmlparser2-tree-adapter "^7.0.0"
+ parse5-parser-stream "^7.1.2"
+ undici "^6.19.5"
+ whatwg-mimetype "^4.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+circom_runtime@0.1.28:
+ version "0.1.28"
+ resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.28.tgz#4ea4606956eeac4499f71f65354f45b54faa93fe"
+ integrity sha512-ACagpQ7zBRLKDl5xRZ4KpmYIcZDUjOiNRuxvXLqhnnlLSVY1Dbvh73TI853nqoR0oEbihtWmMSjgc5f+pXf/jQ==
+ dependencies:
+ ffjavascript "0.3.1"
+
+classic-level@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.4.1.tgz#169ecf9f9c6200ad42a98c8576af449c1badbaee"
+ integrity sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==
+ dependencies:
+ abstract-level "^1.0.2"
+ catering "^2.1.0"
+ module-error "^1.0.1"
+ napi-macros "^2.2.2"
+ node-gyp-build "^4.3.0"
+
+clear@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/clear/-/clear-0.1.0.tgz#b81b1e03437a716984fd7ac97c87d73bdfe7048a"
+ integrity sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==
+
+cli-color@0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-0.3.2.tgz#75fa5f728c308cc4ac594b05e06cc5d80daccd86"
+ integrity sha512-Ys/nDhHNRcxrS4EUI2RS/QCUE+61AMuEOj3sWDX+EIHkJWj+4XkRbOdwdxJteAJKjXYBbeFJMtfaEPd1MBF9pQ==
+ dependencies:
+ d "~0.1.1"
+ es5-ext "~0.10.2"
+ memoizee "0.3.x"
+ timers-ext "0.1.x"
+
+cli-color@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.4.tgz#d658080290968816b322248b7306fad2346fb2c8"
+ integrity sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==
+ dependencies:
+ d "^1.0.1"
+ es5-ext "^0.10.64"
+ es6-iterator "^2.0.3"
+ memoizee "^0.4.15"
+ timers-ext "^0.1.7"
+
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-spinners@^2.5.0:
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41"
+ integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==
+
+cli-width@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
+ integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
+
+client-only@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1"
+ integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+ integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
+
+clui@^0.3.6:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/clui/-/clui-0.3.6.tgz#8e1e5cea7332a6e54083f59da0ccbe1d6f2fa787"
+ integrity sha512-Z4UbgZILlIAjkEkZiDOa2aoYjohKx7fa6DxIh6cE9A6WNWZ61iXfQc6CmdC9SKdS5nO0P0UyQ+WfoXfB65e3HQ==
+ dependencies:
+ cli-color "0.3.2"
+
+color-convert@^1.9.0, color-convert@^1.9.3:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@^1.0.0, color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+color-string@^1.6.0:
+ version "1.9.1"
+ resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4"
+ integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color2k@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/color2k/-/color2k-2.0.3.tgz#a771244f6b6285541c82aa65ff0a0c624046e533"
+ integrity sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==
+
+color@^3.1.3:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164"
+ integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==
+ dependencies:
+ color-convert "^1.9.3"
+ color-string "^1.6.0"
+
+colorspace@1.1.x:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz#8d442d1186152f60453bf8070cd66eb364e59243"
+ integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==
+ dependencies:
+ color "^3.1.3"
+ text-hex "1.0.x"
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+comma-separated-tokens@^1.0.0:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea"
+ integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==
+
+commander@^12.1.0:
+ version "12.1.0"
+ resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3"
+ integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==
+
+commander@^2.20.3:
+ version "2.20.3"
+ resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+community-js@^1.1.68:
+ version "1.1.78"
+ resolved "https://registry.yarnpkg.com/community-js/-/community-js-1.1.78.tgz#b772441ad217fdce1dc65daf18c6cdc9d101a928"
+ integrity sha512-15uEKsng+5EBczufWH/RqK5PKmnUUik3Az/GuINV9U6CtQkEIdOKhKQ9m47BIMOmKALueRO17SmY8frWO/gOhQ==
+ dependencies:
+ ardb "^1.1.8"
+ arweave "1.11.4"
+ node-fetch "2"
+ util "^0.12.4"
+ warp-contracts "^1.1.7"
+
+compress-commons@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-4.1.2.tgz#6542e59cb63e1f46a8b21b0e06f9a32e4c8b06df"
+ integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==
+ dependencies:
+ buffer-crc32 "^0.2.13"
+ crc32-stream "^4.0.2"
+ normalize-path "^3.0.0"
+ readable-stream "^3.6.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+conf@^10.0.2:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/conf/-/conf-10.2.0.tgz#838e757be963f1a2386dfe048a98f8f69f7b55d6"
+ integrity sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==
+ dependencies:
+ ajv "^8.6.3"
+ ajv-formats "^2.1.1"
+ atomically "^1.7.0"
+ debounce-fn "^4.0.0"
+ dot-prop "^6.0.1"
+ env-paths "^2.2.1"
+ json-schema-typed "^7.0.3"
+ onetime "^5.1.2"
+ pkg-up "^3.1.0"
+ semver "^7.3.5"
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4, content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+convert-source-map@^1.5.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9"
+ integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
+
+copy-to-clipboard@3.3.3, copy-to-clipboard@^3.3.1:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz#55ac43a1db8ae639a4bd99511c148cdd1b83a1b0"
+ integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==
+ dependencies:
+ toggle-selection "^1.0.6"
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cors@^2.8.5:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+cosmiconfig@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6"
+ integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==
+ dependencies:
+ "@types/parse-json" "^4.0.0"
+ import-fresh "^3.2.1"
+ parse-json "^5.0.0"
+ path-type "^4.0.0"
+ yaml "^1.10.0"
+
+cosmjs-types@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz#c3bc482d28c7dfa25d1445093fdb2d9da1f6cfcc"
+ integrity sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==
+
+crc-32@^1.2.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+ integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+crc32-stream@^4.0.2:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-4.0.3.tgz#85dd677eb78fa7cad1ba17cc506a597d41fc6f33"
+ integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==
+ dependencies:
+ crc-32 "^1.2.0"
+ readable-stream "^3.4.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+create-react-class@^15.5.3:
+ version "15.7.0"
+ resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.7.0.tgz#7499d7ca2e69bb51d13faf59bd04f0c65a1d6c1e"
+ integrity sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==
+ dependencies:
+ loose-envify "^1.3.1"
+ object-assign "^4.1.1"
+
+cross-blob@^3.0.1:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/cross-blob/-/cross-blob-3.0.2.tgz#66b4b7b5757be6cc9c0afa2b45c4782be0497248"
+ integrity sha512-u+7xq68MAjIqvoEKrdgIEupKJNBeU8MSl/cpfPmJ3rm9yvxrgbMPr8TkZS9qnwCgiVC8BsEt9kDkeD7He2zmNA==
+ dependencies:
+ blob-polyfill "^7.0.20220408"
+ fetch-blob "^3.2.0"
+
+cross-env@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
+ integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
+ dependencies:
+ cross-spawn "^7.0.1"
+
+cross-fetch@^3.1.4, cross-fetch@^3.1.5:
+ version "3.1.8"
+ resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82"
+ integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==
+ dependencies:
+ node-fetch "^2.6.12"
+
+cross-fetch@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-4.0.0.tgz#f037aef1580bb3a1a35164ea2a848ba81b445983"
+ integrity sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==
+ dependencies:
+ node-fetch "^2.6.12"
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2:
+ version "7.0.3"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+crypt@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
+ integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
+
+css-select@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
+ integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^6.1.0"
+ domhandler "^5.0.2"
+ domutils "^3.0.1"
+ nth-check "^2.0.1"
+
+css-what@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
+ integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+
+csstype@^3.0.2, csstype@^3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+d@1, d@^1.0.1, d@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de"
+ integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==
+ dependencies:
+ es5-ext "^0.10.64"
+ type "^2.7.2"
+
+d@~0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309"
+ integrity sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==
+ dependencies:
+ es5-ext "~0.10.2"
+
+damerau-levenshtein@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
+ integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==
+
+data-uri-to-buffer@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e"
+ integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==
+
+data-view-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2"
+ integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2"
+ integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-offset@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a"
+ integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+debounce-fn@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/debounce-fn/-/debounce-fn-4.0.0.tgz#ed76d206d8a50e60de0dd66d494d82835ffe61c7"
+ integrity sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==
+ dependencies:
+ mimic-fn "^3.0.0"
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6:
+ version "4.3.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
+ dependencies:
+ ms "^2.1.3"
+
+debug@^4.3.7:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
+ integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
+ dependencies:
+ ms "^2.1.3"
+
+decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
+
+decode-uri-component@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
+ integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
+
+deep-equal@^2.0.5:
+ version "2.2.3"
+ resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1"
+ integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ call-bind "^1.0.5"
+ es-get-iterator "^1.1.3"
+ get-intrinsic "^1.2.2"
+ is-arguments "^1.1.1"
+ is-array-buffer "^3.0.2"
+ is-date-object "^1.0.5"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ isarray "^2.0.5"
+ object-is "^1.1.5"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.5.1"
+ side-channel "^1.0.4"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.1"
+ which-typed-array "^1.1.13"
+
+deep-is@^0.1.3, deep-is@~0.1.3:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+defaults@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a"
+ integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==
+ dependencies:
+ clone "^1.0.2"
+
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+delay@^4.4.0:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/delay/-/delay-4.4.1.tgz#6e02d02946a1b6ab98b39262ced965acba2ac4d1"
+ integrity sha512-aL3AhqtfhOlT/3ai6sWXeqwnw63ATNpnUiN4HL7x9q+My5QtHlO3OIkasmug9LKzpheLdmUKGRKnYXYAS7FQkQ==
+
+delay@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d"
+ integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-browser@5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.2.0.tgz#c9cd5afa96a6a19fda0bbe9e9be48a6b6e1e9c97"
+ integrity sha512-tr7XntDAu50BVENgQfajMLzacmSe34D+qZc4zjnniz0ZVuw/TZcLcyxHQjYpJTM36sGEkZZlYLnIM1hH7alTMA==
+
+detect-libc@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
+ integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==
+
+detect-node-es@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493"
+ integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==
+
+dijkstrajs@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.3.tgz#4c8dbdea1f0f6478bff94d9c49c784d623e4fc23"
+ integrity sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-serializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
+ integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
+ dependencies:
+ domelementtype "^2.3.0"
+ domhandler "^5.0.2"
+ entities "^4.2.0"
+
+domelementtype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+ integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domhandler@^5.0.2, domhandler@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
+ integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
+ dependencies:
+ domelementtype "^2.3.0"
+
+domutils@^3.0.1, domutils@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e"
+ integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==
+ dependencies:
+ dom-serializer "^2.0.0"
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+
+dot-prop@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083"
+ integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==
+ dependencies:
+ is-obj "^2.0.0"
+
+drbg.js@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b"
+ integrity sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==
+ dependencies:
+ browserify-aes "^1.0.6"
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+
+eastasianwidth@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+ integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
+eccrypto@1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/eccrypto/-/eccrypto-1.1.6.tgz#846bd1222323036f7a3515613704386399702bd3"
+ integrity sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==
+ dependencies:
+ acorn "7.1.1"
+ elliptic "6.5.4"
+ es6-promise "4.2.8"
+ nan "2.14.0"
+ optionalDependencies:
+ secp256k1 "3.7.1"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+eip1193-provider@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/eip1193-provider/-/eip1193-provider-1.0.1.tgz#420d29cf4f6c443e3f32e718fb16fafb250637c3"
+ integrity sha512-kSuqwQ26d7CzuS/t3yRXo2Su2cVH0QfvyKbr2H7Be7O5YDyIq4hQGCNTo5wRdP07bt+E2R/8nPCzey4ojBHf7g==
+ dependencies:
+ "@json-rpc-tools/provider" "^1.5.5"
+
+ejs@^3.1.6:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b"
+ integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==
+ dependencies:
+ jake "^10.8.5"
+
+elliptic@6.5.4:
+ version "6.5.4"
+ resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+elliptic@^6.4.0, elliptic@^6.5.4, elliptic@^6.5.7:
+ version "6.5.7"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.7.tgz#8ec4da2cb2939926a1b9a73619d768207e647c8b"
+ integrity sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+elliptic@^6.4.1, elliptic@^6.5.2:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.0.tgz#5919ec723286c1edf28685aa89261d4761afa210"
+ integrity sha512-dpwoQcLc/2WLQvJvLRHKZ+f9FgOdjnq11rurqwekGQygGPsYSK29OMMD2WalatiqQ+XGFDglTNixpPfI+lpaAA==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+ version "9.2.2"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+enabled@2.0.x:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2"
+ integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+encodeurl@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+ integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
+encoding-sniffer@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz#799569d66d443babe82af18c9f403498365ef1d5"
+ integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==
+ dependencies:
+ iconv-lite "^0.6.3"
+ whatwg-encoding "^3.1.1"
+
+end-of-stream@^1.4.1:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+ integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^5.15.0:
+ version "5.17.1"
+ resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz#67bfbbcc2f81d511be77d686a90267ef7f898a15"
+ integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
+
+entities@^4.2.0, entities@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+env-paths@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
+ integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3:
+ version "1.23.3"
+ resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
+ integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ arraybuffer.prototype.slice "^1.0.3"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ data-view-buffer "^1.0.1"
+ data-view-byte-length "^1.0.1"
+ data-view-byte-offset "^1.0.0"
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-set-tostringtag "^2.0.3"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.6"
+ get-intrinsic "^1.2.4"
+ get-symbol-description "^1.0.2"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.0.3"
+ has-symbols "^1.0.3"
+ hasown "^2.0.2"
+ internal-slot "^1.0.7"
+ is-array-buffer "^3.0.4"
+ is-callable "^1.2.7"
+ is-data-view "^1.0.1"
+ is-negative-zero "^2.0.3"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.3"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.13"
+ is-weakref "^1.0.2"
+ object-inspect "^1.13.1"
+ object-keys "^1.1.1"
+ object.assign "^4.1.5"
+ regexp.prototype.flags "^1.5.2"
+ safe-array-concat "^1.1.2"
+ safe-regex-test "^1.0.3"
+ string.prototype.trim "^1.2.9"
+ string.prototype.trimend "^1.0.8"
+ string.prototype.trimstart "^1.0.8"
+ typed-array-buffer "^1.0.2"
+ typed-array-byte-length "^1.0.1"
+ typed-array-byte-offset "^1.0.2"
+ typed-array-length "^1.0.6"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.15"
+
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+
+es-errors@^1.2.1, es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-get-iterator@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6"
+ integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ has-symbols "^1.0.3"
+ is-arguments "^1.1.1"
+ is-map "^2.0.2"
+ is-set "^2.0.2"
+ is-string "^1.0.7"
+ isarray "^2.0.5"
+ stop-iteration-iterator "^1.0.0"
+
+es-iterator-helpers@^1.0.19:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6"
+ integrity sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.3"
+ es-errors "^1.3.0"
+ es-set-tostringtag "^2.0.3"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ globalthis "^1.0.4"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.0.3"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.7"
+ iterator.prototype "^1.1.3"
+ safe-array-concat "^1.1.2"
+
+es-object-atoms@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941"
+ integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777"
+ integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.1"
+
+es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
+ integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
+ dependencies:
+ hasown "^2.0.0"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.11, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.5, es5-ext@~0.10.6:
+ version "0.10.64"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714"
+ integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==
+ dependencies:
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.3"
+ esniff "^2.0.1"
+ next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-iterator@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-0.1.3.tgz#d6f58b8c4fc413c249b4baa19768f8e4d7c8944e"
+ integrity sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==
+ dependencies:
+ d "~0.1.1"
+ es5-ext "~0.10.5"
+ es6-symbol "~2.0.1"
+
+es6-promise@4.2.8, es6-promise@^4.0.3:
+ version "4.2.8"
+ resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+es6-promisify@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+ integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==
+ dependencies:
+ es6-promise "^4.0.3"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c"
+ integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==
+ dependencies:
+ d "^1.0.2"
+ ext "^1.7.0"
+
+es6-symbol@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-2.0.1.tgz#761b5c67cfd4f1d18afb234f691d678682cb3bf3"
+ integrity sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==
+ dependencies:
+ d "~0.1.1"
+ es5-ext "~0.10.5"
+
+es6-weak-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53"
+ integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.46"
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.1"
+
+es6-weak-map@~0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz#706cef9e99aa236ba7766c239c8b9e286ea7d228"
+ integrity sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==
+ dependencies:
+ d "~0.1.1"
+ es5-ext "~0.10.6"
+ es6-iterator "~0.1.3"
+ es6-symbol "~2.0.1"
+
+escalade@^3.1.1:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escodegen@^1.8.1:
+ version "1.14.3"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
+ integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+eslint-config-next@14.2.13:
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.13.tgz#9e3e3b86e8929f05837a6e9f2aee4f93cd6a1056"
+ integrity sha512-aro1EKAoyYchnO/3Tlo91hnNBO7QO7qnv/79MAFC+4Jq8TdUVKQlht5d2F+YjrePjdpOvfL+mV9JPfyYNwkk1g==
+ dependencies:
+ "@next/eslint-plugin-next" "14.2.13"
+ "@rushstack/eslint-patch" "^1.3.3"
+ "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ eslint-import-resolver-node "^0.3.6"
+ eslint-import-resolver-typescript "^3.5.2"
+ eslint-plugin-import "^2.28.1"
+ eslint-plugin-jsx-a11y "^6.7.1"
+ eslint-plugin-react "^7.33.2"
+ eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705"
+
+eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9:
+ version "0.3.9"
+ resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac"
+ integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==
+ dependencies:
+ debug "^3.2.7"
+ is-core-module "^2.13.0"
+ resolve "^1.22.4"
+
+eslint-import-resolver-typescript@^3.5.2:
+ version "3.6.3"
+ resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz#bb8e388f6afc0f940ce5d2c5fd4a3d147f038d9e"
+ integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==
+ dependencies:
+ "@nolyfill/is-core-module" "1.0.39"
+ debug "^4.3.5"
+ enhanced-resolve "^5.15.0"
+ eslint-module-utils "^2.8.1"
+ fast-glob "^3.3.2"
+ get-tsconfig "^4.7.5"
+ is-bun-module "^1.0.2"
+ is-glob "^4.0.3"
+
+eslint-module-utils@^2.12.0, eslint-module-utils@^2.8.1:
+ version "2.12.0"
+ resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz#fe4cfb948d61f49203d7b08871982b65b9af0b0b"
+ integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==
+ dependencies:
+ debug "^3.2.7"
+
+eslint-plugin-import@^2.28.1:
+ version "2.31.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7"
+ integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==
+ dependencies:
+ "@rtsao/scc" "^1.1.0"
+ array-includes "^3.1.8"
+ array.prototype.findlastindex "^1.2.5"
+ array.prototype.flat "^1.3.2"
+ array.prototype.flatmap "^1.3.2"
+ debug "^3.2.7"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.9"
+ eslint-module-utils "^2.12.0"
+ hasown "^2.0.2"
+ is-core-module "^2.15.1"
+ is-glob "^4.0.3"
+ minimatch "^3.1.2"
+ object.fromentries "^2.0.8"
+ object.groupby "^1.0.3"
+ object.values "^1.2.0"
+ semver "^6.3.1"
+ string.prototype.trimend "^1.0.8"
+ tsconfig-paths "^3.15.0"
+
+eslint-plugin-jsx-a11y@^6.7.1:
+ version "6.10.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.0.tgz#36fb9dead91cafd085ddbe3829602fb10ef28339"
+ integrity sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==
+ dependencies:
+ aria-query "~5.1.3"
+ array-includes "^3.1.8"
+ array.prototype.flatmap "^1.3.2"
+ ast-types-flow "^0.0.8"
+ axe-core "^4.10.0"
+ axobject-query "^4.1.0"
+ damerau-levenshtein "^1.0.8"
+ emoji-regex "^9.2.2"
+ es-iterator-helpers "^1.0.19"
+ hasown "^2.0.2"
+ jsx-ast-utils "^3.3.5"
+ language-tags "^1.0.9"
+ minimatch "^3.1.2"
+ object.fromentries "^2.0.8"
+ safe-regex-test "^1.0.3"
+ string.prototype.includes "^2.0.0"
+
+"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705":
+ version "5.0.0-canary-7118f5dd7-20230705"
+ resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz#4d55c50e186f1a2b0636433d2b0b2f592ddbccfd"
+ integrity sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw==
+
+eslint-plugin-react@^7.33.2:
+ version "7.37.1"
+ resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd"
+ integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==
+ dependencies:
+ array-includes "^3.1.8"
+ array.prototype.findlast "^1.2.5"
+ array.prototype.flatmap "^1.3.2"
+ array.prototype.tosorted "^1.1.4"
+ doctrine "^2.1.0"
+ es-iterator-helpers "^1.0.19"
+ estraverse "^5.3.0"
+ hasown "^2.0.2"
+ jsx-ast-utils "^2.4.1 || ^3.0.0"
+ minimatch "^3.1.2"
+ object.entries "^1.1.8"
+ object.fromentries "^2.0.8"
+ object.values "^1.2.0"
+ prop-types "^15.8.1"
+ resolve "^2.0.0-next.5"
+ semver "^6.3.1"
+ string.prototype.matchall "^4.0.11"
+ string.prototype.repeat "^1.0.0"
+
+eslint-scope@^7.2.2:
+ version "7.2.2"
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
+ integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint@8.57.1:
+ version "8.57.1"
+ resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9"
+ integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.6.1"
+ "@eslint/eslintrc" "^2.1.4"
+ "@eslint/js" "8.57.1"
+ "@humanwhocodes/config-array" "^0.13.0"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
+ "@ungap/structured-clone" "^1.2.0"
+ ajv "^6.12.4"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ doctrine "^3.0.0"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.2.2"
+ eslint-visitor-keys "^3.4.3"
+ espree "^9.6.1"
+ esquery "^1.4.2"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ globals "^13.19.0"
+ graphemer "^1.4.0"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ is-path-inside "^3.0.3"
+ js-yaml "^4.1.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.3"
+ strip-ansi "^6.0.1"
+ text-table "^0.2.0"
+
+esniff@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308"
+ integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==
+ dependencies:
+ d "^1.0.1"
+ es5-ext "^0.10.62"
+ event-emitter "^0.3.5"
+ type "^2.7.2"
+
+espree@^9.6.0, espree@^9.6.1:
+ version "9.6.1"
+ resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
+ integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+ dependencies:
+ acorn "^8.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
+
+esprima@1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b"
+ integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==
+
+esprima@^4.0.1, esprima@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.4.2:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7"
+ integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+eth-crypto@^2.3.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/eth-crypto/-/eth-crypto-2.6.0.tgz#b777f367ae8c70e5917b3b7d52adab6b34841e29"
+ integrity sha512-GCX4ffFYRUGgnuWR5qxcZIRQJ1KEqPFiyXU9yVy7s6dtXIMlUXZQ2h+5ID6rFaOHWbpJbjfkC6YdhwtwRYCnug==
+ dependencies:
+ "@babel/runtime" "7.20.13"
+ "@ethereumjs/tx" "3.5.2"
+ "@types/bn.js" "5.1.1"
+ eccrypto "1.1.6"
+ ethereumjs-util "7.1.5"
+ ethers "5.7.2"
+ secp256k1 "5.0.0"
+
+ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-util@7.1.5, ethereumjs-util@^7.1.5:
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181"
+ integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.2.4"
+
+ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethers@5.7.2, ethers@^5.5.1:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e"
+ integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==
+ dependencies:
+ "@ethersproject/abi" "5.7.0"
+ "@ethersproject/abstract-provider" "5.7.0"
+ "@ethersproject/abstract-signer" "5.7.0"
+ "@ethersproject/address" "5.7.0"
+ "@ethersproject/base64" "5.7.0"
+ "@ethersproject/basex" "5.7.0"
+ "@ethersproject/bignumber" "5.7.0"
+ "@ethersproject/bytes" "5.7.0"
+ "@ethersproject/constants" "5.7.0"
+ "@ethersproject/contracts" "5.7.0"
+ "@ethersproject/hash" "5.7.0"
+ "@ethersproject/hdnode" "5.7.0"
+ "@ethersproject/json-wallets" "5.7.0"
+ "@ethersproject/keccak256" "5.7.0"
+ "@ethersproject/logger" "5.7.0"
+ "@ethersproject/networks" "5.7.1"
+ "@ethersproject/pbkdf2" "5.7.0"
+ "@ethersproject/properties" "5.7.0"
+ "@ethersproject/providers" "5.7.2"
+ "@ethersproject/random" "5.7.0"
+ "@ethersproject/rlp" "5.7.0"
+ "@ethersproject/sha2" "5.7.0"
+ "@ethersproject/signing-key" "5.7.0"
+ "@ethersproject/solidity" "5.7.0"
+ "@ethersproject/strings" "5.7.0"
+ "@ethersproject/transactions" "5.7.0"
+ "@ethersproject/units" "5.7.0"
+ "@ethersproject/wallet" "5.7.0"
+ "@ethersproject/web" "5.7.1"
+ "@ethersproject/wordlists" "5.7.0"
+
+ethers@^6.12.0, ethers@^6.13.4:
+ version "6.13.4"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.13.4.tgz#bd3e1c3dc1e7dc8ce10f9ffb4ee40967a651b53c"
+ integrity sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==
+ dependencies:
+ "@adraffy/ens-normalize" "1.10.1"
+ "@noble/curves" "1.2.0"
+ "@noble/hashes" "1.3.2"
+ "@types/node" "22.7.5"
+ aes-js "4.0.0-beta.5"
+ tslib "2.7.0"
+ ws "8.17.1"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-emitter@^0.3.5, event-emitter@~0.3.4:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+eventemitter3@4.0.7, eventemitter3@^4.0.0, eventemitter3@^4.0.7:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f"
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+eventemitter3@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4"
+ integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==
+
+events@3.3.0, events@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exponential-backoff@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6"
+ integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==
+
+express@^4.21.0:
+ version "4.21.1"
+ resolved "https://registry.npmjs.org/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281"
+ integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.3"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.7.1"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.3.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.3"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.10"
+ proxy-addr "~2.0.7"
+ qs "6.13.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.19.0"
+ serve-static "1.16.2"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+express@^4.21.2:
+ version "4.21.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32"
+ integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.3"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.7.1"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.3.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.3"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.12"
+ proxy-addr "~2.0.7"
+ qs "6.13.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.19.0"
+ serve-static "1.16.2"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+ext@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
+ integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+ dependencies:
+ type "^2.7.2"
+
+external-editor@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
+ integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
+ dependencies:
+ chardet "^0.7.0"
+ iconv-lite "^0.4.24"
+ tmp "^0.0.33"
+
+eyes@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
+ integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==
+
+fast-copy@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/fast-copy/-/fast-copy-3.0.2.tgz#59c68f59ccbcac82050ba992e0d5c389097c9d35"
+ integrity sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.2.7, fast-glob@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
+ integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
+ 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.4"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fast-stable-stringify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313"
+ integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==
+
+fast-uri@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.3.tgz#892a1c91802d5d7860de728f18608a0573142241"
+ integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==
+
+fastfile@0.0.20:
+ version "0.0.20"
+ resolved "https://registry.yarnpkg.com/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879"
+ integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==
+
+fastq@^1.6.0:
+ version "1.17.1"
+ resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47"
+ integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==
+ dependencies:
+ reusify "^1.0.4"
+
+fault@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13"
+ integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==
+ dependencies:
+ format "^0.2.0"
+
+fecha@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd"
+ integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==
+
+fetch-blob@^3.1.2, fetch-blob@^3.1.4, fetch-blob@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9"
+ integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==
+ dependencies:
+ node-domexception "^1.0.0"
+ web-streams-polyfill "^3.0.3"
+
+fetch-cookie@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-3.0.1.tgz#6a77f7495e1a639ae019db916a234db8c85d5963"
+ integrity sha512-ZGXe8Y5Z/1FWqQ9q/CrJhkUD73DyBU9VF0hBQmEO/wPHe4A9PKTjplFDLeFX8aOsYypZUcX5Ji/eByn3VCVO3Q==
+ dependencies:
+ set-cookie-parser "^2.4.8"
+ tough-cookie "^4.0.0"
+
+ffjavascript@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.0.tgz#442cd8fbb1ee4cbb1be9d26fd7b2951a1ea45d6a"
+ integrity sha512-l7sR5kmU3gRwDy8g0Z2tYBXy5ttmafRPFOqY7S6af5cq51JqJWt5eQ/lSR/rs2wQNbDYaYlQr5O+OSUf/oMLoQ==
+ dependencies:
+ wasmbuilder "0.0.16"
+ wasmcurves "0.2.2"
+ web-worker "1.2.0"
+
+ffjavascript@0.3.1, ffjavascript@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.3.1.tgz#3761bbb3f4a67b58a94a463080272bf6b5877b03"
+ integrity sha512-4PbK1WYodQtuF47D4pRI5KUg3Q392vuP5WjE1THSnceHdXwU3ijaoS0OqxTzLknCtz4Z2TtABzkBdBdMn3B/Aw==
+ dependencies:
+ wasmbuilder "0.0.16"
+ wasmcurves "0.2.2"
+ web-worker "1.2.0"
+
+ffjavascript@^0.2.45:
+ version "0.2.63"
+ resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.63.tgz#0c1216a1f123dc9181df69e144473704d2f115eb"
+ integrity sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A==
+ dependencies:
+ wasmbuilder "0.0.16"
+ wasmcurves "0.2.2"
+ web-worker "1.2.0"
+
+figlet@^1.5.2:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.8.0.tgz#1b93c4f65f4c1a3b1135221987eee8cf8b9c0ac7"
+ integrity sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==
+
+figures@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
+ integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+filelist@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
+ integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
+ dependencies:
+ minimatch "^5.0.1"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019"
+ integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.0.0"
+
+find-root@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+ integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.3"
+ rimraf "^3.0.2"
+
+flatted@^3.2.9:
+ version "3.3.1"
+ resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a"
+ integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==
+
+fn.name@1.x.x:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc"
+ integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==
+
+focus-lock@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-1.3.5.tgz#aa644576e5ec47d227b57eb14e1efb2abf33914c"
+ integrity sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==
+ dependencies:
+ tslib "^2.0.3"
+
+follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0, follow-redirects@^1.15.6:
+ version "1.15.9"
+ resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
+ integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+foreground-child@^3.1.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77"
+ integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==
+ dependencies:
+ cross-spawn "^7.0.0"
+ signal-exit "^4.0.1"
+
+form-data@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
+ integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+format@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
+ integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==
+
+formdata-polyfill@^4.0.10:
+ version "4.0.10"
+ resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423"
+ integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==
+ dependencies:
+ fetch-blob "^3.1.2"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+framer-motion@^11.11.1:
+ version "11.11.10"
+ resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.11.10.tgz#9045dddf6ebb7548335db1c284cc2824283c7634"
+ integrity sha512-061Bt1jL/vIm+diYIiA4dP/Yld7vD47ROextS7ESBW5hr4wQFhxB5D5T5zAc3c/5me3cOa+iO5LqhA38WDln/A==
+ dependencies:
+ tslib "^2.4.0"
+
+framesync@6.1.2:
+ version "6.1.2"
+ resolved "https://registry.yarnpkg.com/framesync/-/framesync-6.1.2.tgz#755eff2fb5b8f3b4d2b266dd18121b300aefea27"
+ integrity sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==
+ dependencies:
+ tslib "2.4.0"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
+fs-extra@^10.0.0:
+ version "10.1.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
+ integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
+ integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ functions-have-names "^1.2.3"
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+fuse.js@^6.4.6:
+ version "6.6.2"
+ resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111"
+ integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-nonce@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3"
+ integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==
+
+get-starknet-core@^4.0.0-next.3:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/get-starknet-core/-/get-starknet-core-4.0.0.tgz#9a81101b3a4e54e090f76492b566abaa3b5865c7"
+ integrity sha512-6pLmidQZkC3wZsrHY99grQHoGpuuXqkbSP65F8ov1/JsEI8DDLkhsAuLCKFzNOK56cJp+f1bWWfTJ57e9r5eqQ==
+ dependencies:
+ "@starknet-io/types-js" "^0.7.7"
+
+get-symbol-description@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5"
+ integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
+ dependencies:
+ call-bind "^1.0.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+
+get-tsconfig@^4.7.5:
+ version "4.8.1"
+ resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz#8995eb391ae6e1638d251118c7b56de7eb425471"
+ integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==
+ dependencies:
+ resolve-pkg-maps "^1.0.0"
+
+glob-parent@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob@10.3.10:
+ version "10.3.10"
+ resolved "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b"
+ integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==
+ dependencies:
+ foreground-child "^3.1.0"
+ jackspeak "^2.3.5"
+ minimatch "^9.0.1"
+ minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+ path-scurry "^1.10.1"
+
+glob@^7.1.3, glob@^7.1.4, glob@^7.2.3:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^13.19.0:
+ version "13.24.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
+ dependencies:
+ type-fest "^0.20.2"
+
+globalthis@^1.0.1, globalthis@^1.0.3, globalthis@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
+ integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+ dependencies:
+ define-properties "^1.2.1"
+ gopd "^1.0.1"
+
+google-protobuf@^3.21.0:
+ version "3.21.4"
+ resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9"
+ integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4:
+ version "4.2.11"
+ resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+graphql@^16.10.0:
+ version "16.10.0"
+ resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.10.0.tgz#24c01ae0af6b11ea87bf55694429198aaa8e220c"
+ integrity sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==
+
+grpc-web@^1.3.1:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/grpc-web/-/grpc-web-1.5.0.tgz#154e4007ab59a94bf7726b87ef6c5bd8815ecf6e"
+ integrity sha512-y1tS3BBIoiVSzKTDF3Hm7E8hV2n7YY7pO0Uo7depfWJqKzWE+SKr0jvHNIJsJJYILQlpYShpi/DRJJMbosgDMQ==
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
+has-proto@^1.0.1, has-proto@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd"
+ integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+hast-util-parse-selector@^2.0.0:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a"
+ integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==
+
+hastscript@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640"
+ integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==
+ dependencies:
+ "@types/hast" "^2.0.0"
+ comma-separated-tokens "^1.0.0"
+ hast-util-parse-selector "^2.0.0"
+ property-information "^5.0.0"
+ space-separated-tokens "^1.0.0"
+
+hi-base32@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e"
+ integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==
+
+highlight.js@^10.4.1, highlight.js@~10.7.0:
+ version "10.7.3"
+ resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531"
+ integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==
+
+highlightjs-vue@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz#fdfe97fbea6354e70ee44e3a955875e114db086d"
+ integrity sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hoist-non-react-statics@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
+hoopy@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
+ integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
+
+html5-qrcode@^2.3.8:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/html5-qrcode/-/html5-qrcode-2.3.8.tgz#0b0cdf7a9926cfd4be530e13a51db47592adfa0d"
+ integrity sha512-jsr4vafJhwoLVEDW3n1KvPnCCXWaQfRng0/EEYk1vNcQGcG/htAdhJX0be8YyqMoSz7+hZvOZSTAepsabiuhiQ==
+
+htmlparser2@^9.1.0:
+ version "9.1.0"
+ resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz#cdb498d8a75a51f739b61d3f718136c369bc8c23"
+ integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==
+ dependencies:
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+ domutils "^3.1.0"
+ entities "^4.5.0"
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http-proxy-middleware@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz#dc1313c75bd00d81e103823802551ee30130ebd1"
+ integrity sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==
+ dependencies:
+ "@types/http-proxy" "^1.17.15"
+ debug "^4.3.6"
+ http-proxy "^1.18.1"
+ is-glob "^4.0.3"
+ is-plain-object "^5.0.0"
+ micromatch "^4.0.8"
+
+http-proxy@^1.18.1:
+ version "1.18.1"
+ resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+ integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
+ dependencies:
+ eventemitter3 "^4.0.0"
+ follow-redirects "^1.0.0"
+ requires-port "^1.0.0"
+
+humanize-ms@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed"
+ integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==
+ dependencies:
+ ms "^2.0.0"
+
+humanize-number@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.npmjs.org/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18"
+ integrity sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==
+
+hyper-async@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/hyper-async/-/hyper-async-1.1.2.tgz#b9a83be36e726bface6f4a5b84f1a1a25bf19e6a"
+ integrity sha512-cnpOgKa+5FZOaccTtjduac1FrZuSc38/ftCp3vYJdUMt+7c+uvGDKLDK4MTNK8D3aFjIeveVrPcSgUPvzZLopg==
+
+iconv-lite@0.4.24, iconv-lite@^0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@0.6.3, iconv-lite@^0.6.3:
+ version "0.6.3"
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+ieee754@^1.1.13, ieee754@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore@^5.2.0, ignore@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+immediate@~3.0.5:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
+ integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==
+
+import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inquirer@^8.1.2:
+ version "8.2.6"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.6.tgz#733b74888195d8d400a67ac332011b5fae5ea562"
+ integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ chalk "^4.1.1"
+ cli-cursor "^3.1.0"
+ cli-width "^3.0.0"
+ external-editor "^3.0.3"
+ figures "^3.0.0"
+ lodash "^4.17.21"
+ mute-stream "0.0.8"
+ ora "^5.4.1"
+ run-async "^2.4.0"
+ rxjs "^7.5.5"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+ through "^2.3.6"
+ wrap-ansi "^6.0.1"
+
+internal-slot@^1.0.4, internal-slot@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802"
+ integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
+ dependencies:
+ es-errors "^1.3.0"
+ hasown "^2.0.0"
+ side-channel "^1.0.4"
+
+invariant@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+ipaddr.js@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8"
+ integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
+
+is-alphabetical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+ integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
+
+is-alphanumerical@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+ integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
+ dependencies:
+ is-alphabetical "^1.0.0"
+ is-decimal "^1.0.0"
+
+is-arguments@^1.0.4, is-arguments@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b"
+ integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-array-buffer@^3.0.2, is-array-buffer@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98"
+ integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+ integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+
+is-async-function@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646"
+ integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-buffer@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
+ integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==
+
+is-buffer@~1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-bun-module@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz#495e706f42e29f086fd5fe1ac3c51f106062b9fc"
+ integrity sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==
+ dependencies:
+ semver "^7.6.3"
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.13.0, is-core-module@^2.15.1:
+ version "2.15.1"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
+ integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
+ dependencies:
+ hasown "^2.0.2"
+
+is-data-view@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f"
+ integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
+ dependencies:
+ is-typed-array "^1.1.13"
+
+is-date-object@^1.0.1, is-date-object@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-decimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+ integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-finalizationregistry@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6"
+ integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-generator-function@^1.0.10, is-generator-function@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
+ integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==
+ dependencies:
+ has-tostringtag "^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.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==
+
+is-hexadecimal@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
+ integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
+
+is-interactive@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
+ integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+
+is-map@^2.0.2, is-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
+ integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
+
+is-negative-zero@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+ integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-plain-object@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
+ integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
+is-promise@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
+ integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-retry-allowed@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz#88f34cbd236e043e71b6932d09b0c65fb7b4d71d"
+ integrity sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==
+
+is-set@^2.0.2, is-set@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
+ integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
+
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688"
+ integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
+ dependencies:
+ call-bind "^1.0.7"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.13, is-typed-array@^1.1.3:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229"
+ integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
+ dependencies:
+ which-typed-array "^1.1.14"
+
+is-typedarray@1.0.0, is-typedarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
+
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+is-weakmap@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd"
+ integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-weakset@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007"
+ integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==
+ dependencies:
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
+
+isarray@^2.0.1, isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isomorphic-fetch@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz#0267b005049046d2421207215d45d6a262b8b8b4"
+ integrity sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==
+ dependencies:
+ node-fetch "^2.6.1"
+ whatwg-fetch "^3.4.1"
+
+isomorphic-ws@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc"
+ integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==
+
+iterator.prototype@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c"
+ integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==
+ dependencies:
+ define-properties "^1.2.1"
+ get-intrinsic "^1.2.1"
+ has-symbols "^1.0.3"
+ reflect.getprototypeof "^1.0.4"
+ set-function-name "^2.0.1"
+
+jackspeak@^2.3.5:
+ version "2.3.6"
+ resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8"
+ integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+ optionalDependencies:
+ "@pkgjs/parseargs" "^0.11.0"
+
+jake@^10.8.5:
+ version "10.9.2"
+ resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f"
+ integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==
+ dependencies:
+ async "^3.2.3"
+ chalk "^4.0.2"
+ filelist "^1.0.4"
+ minimatch "^3.1.2"
+
+jayson@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz#443c26a8658703e0b2e881117b09395d88b6982e"
+ integrity sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==
+ dependencies:
+ "@types/connect" "^3.4.33"
+ "@types/node" "^12.12.54"
+ "@types/ws" "^7.4.4"
+ JSONStream "^1.3.5"
+ commander "^2.20.3"
+ delay "^5.0.0"
+ es6-promisify "^5.0.0"
+ eyes "^0.1.8"
+ isomorphic-ws "^4.0.1"
+ json-stringify-safe "^5.0.1"
+ uuid "^8.3.2"
+ ws "^7.5.10"
+
+js-base64@^3.7.2:
+ version "3.7.7"
+ resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79"
+ integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==
+
+js-sha256@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966"
+ integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+js-sha512@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz#dd22db8d02756faccf19f218e3ed61ec8249f7d4"
+ integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
+
+json-beautify@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/json-beautify/-/json-beautify-1.1.1.tgz#8a1ed511ad5d52ca63ed29f7c61896c6a6ebbb9f"
+ integrity sha512-17j+Hk2lado0xqKtUcyAjK0AtoHnPSIgktWRsEXgdFQFG9UnaGw6CHa0J7xsvulxRpFl6CrkDFHght1p5ZJc4A==
+
+json-bigint@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz#ae547823ac0cad8398667f8cd9ef4730f5b01ff1"
+ integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==
+ dependencies:
+ bignumber.js "^9.0.0"
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-schema-typed@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/json-schema-typed/-/json-schema-typed-7.0.3.tgz#23ff481b8b4eebcd2ca123b4fa0409e66469a2d9"
+ integrity sha512-7DE8mpG+/fVw+dTpjbxnx47TaMnDfOI1jwft9g1VybltZCduyRQPJPvc+zzKY9WPHxhPWczyFuYa6I8Mw4iU5A==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json-stringify-safe@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
+json5@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
+ integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==
+ dependencies:
+ minimist "^1.2.0"
+
+jsonfile@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+ integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonparse@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+ integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==
+
+jsonpath@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901"
+ integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==
+ dependencies:
+ esprima "1.2.2"
+ static-eval "2.0.2"
+ underscore "1.12.1"
+
+"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5:
+ version "3.3.5"
+ resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a"
+ integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==
+ dependencies:
+ array-includes "^3.1.6"
+ array.prototype.flat "^1.3.1"
+ object.assign "^4.1.4"
+ object.values "^1.1.6"
+
+jszip@^3.6.0:
+ version "3.10.1"
+ resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2"
+ integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==
+ dependencies:
+ lie "~3.3.0"
+ pako "~1.0.2"
+ readable-stream "~2.3.6"
+ setimmediate "^1.0.5"
+
+keccak@^3.0.0, keccak@^3.0.2:
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d"
+ integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+ readable-stream "^3.6.0"
+
+keyv@^4.5.3:
+ version "4.5.4"
+ resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+keyvaluestorage-interface@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/keyvaluestorage-interface/-/keyvaluestorage-interface-1.0.0.tgz#13ebdf71f5284ad54be94bd1ad9ed79adad515ff"
+ integrity sha512-8t6Q3TclQ4uZynJY9IGr2+SsIGwK9JHcO6ootkHCGA0CrQCRy+VkouYNO2xicET6b9al7QKzpebNow+gkpCL8g==
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+kuler@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
+ integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==
+
+language-subtag-registry@^0.3.20:
+ version "0.3.23"
+ resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7"
+ integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==
+
+language-tags@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz#1ffdcd0ec0fafb4b1be7f8b11f306ad0f9c08777"
+ integrity sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==
+ dependencies:
+ language-subtag-registry "^0.3.20"
+
+lazystream@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.1.tgz#494c831062f1f9408251ec44db1cba29242a2638"
+ integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==
+ dependencies:
+ readable-stream "^2.0.5"
+
+leb128@0.0.4, leb128@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/leb128/-/leb128-0.0.4.tgz#f96d698cf3ba5b677423abfe50b7e9b2df1463ff"
+ integrity sha512-2zejk0fCIgY8RVcc/KzvyfpDio5Oo8HgPZmkrOmdwmbk0KpKpgD+JKwikxKk8cZYkANIhwHK50SNukkCm3XkCQ==
+ dependencies:
+ bn.js "^4.11.6"
+ buffer-pipe "0.0.0"
+
+level-supports@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a"
+ integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==
+
+level-transcoder@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c"
+ integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==
+ dependencies:
+ buffer "^6.0.3"
+ module-error "^1.0.1"
+
+level@^8.0.0:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/level/-/level-8.0.1.tgz#737161db1bc317193aca4e7b6f436e7e1df64379"
+ integrity sha512-oPBGkheysuw7DmzFQYyFe8NAia5jFLAgEnkgWnK3OXAuJr8qFT+xBQIwokAZPME2bhPFzS8hlYcL16m8UZrtwQ==
+ dependencies:
+ abstract-level "^1.0.4"
+ browser-level "^1.0.1"
+ classic-level "^1.2.0"
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+libsodium-sumo@^0.7.15:
+ version "0.7.15"
+ resolved "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.15.tgz#91c1d863fe3fbce6d6b9db1aadaa622733a1d007"
+ integrity sha512-5tPmqPmq8T8Nikpm1Nqj0hBHvsLFCXvdhBFV7SGOitQPZAA6jso8XoL0r4L7vmfKXr486fiQInvErHtEvizFMw==
+
+libsodium-wrappers-sumo@^0.7.11:
+ version "0.7.15"
+ resolved "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.15.tgz#0ef2a99b4b17e8385aa7e6850593660dbaf5fb40"
+ integrity sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==
+ dependencies:
+ libsodium-sumo "^0.7.15"
+
+lie@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e"
+ integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==
+ dependencies:
+ immediate "~3.0.5"
+
+lie@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
+ integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
+ dependencies:
+ immediate "~3.0.5"
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+lit-connect-modal@^0.1.11:
+ version "0.1.11"
+ resolved "https://registry.yarnpkg.com/lit-connect-modal/-/lit-connect-modal-0.1.11.tgz#688fa9601b920c917856a5dbe8491a4fbaf1d6ab"
+ integrity sha512-EG6pcCqdxZQJt3MPDq3gJ5Sz4E5sJdydtAF7VFJu6z6GDHO1Ybp8WrTx8CUnHiF54/MQBRi6Nb7cbTvv+BKWvQ==
+ dependencies:
+ micromodal "^0.4.10"
+
+lit-siwe@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/lit-siwe/-/lit-siwe-1.1.8.tgz#6a393069012816d629c518bb8aa410f1e4a78bd7"
+ integrity sha512-gXI8GG0GAClw6G7T9p4p6Kn9ywDo8j2d90ShaYArJdsqqO9gwXfzxF84SMeY+bpsNqqQ3FahrhEwTCHd6w7wNw==
+ dependencies:
+ "@spruceid/siwe-parser" "1.1.3"
+ "@stablelib/random" "^1.0.1"
+ apg-js "^4.1.1"
+
+localforage@^1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4"
+ integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==
+ dependencies:
+ lie "3.1.1"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.defaults@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+ integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==
+
+lodash.difference@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c"
+ integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==
+
+lodash.flatten@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+ integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==
+
+lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.mergewith@4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55"
+ integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==
+
+lodash.union@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
+ integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
+
+lodash@^4.17.21:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+ dependencies:
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
+
+logform@^2.6.0, logform@^2.6.1:
+ version "2.6.1"
+ resolved "https://registry.npmjs.org/logform/-/logform-2.6.1.tgz#71403a7d8cae04b2b734147963236205db9b3df0"
+ integrity sha512-CdaO738xRapbKIMVn2m4F6KTj4j7ooJ8POVnebSgKo3KBz5axNXRAL7ZdRjIV6NOr2Uf4vjtRkxrFETOioCqSA==
+ dependencies:
+ "@colors/colors" "1.6.0"
+ "@types/triple-beam" "^1.3.2"
+ fecha "^4.2.0"
+ ms "^2.1.1"
+ safe-stable-stringify "^2.3.1"
+ triple-beam "^1.3.0"
+
+logplease@^1.2.15:
+ version "1.2.15"
+ resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a"
+ integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==
+
+long@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+ integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
+
+long@^5.0.0:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1"
+ integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lorem-ipsum@^1.0.3:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/lorem-ipsum/-/lorem-ipsum-1.0.6.tgz#69e9ab02bbb0991915d71b5559fe016d526f013f"
+ integrity sha512-Rx4XH8X4KSDCKAVvWGYlhAfNqdUP5ZdT4rRyf0jjrvWgtViZimDIlopWNfn/y3lGM5K4uuiAoY28TaD+7YKFrQ==
+ dependencies:
+ minimist "~1.2.0"
+
+lossless-json@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/lossless-json/-/lossless-json-4.0.2.tgz#f00c52815805d1421930a87e2670e27350958a3f"
+ integrity sha512-+z0EaLi2UcWi8MZRxA5iTb6m4Ys4E80uftGY+yG5KNFJb5EceQXOhdW/pWJZ8m97s26u7yZZAYMcKWNztSZssA==
+
+lowlight@^1.17.0:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/lowlight/-/lowlight-1.20.0.tgz#ddb197d33462ad0d93bf19d17b6c301aa3941888"
+ integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==
+ dependencies:
+ fault "^1.0.0"
+ highlight.js "~10.7.0"
+
+lru-cache@^10.2.0, lru-cache@^10.2.2:
+ version "10.4.3"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
+lru-queue@0.1, lru-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
+ integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==
+ dependencies:
+ es5-ext "~0.10.2"
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+md5@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
+ integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
+ dependencies:
+ charenc "0.0.2"
+ crypt "0.0.2"
+ is-buffer "~1.1.6"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+memoizee@0.3.x:
+ version "0.3.10"
+ resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.3.10.tgz#4eca0d8aed39ec9d017f4c5c2f2f6432f42e5c8f"
+ integrity sha512-LLzVUuWwGBKK188spgOK/ukrp5zvd9JGsiLDH41pH9vt5jvhZfsu5pxDuAnYAMG8YEGce72KO07sSBy9KkvOfw==
+ dependencies:
+ d "~0.1.1"
+ es5-ext "~0.10.11"
+ es6-weak-map "~0.1.4"
+ event-emitter "~0.3.4"
+ lru-queue "0.1"
+ next-tick "~0.2.2"
+ timers-ext "0.1"
+
+memoizee@^0.4.15:
+ version "0.4.17"
+ resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.17.tgz#942a5f8acee281fa6fb9c620bddc57e3b7382949"
+ integrity sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==
+ dependencies:
+ d "^1.0.2"
+ es5-ext "^0.10.64"
+ es6-weak-map "^2.0.3"
+ event-emitter "^0.3.5"
+ is-promise "^2.2.2"
+ lru-queue "^0.1.0"
+ next-tick "^1.1.0"
+ timers-ext "^0.1.7"
+
+memory-level@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692"
+ integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==
+ dependencies:
+ abstract-level "^1.0.0"
+ functional-red-black-tree "^1.0.1"
+ module-error "^1.0.1"
+
+merge-descriptors@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
+ integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+micromatch@^4.0.4, micromatch@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+micromodal@^0.4.10:
+ version "0.4.10"
+ resolved "https://registry.yarnpkg.com/micromodal/-/micromodal-0.4.10.tgz#d6f59c21d2f4a5af480f65909eb9608a1d558c73"
+ integrity sha512-BUrEnzMPFBwK8nOE4xUDYHLrlGlLULQVjpja99tpJQPSUEWgw3kTLp1n1qv0HmKU29AiHE7Y7sMLiRziDK4ghQ==
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mime@^2.5.2:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
+ integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-fn@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-3.1.0.tgz#65755145bbf3e36954b949c16450427451d5ca74"
+ integrity sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+ integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
+
+minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^5.0.1, minimatch@^5.1.0:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@^9.0.1, minimatch@^9.0.4:
+ version "9.0.5"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.0:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0":
+ version "7.1.2"
+ resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
+ integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
+
+mnemonist@^0.39.8:
+ version "0.39.8"
+ resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.39.8.tgz#9078cd8386081afd986cca34b52b5d84ea7a4d38"
+ integrity sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==
+ dependencies:
+ obliterator "^2.0.1"
+
+module-error@^1.0.1, module-error@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86"
+ integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multistream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz#7bf00dfd119556fbc153cff3de4c6d477909f5a8"
+ integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==
+ dependencies:
+ once "^1.4.0"
+ readable-stream "^3.6.0"
+
+mute-stream@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+ integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
+nan@2.14.0:
+ version "2.14.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
+ integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
+
+nan@^2.13.2, nan@^2.14.0:
+ version "2.22.0"
+ resolved "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3"
+ integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==
+
+nanoassert@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09"
+ integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==
+
+nanoid@^3.3.6:
+ version "3.3.7"
+ resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+napi-macros@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044"
+ integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+next-tick@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+ integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+next-tick@~0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d"
+ integrity sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q==
+
+next@14.2.13:
+ version "14.2.13"
+ resolved "https://registry.npmjs.org/next/-/next-14.2.13.tgz#32da2ee0afbe729e2d4a467c3570def90e1c974d"
+ integrity sha512-BseY9YNw8QJSwLYD7hlZzl6QVDoSFHL/URN5K64kVEVpCsSOWeyjbIGK+dZUaRViHTaMQX8aqmnn0PHBbGZezg==
+ dependencies:
+ "@next/env" "14.2.13"
+ "@swc/helpers" "0.5.5"
+ busboy "1.6.0"
+ caniuse-lite "^1.0.30001579"
+ graceful-fs "^4.2.11"
+ postcss "8.4.31"
+ styled-jsx "5.1.1"
+ optionalDependencies:
+ "@next/swc-darwin-arm64" "14.2.13"
+ "@next/swc-darwin-x64" "14.2.13"
+ "@next/swc-linux-arm64-gnu" "14.2.13"
+ "@next/swc-linux-arm64-musl" "14.2.13"
+ "@next/swc-linux-x64-gnu" "14.2.13"
+ "@next/swc-linux-x64-musl" "14.2.13"
+ "@next/swc-win32-arm64-msvc" "14.2.13"
+ "@next/swc-win32-ia32-msvc" "14.2.13"
+ "@next/swc-win32-x64-msvc" "14.2.13"
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-addon-api@^3.0.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
+ integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
+
+node-addon-api@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz#49da1ca055e109a23d537e9de43c09cca21eb762"
+ integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
+
+node-domexception@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5"
+ integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==
+
+node-fetch@2, node-fetch@^2.6.1, node-fetch@^2.6.12, node-fetch@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d"
+ integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-fetch@^3.2.3:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b"
+ integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==
+ dependencies:
+ data-uri-to-buffer "^4.0.0"
+ fetch-blob "^3.1.4"
+ formdata-polyfill "^4.0.10"
+
+node-forge@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
+ integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
+
+node-gyp-build-optional-packages@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz#52b143b9dd77b7669073cbfe39e3f4118bfc603c"
+ integrity sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==
+ dependencies:
+ detect-libc "^2.0.1"
+
+node-gyp-build@^4.2.0, node-gyp-build@^4.2.2, node-gyp-build@^4.3.0:
+ version "4.8.2"
+ resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa"
+ integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==
+
+normalize-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+nth-check@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+ integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+ dependencies:
+ boolbase "^1.0.0"
+
+object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.13.1:
+ version "1.13.2"
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff"
+ integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
+
+object-is@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07"
+ integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.4, object.assign@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0"
+ integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+ dependencies:
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+object.entries@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41"
+ integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+object.fromentries@^2.0.8:
+ version "2.0.8"
+ resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65"
+ integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+
+object.groupby@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e"
+ integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+
+object.values@^1.1.6, object.values@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
+ integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+obliterator@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816"
+ integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+one-time@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45"
+ integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==
+ dependencies:
+ fn.name "1.x.x"
+
+onetime@^5.1.0, onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+optionator@^0.8.1:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.6"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ word-wrap "~1.2.3"
+
+optionator@^0.9.3:
+ version "0.9.4"
+ resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ 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"
+
+ora@^5.4.1:
+ version "5.4.1"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
+ integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
+ dependencies:
+ bl "^4.1.0"
+ chalk "^4.1.0"
+ cli-cursor "^3.1.0"
+ cli-spinners "^2.5.0"
+ is-interactive "^1.0.0"
+ is-unicode-supported "^0.1.0"
+ log-symbols "^4.1.0"
+ strip-ansi "^6.0.0"
+ wcwidth "^1.0.1"
+
+os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+ integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
+
+p-limit@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-retry@^4.6.1:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16"
+ integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==
+ dependencies:
+ "@types/retry" "0.12.0"
+ retry "^0.13.1"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+pako@^2.0.4, pako@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86"
+ integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==
+
+pako@~1.0.2:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-entities@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8"
+ integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==
+ dependencies:
+ character-entities "^1.0.0"
+ character-entities-legacy "^1.0.0"
+ character-reference-invalid "^1.0.0"
+ is-alphanumerical "^1.0.0"
+ is-decimal "^1.0.0"
+ is-hexadecimal "^1.0.0"
+
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parse5-htmlparser2-tree-adapter@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b"
+ integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==
+ dependencies:
+ domhandler "^5.0.3"
+ parse5 "^7.0.0"
+
+parse5-parser-stream@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1"
+ integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==
+ dependencies:
+ parse5 "^7.0.0"
+
+parse5@^7.0.0, parse5@^7.1.2:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz#8a0591ce9b7c5e2027173ab737d4d3fc3d826fab"
+ integrity sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==
+ dependencies:
+ entities "^4.5.0"
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-scurry@^1.10.1:
+ version "1.11.1"
+ resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
+ integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
+ dependencies:
+ lru-cache "^10.2.0"
+ minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
+path-to-regexp@0.1.10:
+ version "0.1.10"
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b"
+ integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==
+
+path-to-regexp@0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
+ integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pbkdf2@^3.0.17:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+picocolors@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pkg-up@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
+ integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
+ dependencies:
+ find-up "^3.0.0"
+
+plimit-lit@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/plimit-lit/-/plimit-lit-3.0.1.tgz#45a2aee1a7249aa9c2eafc67b6a27bc927e3aa39"
+ integrity sha512-EyTTdP5LMX6WbHihG8R9w6DS+c3pyMpeKooOFuGDCyuVBogQjYNtoYwKLRD6hM1+VkHzGcfIuyLoWi6l5JA3iA==
+ dependencies:
+ queue-lit "^3.0.0"
+
+pngjs@^3.3.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
+ integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
+
+possible-typed-array-names@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f"
+ integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
+
+postcss@8.4.31:
+ version "8.4.31"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
+ integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
+ dependencies:
+ nanoid "^3.3.6"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+preact@10.4.1:
+ version "10.4.1"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431"
+ integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q==
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
+
+prismjs@^1.27.0:
+ version "1.29.0"
+ resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12"
+ integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==
+
+prismjs@~1.27.0:
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.27.0.tgz#bb6ee3138a0b438a3653dd4d6ce0cc6510a45057"
+ integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
+
+prompts@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+prop-types@^15.6.2, prop-types@^15.8.1:
+ version "15.8.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
+property-information@^5.0.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69"
+ integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==
+ dependencies:
+ xtend "^4.0.0"
+
+protobufjs@^6.11.2, protobufjs@^6.8.6, protobufjs@^6.8.8:
+ version "6.11.4"
+ resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa"
+ integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/long" "^4.0.1"
+ "@types/node" ">=13.7.0"
+ long "^4.0.0"
+
+protobufjs@^7.2.5:
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a"
+ integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/node" ">=13.7.0"
+ long "^5.0.0"
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+psl@^1.1.33:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+pvtsutils@^1.3.2, pvtsutils@^1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910"
+ integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==
+ dependencies:
+ tslib "^2.6.1"
+
+pvutils@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3"
+ integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==
+
+qr.js@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/qr.js/-/qr.js-0.0.0.tgz#cace86386f59a0db8050fa90d9b6b0e88a1e364f"
+ integrity sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==
+
+qrcode@1.4.4:
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83"
+ integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q==
+ dependencies:
+ buffer "^5.4.3"
+ buffer-alloc "^1.2.0"
+ buffer-from "^1.1.1"
+ dijkstrajs "^1.0.1"
+ isarray "^2.0.1"
+ pngjs "^3.3.0"
+ yargs "^13.2.4"
+
+qs@6.13.0, qs@^6.10.5:
+ version "6.13.0"
+ resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
+ integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
+ dependencies:
+ side-channel "^1.0.6"
+
+query-string@6.13.5:
+ version "6.13.5"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.5.tgz#99e95e2fb7021db90a6f373f990c0c814b3812d8"
+ integrity sha512-svk3xg9qHR39P3JlHuD7g3nRnyay5mHbrPctEBDUxUkHRifPHXJDhBUycdCC0NBjXoDf44Gb+IsOZL1Uwn8M/Q==
+ dependencies:
+ decode-uri-component "^0.2.0"
+ split-on-first "^1.0.0"
+ strict-uri-encode "^2.0.0"
+
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+queue-lit@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/queue-lit/-/queue-lit-3.0.0.tgz#5062f815e49c28759a2dc12124ab1723d563b932"
+ integrity sha512-iyVL2X5G58kICVGLW/nseYmdHxBoAp2Gav16H23NPtIllyEJ+UheHlYZqBjO+lJHRYoZRSrX7chH8tMrH9MB/A==
+
+queue-microtask@^1.2.2, queue-microtask@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+r1csfile@0.0.48:
+ version "0.0.48"
+ resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.48.tgz#a317fc75407a9da92631666c75bdfc13f0a7835a"
+ integrity sha512-kHRkKUJNaor31l05f2+RFzvcH5XSa7OfEfd/l4hzjte6NL6fjRkSMfZ4BjySW9wmfdwPOtq3mXurzPvPGEf5Tw==
+ dependencies:
+ "@iden3/bigarray" "0.0.2"
+ "@iden3/binfileutils" "0.0.12"
+ fastfile "0.0.20"
+ ffjavascript "0.3.0"
+
+ramda@^0.28.0:
+ version "0.28.0"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.28.0.tgz#acd785690100337e8b063cab3470019be427cc97"
+ integrity sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==
+
+ramda@^0.29.1:
+ version "0.29.1"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.1.tgz#408a6165b9555b7ba2fc62555804b6c5a2eca196"
+ integrity sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA==
+
+ramda@^0.30.0, ramda@^0.30.1:
+ version "0.30.1"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.30.1.tgz#7108ac95673062b060025052cd5143ae8fc605bf"
+ integrity sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.2:
+ version "2.5.2"
+ resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+react-clientside-effect@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz#29f9b14e944a376b03fb650eed2a754dd128ea3a"
+ integrity sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==
+ dependencies:
+ "@babel/runtime" "^7.12.13"
+
+react-dom@^18:
+ version "18.3.1"
+ resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4"
+ integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==
+ dependencies:
+ loose-envify "^1.1.0"
+ scheduler "^0.23.2"
+
+react-fast-compare@3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49"
+ integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==
+
+react-focus-lock@^2.9.6:
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.13.2.tgz#e1addac2f8b9550bc0581f3c416755ba0f81f5ef"
+ integrity sha512-T/7bsofxYqnod2xadvuwjGKHOoL5GH7/EIPI5UyEvaU/c2CcphvGI371opFtuY/SYdbMsNiuF4HsHQ50nA/TKQ==
+ dependencies:
+ "@babel/runtime" "^7.0.0"
+ focus-lock "^1.3.5"
+ prop-types "^15.6.2"
+ react-clientside-effect "^1.2.6"
+ use-callback-ref "^1.3.2"
+ use-sidecar "^1.1.2"
+
+react-is@^16.13.1, react-is@^16.7.0:
+ version "16.13.1"
+ resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-lorem-component@^0.13.0:
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/react-lorem-component/-/react-lorem-component-0.13.0.tgz#c0ddf3ae75ea6e01f7fd03d7586a24a621202039"
+ integrity sha512-4mWjxmcG/DJJwdxdKwXWyP2N9zohbJg/yYaC+7JffQNrKj3LYDpA/A4u/Dju1v1ZF6Jew2gbFKGb5Z6CL+UNTw==
+ dependencies:
+ create-react-class "^15.5.3"
+ lorem-ipsum "^1.0.3"
+ object-assign "^4.1.0"
+ seedable-random "0.0.1"
+
+react-qr-code@^2.0.15:
+ version "2.0.15"
+ resolved "https://registry.yarnpkg.com/react-qr-code/-/react-qr-code-2.0.15.tgz#fbfc12952c504bcd64275647e9d1ea63251742ce"
+ integrity sha512-MkZcjEXqVKqXEIMVE0mbcGgDpkfSdd8zhuzXEl9QzYeNcw8Hq2oVIzDLWuZN2PQBwM5PWjc2S31K8Q1UbcFMfw==
+ dependencies:
+ prop-types "^15.8.1"
+ qr.js "0.0.0"
+
+react-remove-scroll-bar@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c"
+ integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==
+ dependencies:
+ react-style-singleton "^2.2.1"
+ tslib "^2.0.0"
+
+react-remove-scroll@^2.5.7:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz#fb03a0845d7768a4f1519a99fdb84983b793dc07"
+ integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==
+ dependencies:
+ react-remove-scroll-bar "^2.3.6"
+ react-style-singleton "^2.2.1"
+ tslib "^2.1.0"
+ use-callback-ref "^1.3.0"
+ use-sidecar "^1.1.2"
+
+react-router-dom@^6.27.0:
+ version "6.27.0"
+ resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.27.0.tgz#8d7972a425fd75f91c1e1ff67e47240c5752dc3f"
+ integrity sha512-+bvtFWMC0DgAFrfKXKG9Fc+BcXWRUO1aJIihbB79xaeq0v5UzfvnM5houGUm1Y461WVRcgAQ+Clh5rdb1eCx4g==
+ dependencies:
+ "@remix-run/router" "1.20.0"
+ react-router "6.27.0"
+
+react-router@6.27.0:
+ version "6.27.0"
+ resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.27.0.tgz#db292474926c814c996c0ff3ef0162d1f9f60ed4"
+ integrity sha512-YA+HGZXz4jaAkVoYBE98VQl+nVzI+cVI2Oj/06F5ZM+0u3TgedN9Y9kmMRo2mnkSK2nCpNQn0DVob4HCsY/WLw==
+ dependencies:
+ "@remix-run/router" "1.20.0"
+
+react-style-singleton@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz#f99e420492b2d8f34d38308ff660b60d0b1205b4"
+ integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==
+ dependencies:
+ get-nonce "^1.0.0"
+ invariant "^2.2.4"
+ tslib "^2.0.0"
+
+react-syntax-highlighter@^15.6.1:
+ version "15.6.1"
+ resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz#fa567cb0a9f96be7bbccf2c13a3c4b5657d9543e"
+ integrity sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==
+ dependencies:
+ "@babel/runtime" "^7.3.1"
+ highlight.js "^10.4.1"
+ highlightjs-vue "^1.0.0"
+ lowlight "^1.17.0"
+ prismjs "^1.27.0"
+ refractor "^3.6.0"
+
+react@^18:
+ version "18.3.1"
+ resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891"
+ integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==
+ dependencies:
+ loose-envify "^1.1.0"
+
+readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@~2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b"
+ integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+ version "3.6.2"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@^4.3.0, readable-stream@^4.5.2:
+ version "4.5.2"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09"
+ integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==
+ dependencies:
+ abort-controller "^3.0.0"
+ buffer "^6.0.3"
+ events "^3.3.0"
+ process "^0.11.10"
+ string_decoder "^1.3.0"
+
+readdir-glob@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/readdir-glob/-/readdir-glob-1.1.3.tgz#c3d831f51f5e7bfa62fa2ffbe4b508c640f09584"
+ integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==
+ dependencies:
+ minimatch "^5.1.0"
+
+readonly-date@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9"
+ integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==
+
+redeyed@~2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b"
+ integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==
+ dependencies:
+ esprima "~4.0.0"
+
+redstone-smartweave@^0.3.10-alpha.3:
+ version "0.3.10-alpha.19"
+ resolved "https://registry.yarnpkg.com/redstone-smartweave/-/redstone-smartweave-0.3.10-alpha.19.tgz#3b5acd5943371d43cf43427322c9726fc9312a1c"
+ integrity sha512-QL4OtSh0R+ip7D+obkoZm0Uvp1UKhk+DbbxlFVcdEV3QI3fwD/0wkClbFq6XZueJdOWkcPp6xA2VgUcmAVQ7qQ==
+ dependencies:
+ "@weavery/clarity" "^0.1.5"
+ arweave "^1.10.16"
+ arweave-multihost "^0.1.0"
+ axios "^0.21.4"
+ bignumber.js "^9.0.1"
+ bson "^4.5.0"
+ json-beautify "^1.1.1"
+ tslog "^3.2.2"
+
+reflect.getprototypeof@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz#3ab04c32a8390b770712b7a8633972702d278859"
+ integrity sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.1"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ globalthis "^1.0.3"
+ which-builtin-type "^1.1.3"
+
+refractor@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/refractor/-/refractor-3.6.0.tgz#ac318f5a0715ead790fcfb0c71f4dd83d977935a"
+ integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==
+ dependencies:
+ hastscript "^6.0.0"
+ parse-entities "^2.0.0"
+ prismjs "~1.27.0"
+
+regenerator-runtime@^0.13.11:
+ version "0.13.11"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
+ integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
+
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2:
+ version "1.5.3"
+ resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
+ integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-errors "^1.3.0"
+ set-function-name "^2.0.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-pkg-maps@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f"
+ integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==
+
+resolve@^1.19.0, resolve@^1.22.4:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+resolve@^2.0.0-next.5:
+ version "2.0.0-next.5"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c"
+ integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
+retry@0.13.1, retry@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658"
+ integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf"
+ integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==
+ dependencies:
+ bn.js "^5.2.0"
+
+rpc-websockets@^9.0.2:
+ version "9.0.4"
+ resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.0.4.tgz#9d8ee82533b5d1e13d9ded729e3e38d0d8fa083f"
+ integrity sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==
+ dependencies:
+ "@swc/helpers" "^0.5.11"
+ "@types/uuid" "^8.3.4"
+ "@types/ws" "^8.2.2"
+ buffer "^6.0.3"
+ eventemitter3 "^5.0.1"
+ uuid "^8.3.2"
+ ws "^8.5.0"
+ optionalDependencies:
+ bufferutil "^4.0.1"
+ utf-8-validate "^5.0.2"
+
+run-async@^2.4.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+ integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
+run-parallel-limit@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba"
+ integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+rxjs@^7.5.5:
+ version "7.8.1"
+ resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543"
+ integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==
+ dependencies:
+ tslib "^2.1.0"
+
+safe-array-concat@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb"
+ integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
+ dependencies:
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
+ has-symbols "^1.0.3"
+ isarray "^2.0.5"
+
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-json-utils@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/safe-json-utils/-/safe-json-utils-1.1.1.tgz#0e883874467d95ab914c3f511096b89bfb3e63b1"
+ integrity sha512-SAJWGKDs50tAbiDXLf89PDwt9XYkWyANFWVzn4dTXl5QyI8t2o/bW5/OJl3lvc2WVU4MEpTo9Yz5NVFNsp+OJQ==
+
+safe-regex-test@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
+ integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-regex "^1.1.4"
+
+safe-stable-stringify@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz#34694bd8a30575b7f94792aa51527551bd733d61"
+ integrity sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==
+
+safe-stable-stringify@^2.3.1:
+ version "2.5.0"
+ resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd"
+ integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scheduler@^0.23.2:
+ version "0.23.2"
+ resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3"
+ integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==
+ dependencies:
+ loose-envify "^1.1.0"
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+secp256k1@3.7.1:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.7.1.tgz#12e473e0e9a7c2f2d4d4818e722ad0e14cc1e2f1"
+ integrity sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==
+ dependencies:
+ bindings "^1.5.0"
+ bip66 "^1.1.5"
+ bn.js "^4.11.8"
+ create-hash "^1.2.0"
+ drbg.js "^1.0.1"
+ elliptic "^6.4.1"
+ nan "^2.14.0"
+ safe-buffer "^5.1.2"
+
+secp256k1@5.0.0, secp256k1@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz#be6f0c8c7722e2481e9773336d351de8cddd12f7"
+ integrity sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==
+ dependencies:
+ elliptic "^6.5.4"
+ node-addon-api "^5.0.0"
+ node-gyp-build "^4.2.0"
+
+secp256k1@^4.0.1, secp256k1@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab"
+ integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==
+ dependencies:
+ elliptic "^6.5.7"
+ node-addon-api "^5.0.0"
+ node-gyp-build "^4.2.0"
+
+seedable-random@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/seedable-random/-/seedable-random-0.0.1.tgz#0b30cea79e4399688c5a067503a066b7c41e8316"
+ integrity sha512-uZWbEfz3BQdBl4QlUPELPqhInGEO1Q6zjzqrTDkd3j7mHaWWJo7h4ydr2g24a2WtTLk3imTLc8mPbBdQqdsbGw==
+
+semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.5, semver@^7.6.0, semver@^7.6.3:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
+
+send@0.19.0:
+ version "0.19.0"
+ resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
+ integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+serve-static@1.16.2:
+ version "1.16.2"
+ resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
+ integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
+ dependencies:
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.19.0"
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+set-cookie-parser@^2.4.8:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943"
+ integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==
+
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.1, set-function-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+ integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4, side-channel@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
+
+signal-exit@^3.0.2:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+signal-exit@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==
+ dependencies:
+ is-arrayish "^0.3.1"
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+snarkjs@^0.7.3:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.5.tgz#334d83b61468bdffbbf922b20734ca47be50b8ab"
+ integrity sha512-h+3c4rXZKLhLuHk4LHydZCk/h5GcNvk5GjVKRRkHmfb6Ntf8gHOA9zea3g656iclRuhqQ3iKDWFgiD9ypLrKiA==
+ dependencies:
+ "@iden3/binfileutils" "0.0.12"
+ bfj "^7.0.2"
+ blake2b-wasm "^2.4.0"
+ circom_runtime "0.1.28"
+ ejs "^3.1.6"
+ fastfile "0.0.20"
+ ffjavascript "0.3.1"
+ js-sha3 "^0.8.0"
+ logplease "^1.2.15"
+ r1csfile "0.0.48"
+
+source-map-js@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+source-map-support@^0.5.21:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+source-map@^0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+space-separated-tokens@^1.0.0:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899"
+ integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==
+
+spdx-license-ids@^3.0.10:
+ version "3.0.20"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89"
+ integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==
+
+split-on-first@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f"
+ integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==
+
+stack-trace@0.0.x:
+ version "0.0.10"
+ resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+ integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==
+
+"starknet-types-07@npm:@starknet-io/types-js@^0.7.7":
+ version "0.7.7"
+ resolved "https://registry.yarnpkg.com/@starknet-io/types-js/-/types-js-0.7.7.tgz#444be5e4e585ec6f599d42d3407280d98b2dfdf8"
+ integrity sha512-WLrpK7LIaIb8Ymxu6KF/6JkGW1sso988DweWu7p5QY/3y7waBIiPvzh27D9bX5KIJNRDyOoOVoHVEKYUYWZ/RQ==
+
+starknet@^6.11.0:
+ version "6.11.0"
+ resolved "https://registry.yarnpkg.com/starknet/-/starknet-6.11.0.tgz#5d7e868e913777e9bf64323e59ed8be86437f291"
+ integrity sha512-u50KrGDi9fbu1Ogu7ynwF/tSeFlp3mzOg1/Y5x50tYFICImo3OfY4lOz9OtYDk404HK4eUujKkhov9tG7GAKlg==
+ dependencies:
+ "@noble/curves" "~1.4.0"
+ "@noble/hashes" "^1.4.0"
+ "@scure/base" "~1.1.3"
+ "@scure/starknet" "~1.0.0"
+ abi-wan-kanabi "^2.2.2"
+ fetch-cookie "^3.0.0"
+ get-starknet-core "^4.0.0-next.3"
+ isomorphic-fetch "^3.0.0"
+ lossless-json "^4.0.1"
+ pako "^2.0.4"
+ starknet-types-07 "npm:@starknet-io/types-js@^0.7.7"
+ ts-mixer "^6.0.3"
+ url-join "^4.0.1"
+
+static-eval@2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42"
+ integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==
+ dependencies:
+ escodegen "^1.8.1"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+stop-iteration-iterator@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4"
+ integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==
+ dependencies:
+ internal-slot "^1.0.4"
+
+stream-buffers@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-3.0.3.tgz#9fc6ae267d9c4df1190a781e011634cac58af3cd"
+ integrity sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==
+
+stream-chunker@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/stream-chunker/-/stream-chunker-1.2.8.tgz#eb3af2c8aee5256cde76f0a1fea86348336d04f7"
+ integrity sha512-1j0PRZxgxJ8pPRyLlFu6Eer2imfhx1f++644xu/ZGRReDanv4frTSTWwNidtZOHJKwi86ue2KOWHFyikkQWN8w==
+ dependencies:
+ through2 "~2.0.0"
+
+streamsearch@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764"
+ integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==
+
+strict-uri-encode@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546"
+ integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==
+
+"string-width-cjs@npm:string-width@^4.2.0":
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^5.0.1, string-width@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+ integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ dependencies:
+ eastasianwidth "^0.2.0"
+ emoji-regex "^9.2.2"
+ strip-ansi "^7.0.1"
+
+string.prototype.includes@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz#eceef21283640761a81dbe16d6c7171a4edf7d92"
+ integrity sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.3"
+
+string.prototype.matchall@^4.0.11:
+ version "4.0.11"
+ resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a"
+ integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.7"
+ regexp.prototype.flags "^1.5.2"
+ set-function-name "^2.0.2"
+ side-channel "^1.0.6"
+
+string.prototype.repeat@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a"
+ integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+
+string.prototype.replaceall@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/string.prototype.replaceall/-/string.prototype.replaceall-1.0.10.tgz#f6a8d010b11bb7df97c949c097c87aa721e849df"
+ integrity sha512-PKLapcZUZmXUdfIM6rTTTMYOxaj4JiQrgl0SKEeCFug1CdMAuJq8hVZd4eek9yMXAW4ldGUq+TiZRtjLJRU96g==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
+ has-symbols "^1.0.3"
+ is-regex "^1.1.4"
+
+string.prototype.trim@^1.2.9:
+ version "1.2.9"
+ resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
+ integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.0"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimend@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229"
+ integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimstart@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string_decoder@^1.1.1, string_decoder@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1:
+ version "7.1.0"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
+ integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==
+ dependencies:
+ ansi-regex "^6.0.1"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+ integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+styled-jsx@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f"
+ integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==
+ dependencies:
+ client-only "0.0.1"
+
+stylis@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
+ integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
+
+superstruct@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54"
+ integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+symbol-observable@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a"
+ integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==
+
+tapable@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+tar-stream@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
+ integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
+ dependencies:
+ bl "^4.0.3"
+ end-of-stream "^1.4.1"
+ fs-constants "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.1.1"
+
+temp-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
+ integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==
+
+test@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/test/-/test-3.3.0.tgz#a2b56c6aa386c5732065793e8d9d92074a9cdd41"
+ integrity sha512-JKlEohxDIJRjwBH/+BrTcAPHljBALrAHw3Zs99RqZlaC605f6BggqXhxkdqZThbSHgaYPwpNJlf9bTSWkb/1rA==
+ dependencies:
+ minimist "^1.2.6"
+ readable-stream "^4.3.0"
+ string.prototype.replaceall "^1.0.6"
+
+text-encoding-utf-8@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13"
+ integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==
+
+text-hex@1.0.x:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5"
+ integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+through2@~2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
+"through@>=2.2.7 <3", through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
+timers-ext@0.1, timers-ext@0.1.x, timers-ext@^0.1.7:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.8.tgz#b4e442f10b7624a29dd2aa42c295e257150cf16c"
+ integrity sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==
+ dependencies:
+ es5-ext "^0.10.64"
+ next-tick "^1.1.0"
+
+tiny-secp256k1@^1.1.3:
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/tiny-secp256k1/-/tiny-secp256k1-1.1.6.tgz#7e224d2bee8ab8283f284e40e6b4acb74ffe047c"
+ integrity sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==
+ dependencies:
+ bindings "^1.3.0"
+ bn.js "^4.11.8"
+ create-hmac "^1.1.7"
+ elliptic "^6.4.0"
+ nan "^2.13.2"
+
+tmp-promise@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7"
+ integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==
+ dependencies:
+ tmp "^0.2.0"
+
+tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmp@^0.2.0:
+ version "0.2.3"
+ resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae"
+ integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toggle-selection@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32"
+ integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tough-cookie@^4.0.0:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
+ integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.2.0"
+ url-parse "^1.5.3"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+triple-beam@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984"
+ integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==
+
+tryer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
+ integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
+
+ts-api-utils@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1"
+ integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==
+
+ts-mixer@^6.0.3:
+ version "6.0.4"
+ resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.4.tgz#1da39ceabc09d947a82140d9f09db0f84919ca28"
+ integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==
+
+tsconfig-paths@^3.15.0:
+ version "3.15.0"
+ resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4"
+ integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.2"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tslib@1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+ integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
+
+tslib@2.7.0:
+ version "2.7.0"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
+ integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
+
+tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.1, tslib@^2.6.2:
+ version "2.8.0"
+ resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b"
+ integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==
+
+tslog@^3.2.2:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/tslog/-/tslog-3.3.4.tgz#083197a908c97b3b714a0576b9dac293f223f368"
+ integrity sha512-N0HHuHE0e/o75ALfkioFObknHR5dVchUad4F0XyFf3gXJYB++DewEzwGI/uIOM216E5a43ovnRNEeQIq9qgm4Q==
+ dependencies:
+ source-map-support "^0.5.21"
+
+tweetnacl-util@^0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^2.7.2:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486"
+ integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==
+
+typed-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3"
+ integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-typed-array "^1.1.13"
+
+typed-array-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67"
+ integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+
+typed-array-byte-offset@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063"
+ integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+
+typed-array-length@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3"
+ integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+ possible-typed-array-names "^1.0.0"
+
+typedarray-to-buffer@3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+typeforce@^1.11.5:
+ version "1.18.0"
+ resolved "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz#d7416a2c5845e085034d70fcc5b6cc4a90edbfdc"
+ integrity sha512-7uc1O8h1M1g0rArakJdf0uLRSSgFcYexrVoKo+bzJd32gd4gDy2L/Z+8/FjPnU9ydY3pEnVPtr9FyscYY60K1g==
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+underscore@1.12.1:
+ version "1.12.1"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e"
+ integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+undici-types@~6.19.2:
+ version "6.19.8"
+ resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
+ integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+
+undici@^5.19.1, undici@^5.8.0:
+ version "5.28.4"
+ resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.4.tgz#6b280408edb6a1a604a9b20340f45b422e373068"
+ integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==
+ dependencies:
+ "@fastify/busboy" "^2.0.0"
+
+undici@^6.19.5:
+ version "6.20.1"
+ resolved "https://registry.npmjs.org/undici/-/undici-6.20.1.tgz#fbb87b1e2b69d963ff2d5410a40ffb4c9e81b621"
+ integrity sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==
+
+universalify@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
+ integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+unzipit@^1.4.0:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/unzipit/-/unzipit-1.4.3.tgz#738298a6b235892bf7ce7db82cff813d4ca664ac"
+ integrity sha512-gsq2PdJIWWGhx5kcdWStvNWit9FVdTewm4SEG7gFskWs+XCVaULt9+BwuoBtJiRE8eo3L1IPAOrbByNLtLtIlg==
+ dependencies:
+ uzip-module "^1.0.2"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+url-join@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7"
+ integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==
+
+url-parse@^1.5.3:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
+use-callback-ref@^1.3.0, use-callback-ref@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz#6134c7f6ff76e2be0b56c809b17a650c942b1693"
+ integrity sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==
+ dependencies:
+ tslib "^2.0.0"
+
+use-sidecar@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.2.tgz#2f43126ba2d7d7e117aa5855e5d8f0276dfe73c2"
+ integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==
+ dependencies:
+ detect-node-es "^1.1.0"
+ tslib "^2.0.0"
+
+usehooks-ts@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/usehooks-ts/-/usehooks-ts-3.1.0.tgz#156119f36efc85f1b1952616c02580f140950eca"
+ integrity sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw==
+ dependencies:
+ lodash.debounce "^4.0.8"
+
+utf-8-validate@^5.0.2, utf-8-validate@^5.0.8:
+ version "5.0.10"
+ resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2"
+ integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==
+ dependencies:
+ node-gyp-build "^4.3.0"
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+util@^0.12.4:
+ version "0.12.5"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc"
+ integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==
+ dependencies:
+ inherits "^2.0.3"
+ is-arguments "^1.0.4"
+ is-generator-function "^1.0.7"
+ is-typed-array "^1.1.3"
+ which-typed-array "^1.1.2"
+
+utility-types@^3.10.0:
+ version "3.11.0"
+ resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz#607c40edb4f258915e901ea7995607fdf319424c"
+ integrity sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+uuid@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+uzip-module@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/uzip-module/-/uzip-module-1.0.3.tgz#6bbabe2a3efea5d5a4a47479f523a571de3427ce"
+ integrity sha512-AMqwWZaknLM77G+VPYNZLEruMGWGzyigPK3/Whg99B3S6vGHuqsyl5ZrOv1UUF3paGK1U6PM0cnayioaryg/fA==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+vlq@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz#6057b85729245b9829e3cc7755f95b228d4fe041"
+ integrity sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==
+
+wao@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/wao/-/wao-0.7.0.tgz#1d00af5443f611571acf0f669e978178f7edf09f"
+ integrity sha512-6J39Gy77vfmEiXADnuDJA/sSHf+C108tsbb2TDpI68rHYslv7jeKA6AB7scI5UJHKDzWGU2YSBX8/uM3C6DuRQ==
+ dependencies:
+ "@babel/plugin-transform-modules-commonjs" "^7.24.8"
+ "@permaweb/ao-loader" "^0.0.44"
+ "@permaweb/aoconnect" "^0.0.62"
+ arbundles "^0.11.1"
+ arweave "^1.15.1"
+ base64url "^3.0.1"
+ body-parser "^1.20.3"
+ cors "^2.8.5"
+ express "^4.21.2"
+ graphql "^16.10.0"
+ ramda "^0.30.1"
+ yargs "^17.7.2"
+
+warp-arbundles@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/warp-arbundles/-/warp-arbundles-1.0.4.tgz#10c0cd662ab41b0dabad9159c7110f43425cc5cc"
+ integrity sha512-KeRac/EJ7VOK+v5+PSMh2SrzpCKOAFnJICLlqZWt6qPkDCzVwcrNE5wFxOlEk5U170ewMDAB3e86UHUblevXpw==
+ dependencies:
+ arweave "^1.13.7"
+ base64url "^3.0.1"
+ buffer "^6.0.3"
+ warp-isomorphic "^1.0.7"
+
+warp-contracts@^1.1.7:
+ version "1.4.45"
+ resolved "https://registry.yarnpkg.com/warp-contracts/-/warp-contracts-1.4.45.tgz#918ede8cdc272bb6c0e9d9334a31107071b8b894"
+ integrity sha512-v4asbKIofCmQjH+1Q+yTyJmGUFwaL11zNnfaipRsxQ488MB7lGfQGNeadMfYhhc2yvUDhcVok1UcSfvfgugPaQ==
+ dependencies:
+ archiver "^5.3.0"
+ arweave "1.14.4"
+ async-mutex "^0.4.0"
+ bignumber.js "9.1.1"
+ events "3.3.0"
+ fast-copy "^3.0.0"
+ level "^8.0.0"
+ memory-level "^1.0.0"
+ safe-stable-stringify "2.4.1"
+ stream-buffers "^3.0.2"
+ unzipit "^1.4.0"
+ warp-arbundles "^1.0.4"
+ warp-isomorphic "^1.0.7"
+ warp-wasm-metering "1.0.1"
+
+warp-isomorphic@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/warp-isomorphic/-/warp-isomorphic-1.0.0.tgz#dccccfc046bc6ac77919f8be1024ced1385c70ea"
+ integrity sha512-E+9+brlrnZoNpNvpz8foIZiCk9fIVukRBZYEy/yefM+oAG+zNgDPb/xNaZyUJWC8rSZxE1DqrhRl0JxjtLVltA==
+ dependencies:
+ buffer "^6.0.3"
+ undici "^5.8.0"
+
+warp-isomorphic@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/warp-isomorphic/-/warp-isomorphic-1.0.7.tgz#abf1ee7bce44bec7c6b97547859e614876869aa7"
+ integrity sha512-fXHbUXwdYqPm9fRPz8mjv5ndPco09aMQuTe4kXfymzOq8V6F3DLsg9cIafxvjms9/mc6eijzkLBJ63yjEENEjA==
+ dependencies:
+ buffer "^6.0.3"
+ undici "^5.19.1"
+
+warp-wasm-json-toolkit@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/warp-wasm-json-toolkit/-/warp-wasm-json-toolkit-1.0.2.tgz#16ca399e5b20da804c01ff0d00979341b689a0e7"
+ integrity sha512-T6pKJz9mO0ZFYiu4jB2v8j8t8Cw21n/+uFh0QKbc/7cJSssGd3I26sV/VXjoDbGuG7bGzK9BewlFd+ukvxABOA==
+ dependencies:
+ buffer-pipe "0.0.3"
+ leb128 "0.0.4"
+ warp-isomorphic "1.0.0"
+
+warp-wasm-metering@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/warp-wasm-metering/-/warp-wasm-metering-1.0.1.tgz#1496b0b9a936985cf21a910e909b87630faa1c43"
+ integrity sha512-s2NtOPTGIDPWeDKyrY5UiUUf3oOjbjwGF9sgmRR3nqXzjxdgppvuf+6VYquzYM3xRMXIOq+AWMK2H/D/Yv+4tg==
+ dependencies:
+ leb128 "^0.0.4"
+ warp-wasm-json-toolkit "1.0.2"
+
+wasmbuilder@0.0.16:
+ version "0.0.16"
+ resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549"
+ integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==
+
+wasmcurves@0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b"
+ integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==
+ dependencies:
+ wasmbuilder "0.0.16"
+
+wcwidth@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==
+ dependencies:
+ defaults "^1.0.3"
+
+weavedb-base@^0.45.2:
+ version "0.45.2"
+ resolved "https://registry.yarnpkg.com/weavedb-base/-/weavedb-base-0.45.2.tgz#1d08daf017960d86dade97032bae0783bdbaa0b3"
+ integrity sha512-ZiuO6Ny9JwHah/WQ/ryCNEh4bD6z0lcJXIDzaeLlJTwq0SWezuQf5n98NaAsVNsyEv2VWJy+zHowaec3P1nrxA==
+ dependencies:
+ "@metamask/eth-sig-util" "^4.0.1"
+ "@metamask/legacy-web3" "^2.0.0"
+ "@simplewebauthn/server" "^7.2.0"
+ bignumber.js "^9.1.2"
+ eth-crypto "^2.3.0"
+ ethereumjs-util "^7.1.5"
+ ethers "5.7.2"
+ md5 "^2.3.0"
+ pako "^2.1.0"
+ ramda "^0.28.0"
+
+weavedb-client@^0.45.2:
+ version "0.45.2"
+ resolved "https://registry.yarnpkg.com/weavedb-client/-/weavedb-client-0.45.2.tgz#c819691e8d5f8159d8138d33775d11b114bff803"
+ integrity sha512-7L9b230No3LRCnXN1lIdTmxGWCEM9GnOGDsklAwEe2qYtlWEIeS7kf77s9n7A4C+XdcQoK4xTMwls8aTqGtU2Q==
+ dependencies:
+ "@lit-protocol/sdk-browser" "^1.3.3"
+ "@metamask/legacy-web3" "^2.0.0"
+ arweave "^1.11.8"
+ google-protobuf "^3.21.0"
+ grpc-web "^1.3.1"
+ ramda "^0.28.0"
+ weavedb-base "^0.45.2"
+
+weavedb-node-client@^0.45.2:
+ version "0.45.2"
+ resolved "https://registry.yarnpkg.com/weavedb-node-client/-/weavedb-node-client-0.45.2.tgz#f1caf43317db6ea737d6ca5f4099f3a9f28034e4"
+ integrity sha512-CyJZrkQr/UQMx/GXxcAX514kYyw7y+FU6/V21jMw0qa8si/tP5XDpK/4EsAW4LJ1hCxYzaoxtB/xNlDetfJ4LQ==
+ dependencies:
+ "@grpc/grpc-js" "^1.1.0"
+ "@grpc/proto-loader" "^0.5.0"
+ arweave "^1.12.2"
+ ramda "^0.28.0"
+ weavedb-base "^0.45.2"
+
+web-streams-polyfill@^3.0.3:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b"
+ integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==
+
+web-worker@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da"
+ integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+whatwg-encoding@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
+ integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
+ dependencies:
+ iconv-lite "0.6.3"
+
+whatwg-fetch@^3.4.1:
+ version "3.6.20"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70"
+ integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==
+
+whatwg-mimetype@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a"
+ integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
+
+whatwg-url@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-builtin-type@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3"
+ integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==
+ dependencies:
+ function.prototype.name "^1.1.6"
+ has-tostringtag "^1.0.2"
+ is-async-function "^2.0.0"
+ is-date-object "^1.0.5"
+ is-finalizationregistry "^1.0.2"
+ is-generator-function "^1.0.10"
+ is-regex "^1.1.4"
+ is-weakref "^1.0.2"
+ isarray "^2.0.5"
+ which-boxed-primitive "^1.0.2"
+ which-collection "^1.0.2"
+ which-typed-array "^1.1.15"
+
+which-collection@^1.0.1, which-collection@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
+ integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
+ dependencies:
+ is-map "^2.0.3"
+ is-set "^2.0.3"
+ is-weakmap "^2.0.2"
+ is-weakset "^2.0.3"
+
+which-module@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
+ integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
+
+which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
+ integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.2"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wif@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz#08d3f52056c66679299726fade0d432ae74b4704"
+ integrity sha512-HIanZn1zmduSF+BQhkE+YXIbEiH0xPr1012QbFEGB0xsKqJii0/SqJjyn8dFv6y36kOznMgMB+LGcbZTJ1xACQ==
+ dependencies:
+ bs58check "<3.0.0"
+
+winston-transport@^4.7.0:
+ version "4.8.0"
+ resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.8.0.tgz#a15080deaeb80338455ac52c863418c74fcf38ea"
+ integrity sha512-qxSTKswC6llEMZKgCQdaWgDuMJQnhuvF5f2Nk3SNXc4byfQ+voo2mX1Px9dkNOuR8p0KAjfPG29PuYUSIb+vSA==
+ dependencies:
+ logform "^2.6.1"
+ readable-stream "^4.5.2"
+ triple-beam "^1.3.0"
+
+winston@^3.14.1:
+ version "3.15.0"
+ resolved "https://registry.npmjs.org/winston/-/winston-3.15.0.tgz#4df7b70be091bc1a38a4f45b969fa79589b73ff5"
+ integrity sha512-RhruH2Cj0bV0WgNL+lOfoUBI4DVfdUNjVnJGVovWZmrcKtrFTTRzgXYK2O9cymSGjrERCtaAeHwMNnUWXlwZow==
+ dependencies:
+ "@colors/colors" "^1.6.0"
+ "@dabh/diagnostics" "^2.0.2"
+ async "^3.2.3"
+ is-stream "^2.0.0"
+ logform "^2.6.0"
+ one-time "^1.0.0"
+ readable-stream "^3.4.0"
+ safe-stable-stringify "^2.3.1"
+ stack-trace "0.0.x"
+ triple-beam "^1.3.0"
+ winston-transport "^4.7.0"
+
+word-wrap@^1.2.5, word-wrap@~1.2.3:
+ version "1.2.5"
+ resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrap-ansi@^6.0.1:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+ integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+ dependencies:
+ ansi-styles "^6.1.0"
+ string-width "^5.0.1"
+ strip-ansi "^7.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@7.4.6:
+ version "7.4.6"
+ resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+ws@7.5.3:
+ version "7.5.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74"
+ integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==
+
+ws@8.17.1:
+ version "8.17.1"
+ resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b"
+ integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==
+
+ws@^7, ws@^7.4.0, ws@^7.5.10:
+ version "7.5.10"
+ resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
+ integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
+
+ws@^8.5.0:
+ version "8.18.0"
+ resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"
+ integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==
+
+xstream@^11.14.0:
+ version "11.14.0"
+ resolved "https://registry.npmjs.org/xstream/-/xstream-11.14.0.tgz#2c071d26b18310523b6877e86b4e54df068a9ae5"
+ integrity sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw==
+ dependencies:
+ globalthis "^1.0.1"
+ symbol-observable "^2.0.3"
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yaml@^1.10.0:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^13.2.4:
+ version "13.3.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.2"
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+zip-stream@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.1.tgz#1337fe974dbaffd2fa9a1ba09662a66932bd7135"
+ integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==
+ dependencies:
+ archiver-utils "^3.0.4"
+ compress-commons "^4.1.2"
+ readable-stream "^3.6.0"
+
+zkjson@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/zkjson/-/zkjson-0.3.2.tgz#fa95514c42af134655b1b1aae990c84c299a4b22"
+ integrity sha512-fxPneokJnEqr2qsFelzR9y7ATCVG+rWwdAE9I5kxgN91Sbxrv+Rs7oyg2jaWCw3P+7HCk9I7xwaQxVvSUBeCHQ==
+ dependencies:
+ blake-hash "^2.0.0"
+ blake2b "^2.1.3"
+ ethers "^5.5.1"
+ ffjavascript "^0.2.45"
+ ramda "^0.29.1"
+ snarkjs "^0.7.3"
+
+zod@^3.23.5, zod@^3.23.8:
+ version "3.23.8"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d"
+ integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==
diff --git a/lua/.gitignore b/lua/.gitignore
new file mode 100644
index 0000000..2a2437c
--- /dev/null
+++ b/lua/.gitignore
@@ -0,0 +1,4 @@
+.env
+.env.*
+.wallets
+node_modules/
\ No newline at end of file
diff --git a/lua/contracts/app.lua b/lua/contracts/app.lua
new file mode 100644
index 0000000..3a4132c
--- /dev/null
+++ b/lua/contracts/app.lua
@@ -0,0 +1,10 @@
+local json = require("json")
+
+Handlers.add(
+ "Fetch",
+ "Fetch",
+ function(msg)
+ --local result = Send({ Target = msg.DB, Action = "Get", Query = json.encode({ "ppl", "bob" }) }).Data
+ msg.reply({ Data = result })
+ end
+)
diff --git a/lua/contracts/staking.lua b/lua/contracts/staking.lua
new file mode 100644
index 0000000..aa45e18
--- /dev/null
+++ b/lua/contracts/staking.lua
@@ -0,0 +1,505 @@
+local json = require("json")
+local bint = require('.bint')(256)
+
+if aoETH ~= '' then aoETH = '' end
+if dbToken ~= '' then dbToken = '' end
+local ten16 = "10000000000000000"
+local m = {
+ add = function(a, b)
+ return tostring(bint(a) + bint(b))
+ end,
+ sub = function(a, b)
+ return tostring(bint(a) - bint(b))
+ end,
+ mul = function(a, b)
+ return tostring(bint(a) * bint(b))
+ end,
+ div = function(a, b)
+ return tostring(math.floor(bint(a) / bint(b)))
+ end,
+ toBalanceValue = function(a)
+ return tostring(bint(a))
+ end,
+ toNumber = function(a)
+ return bint.tonumber(a)
+ end,
+ floor = function(a)
+ return tostring(math.floor(bint.tonumber(a)))
+ end,
+ ceil = function(a)
+ return tostring(math.ceil(bint.tonumber(a)))
+ end
+}
+
+invalids = invalids or {}
+nodes = nodes or {}
+count = count or 0
+dbs = dbs or {}
+profits = profits or {}
+Balances = Balances or { [ao.id] = "0" }
+Withdraws = Withdraws or { [ao.id] = "0" }
+RewardWithdraws = RewardWithdraws or { [ao.id] = "0" }
+minETH = "1000000000000000000"
+rewards = rewards or nil
+TotalStake = TotalStake or "0"
+TotalDeposit = TotalDeposit or "0"
+TotalReward = TotalReward or "0"
+
+function isValidAddr(address)
+ return string.match(address, "^[A-Za-z0-9_-]+$") ~= nil and #address == 43
+end
+
+
+Handlers.add(
+ "Add-DB",
+ "Add-DB",
+ function (msg)
+ assert(type(msg.Node) == 'string' and nodes[msg.Node] ~= nil, 'Valid Node is required!')
+ assert(type(msg.Allocations) == 'string', 'Allocations is required!')
+ assert(nodes[msg.Node].admin == msg.From, 'Only node admin can execute!')
+ assert(type(msg.DB) == 'string' and isValidAddr(msg.DB), 'Valid DB is required!')
+ assert(bint.__lt(0, bint(msg.Price)), 'Price must be greater than 0')
+ assert(bint.__lt(0, bint(msg.Validators)), 'Validators must be greater than 0')
+ assert(bint.__lt(0, bint(msg["Min-Stake"])), 'Min-Stake must be greater than 0')
+ assert(nodes[msg.Node].dbs[msg.DB] == nil, 'DB already exists!')
+ nodes[msg.Node].dbs[msg.DB] = { process = msg.DB }
+ local allocations = json.decode(msg.Allocations)
+ for k, v in pairs(allocations) do
+ assert(bint.__lt(0, bint(v)), 'alloc must be greater than 0')
+ if k ~= "infra" and k ~= "validators" and k ~= "protocol" and not isValidAddr(k) then
+ assert(false, 'invalid allocation address')
+ end
+ end
+ dbs[msg.DB] = {
+ delegates = {},
+ stakes = {},
+ price = msg.Price,
+ stake = "0",
+ deposit = "0",
+ allocations = allocations,
+ db = msg.DB,
+ txs = 0,
+ node = msg.Node,
+ height = 0,
+ profit = "0",
+ min = msg["Min-Stake"],
+ blocks = {},
+ validators = tonumber(msg.Validators)
+ }
+ msg.reply({ Data = "db added!" })
+ end
+)
+
+Handlers.add(
+ "Get-Nodes",
+ "Get-Nodes",
+ function (msg)
+ Send({ Target = msg.From, Data = json.encode(nodes) })
+ end
+)
+
+Handlers.add(
+ "Get-Node",
+ "Get-Node",
+ function (msg)
+ assert(type(msg["Node"]) == 'string' and nodes[msg["Node"]] ~= nil, 'Valid Node is required!')
+ Send({ Target = msg.From, Data = json.encode(nodes[msg.Node] or nil) })
+ end
+)
+
+Handlers.add(
+ "Get-DB",
+ "Get-DB",
+ function (msg)
+ assert(type(msg["DB"]) == 'string' and dbs[msg["DB"]] ~= nil, 'Valid DB is required!')
+ Send({ Target = msg.From, Data = json.encode(dbs[msg.DB]) })
+ end
+)
+
+Handlers.add(
+ "Get-DBs",
+ "Get-DBs",
+ function (msg)
+ Send({ Target = msg.From, Data = json.encode(dbs) })
+ end
+)
+
+local getStakes = function (addr, deposit, timestamp, unstake)
+ local deadline = m.add(rewards.duration, rewards.start)
+ if bint.__le(bint(deadline), bint(timestamp)) then timestamp = deadline end
+ local r = m.div(m.mul(rewards.pool, m.sub(timestamp, rewards.ts)), rewards.duration)
+ if bint(rewards.total) > 0 then rewards.k = m.add(rewards.k, m.div(r, m.div(rewards.total, ten16))) end
+ rewards.stakes[addr] = rewards.stakes[addr] or { amount = 0, k = rewards.k, bal = 0 }
+ rewards.ts = timestamp
+ local amount = "0"
+ if unstake then
+ amount = deposit
+ else
+ amount = rewards.stakes[addr].amount
+ end
+ local reward = m.mul(
+ m.div(amount, ten16),
+ m.sub(rewards.k, rewards.stakes[addr].k)
+ )
+ rewards.stakes[addr].bal = m.add(rewards.stakes[addr].bal, reward)
+ rewards.stakes[addr].k = rewards.k
+end
+
+local getStakes2 = function (addr, timestamp, unstake)
+ local deadline = m.add(rewards.duration, rewards.start)
+ if bint.__le(bint(deadline), bint(timestamp)) then timestamp = deadline end
+ local r = m.div(m.mul(rewards.pool, m.sub(timestamp, rewards.ts)), rewards.duration)
+ local k = rewards.k
+ if bint(rewards.total) > 0 then k = m.add(rewards.k, m.div(r, m.div(rewards.total, ten16))) end
+ local amount = "0"
+ local k2 = k
+ local bal = "0"
+ if rewards.stakes[addr] ~= nil then
+ amount = rewards.stakes[addr].amount
+ k2 = rewards.stakes[addr].k
+ bal = rewards.stakes[addr].bal
+ end
+
+ local reward = m.mul( m.div(amount, ten16), m.sub(k, k2))
+ return m.add(bal, reward)
+end
+
+local stake = function(addr, deposit, timestamp)
+ getStakes(addr, deposit, timestamp)
+ rewards.stakes[addr].amount = m.add(rewards.stakes[addr].amount, deposit)
+ rewards.total = m.add(rewards.total, deposit)
+end
+
+local unstake = function(addr, deposit, timestamp)
+ getStakes(addr, deposit, timestamp, true)
+ rewards.stakes[addr].amount = m.sub(rewards.stakes[addr].amount, deposit)
+ rewards.total = m.sub(rewards.total, deposit)
+end
+
+local getReward = function(addr, timestamp)
+ getStakes(addr, nil, timestamp)
+ return rewards.stakes[addr].bal
+end
+
+
+Handlers.add(
+ "Stake",
+ "Credit-Notice",
+ function (msg)
+ local qty = m.mul(m.div(msg.Quantity, ten16), ten16)
+ if msg.From == aoETH then
+ if msg["X-Action"] == "Add-Node" then
+ assert(type(msg["X-URL"]) == 'string', 'X-URL is required!')
+ assert(bint.__le(bint(minETH), bint(qty)), 'Deposit not enough!')
+ count = count + 1
+ nodes[tostring(count)] = { url = msg["X-URL"], admin = msg.Sender, deposit = qty, dbs = {} }
+ TotalStake = m.add(TotalStake, qty)
+ msg.reply({ Data = "node added!" })
+ else
+ assert(type(msg["X-DB"]) == 'string' and dbs[msg["X-DB"]] ~= nil, 'Valid DB is required!')
+ local db = dbs[msg["X-DB"]]
+ if msg["X-Action"] == "Delegate" then
+ local to = msg["X-Delegate-To"]
+ assert(type(to) == 'string' and db.delegates[to] ~= nil, 'Valid Delegate-To is required!')
+ db.delegates[to][msg.Sender] = db.delegates[to][msg.Sender] or "0"
+ db.delegates[to][msg.Sender] = m.add(db.delegates[to][msg.Sender], qty)
+ stake(msg.Sender, qty, msg.Timestamp)
+ else
+ db.stakes[msg.Sender] = db.stakes[msg.Sender] or "0"
+ db.delegates[msg.Sender] = db.delegates[msg.Sender] or {}
+ db.stakes[msg.Sender] = m.add(db.stakes[msg.Sender], qty)
+ stake(msg.Sender, qty, msg.Timestamp)
+ end
+ db.stake = m.add(db.stake, qty)
+ TotalStake = m.add(TotalStake, qty)
+ msg.reply({ Data = "staked!" })
+ end
+ elseif msg.From == dbToken then
+ if msg["X-Action"] == "Set-Reward" then
+ assert(msg.Sender == ao.env.Process.Owner, "only process owner can execute!")
+ assert(rewards == nil, 'Rewards have already been set!')
+ assert(bint.__lt(0, bint(msg["X-Duration"])), 'Duration must be greater than 0')
+ rewards = {
+ pool = msg.Quantity,
+ ts = msg.Timestamp,
+ start = msg.Timestamp,
+ duration = msg["X-Duration"],
+ k = "0",
+ total = "0",
+ stakes = {}
+ }
+ msg.reply({ Data = "reward set!" })
+ elseif type(msg["X-DB"]) == 'string' and dbs[msg["X-DB"]] ~= nil then
+ local db = dbs[msg["X-DB"]]
+ db.deposit = m.add(db.deposit, msg.Quantity)
+ TotalDeposit = m.add(TotalDeposit, msg.Quantity)
+ msg.reply({ Data = "depositted!" })
+ else
+ TotalReward = m.add(TotalReward, msg.Quantity)
+ msg.reply({ Data = "protocol depositted!" })
+ end
+ end
+ end
+)
+
+Handlers.add(
+ "Withdraw",
+ "Withdraw",
+ function (msg)
+ assert(type(msg["DB"]) == 'string' and dbs[msg["DB"]] ~= nil, 'Valid DB is required!')
+ assert(type(msg.Quantity) == 'string', 'Quantity is required!')
+ local qty = m.mul(m.div(msg.Quantity, ten16), ten16)
+ local db = dbs[msg["DB"]]
+ local staked = "0"
+ if type(msg["Delegate-To"]) == "string" then
+ assert(isValidAddr(msg["Delegate-To"]), "Invalid Delegate-To address!")
+ staked = db.delegates[msg["Delegate-To"]][msg.From] or "0"
+ assert(bint.__le(bint(qty), bint(staked)), "Staked amount is not enough!")
+ db.delegates[msg["Delegate-To"]][msg.From] = m.sub(staked, qty)
+ else
+ staked = db.stakes[msg.From] or "0"
+ assert(bint.__le(bint(qty), bint(staked)), "Staked amount is not enough!")
+ db.stakes[msg.From] = m.sub(staked, qty)
+ end
+ unstake(msg.From, qty, msg.Timestamp)
+ Send({
+ Target = aoETH,
+ Action = "Transfer",
+ Recipient = msg.From,
+ Quantity = qty
+ })
+ TotalStake = m.sub(TotalStake, qty)
+ db.stake = m.sub(db.stake, qty)
+ msg.reply({ Data = "withdrew!" })
+ end
+)
+
+Handlers.add(
+ "Withdraw-DB",
+ "Withdraw-DB",
+ function (msg)
+ local bal = Balances[msg.From] or "0"
+ RewardWithdraws[msg.From] = RewardWithdraws[msg.From] or "0"
+ RewardWithdraws[msg.From] = m.add(RewardWithdraws[msg.From], bal)
+ Balances[msg.From] = "0"
+
+ if rewards.stakes[msg.From] ~= nil then
+ local r = getReward(msg.From, msg.Timestamp)
+ bal = m.add(bal, r)
+ Withdraws[msg.From] = Withdraws[msg.From] or "0"
+ Withdraws[msg.From] = m.add(Withdraws[msg.From], r)
+ rewards.stakes[msg.From].bal = "0"
+ end
+ assert(bint.__lt(0, bint(bal)), "Balance is zero!")
+ Send({
+ Target = dbToken,
+ Action = "Transfer",
+ Recipient = msg.From,
+ Quantity = bal
+ })
+ msg.reply({ Data = "withdrew!" })
+ end
+)
+
+Handlers.add(
+ 'info',
+ "Info",
+ function(msg)
+ msg.reply(
+ {
+ Data = json.encode({
+ NodeCount = tostring(count),
+ MinETH = minETH,
+ TotalStake = TotalStake,
+ TotalDeposit = TotalDeposit,
+ TotalReward = TotalReward,
+ Rewards = rewards or nil
+ })
+ })
+ end
+)
+
+Handlers.add(
+ "Rollup",
+ "Rollup",
+ function (msg)
+ local db = dbs[msg.From]
+ assert(db ~= nil, 'DB does not exist!')
+ assert(type(msg.TxID) == "string" and isValidAddr(msg.TxID), 'TxID is required!')
+ assert(bint.__lt(0, bint(msg.Block)), 'Block is required!')
+ assert(bint.__lt(0, bint(msg.Txs)), 'Txs is required!')
+ local info = nodes[db.node].dbs[db.db]
+ local price = m.mul(msg.Txs, db.price)
+ assert(bint.__le(bint(price), bint(db.deposit)), 'Deposit is not enough!')
+ local block = db.blocks[msg.Block]
+ assert(block == nil, 'Block already exists!')
+ db.deposit = m.sub(db.deposit, price)
+ db.blocks[msg.Block] = {
+ txid = msg.TxID,
+ txs = msg.Txs,
+ validators = {},
+ validated_count = 0,
+ finalized = false
+ }
+ msg.reply({ Data = "rolled up!" })
+ end
+)
+
+Handlers.add(
+ "Validate",
+ "Validate",
+ function (msg)
+ assert(type(msg.DB) == "string", 'DB is required!')
+ local db = dbs[msg.DB]
+ assert(db ~= nil, 'DB does not exist!')
+ assert(tonumber(msg.Block) - 1 == db.height, 'Current Block is required!')
+ local block = db.blocks[msg.Block]
+ assert(block ~= nil, 'Block does not exist!')
+ assert(block.finalized == false, 'Block has been finalized!')
+ assert(type(msg["TxID"]) == "string" and block.txid == msg["TxID"], 'Valid TxID is required!')
+ local info = nodes[db.node].dbs[db.db]
+ assert(bint.__le(bint(db.min), bint(db.stakes[msg.From])), 'Min Stake is required!')
+ assert(block.validators[msg.From] == nil, 'Already validated!')
+ block.validators[msg.From] = true
+ block.validated_count = block.validated_count + 1
+ if block.validated_count == db.validators then
+ local price = m.mul(block.txs, db.price)
+ db.txs = db.txs + tonumber(block.txs)
+ block.finalized = true
+ db.height = db.height + 1
+ db.profit = m.add(db.profit, price)
+ local total_alloc = "0"
+ for k, v in pairs(db.allocations) do
+ total_alloc = m.add(total_alloc, v)
+ end
+ local total = price
+ local validator_total = "0"
+ local reward_base = "0"
+ for k, v in pairs(db.allocations) do
+ local amount = m.div(m.mul(price, v), total_alloc)
+ if k == "protocol" then
+ total = m.sub(total, amount)
+ Balances[ao.id] = Balances[ao.id] or "0"
+ Balances[ao.id] = m.add(Balances[ao.id], amount)
+ elseif k == "validators" then
+ reward_base = amount
+ elseif k ~= "infra" then
+ total = m.sub(total, amount)
+ Balances[k] = Balances[k] or "0"
+ Balances[k] = m.add(Balances[k], amount)
+ end
+ end
+ for k, v in pairs(block.validators) do
+ validator_total = m.add(validator_total, db.stakes[k])
+ for k2, v2 in pairs(db.delegates[k]) do
+ validator_total = m.add(validator_total, v2)
+ end
+ end
+ local admin = nodes[db.node].admin
+ Balances[admin] = Balances[admin] or "0"
+ for k, v in pairs(block.validators) do
+ Balances[k] = Balances[k] or "0"
+ local v_reward = m.div(m.mul(reward_base, db.stakes[k]), validator_total)
+ Balances[k] = m.add(Balances[k], v_reward)
+ total = m.sub(total, v_reward)
+ for k2, v2 in pairs(db.delegates[k]) do
+ Balances[k2] = Balances[k2] or "0"
+ local v_reward = m.div(m.mul(reward_base, v2), validator_total)
+ Balances[k2] = m.add(Balances[k2], v_reward)
+ total = m.sub(total, v_reward)
+ end
+ end
+ Balances[admin] = m.add(Balances[admin], total)
+ msg.reply({ Data = "finalized!" })
+ Send({ Target = msg.DB, Action = "Finalize", ["Block-Height"] = msg.Block, TxID = block.txid })
+ end
+ msg.reply({ Data = "validated!" })
+ end
+)
+
+
+function getBalance(addr,ts)
+ local bal = '0'
+ local yield = '0'
+ if (Balances[addr]) then bal = Balances[addr] end
+ if (rewards.stakes[addr]) then yield = getStakes2(addr, ts) end
+ local obj = {
+ Yield = yield,
+ Balance = bal,
+ Total = m.add(bal, yield),
+ Ticker = Ticker,
+ Account = addr,
+ Timestamp = ts
+ }
+ return obj
+end
+
+
+Handlers.add(
+ 'balance',
+ "Balance",
+ function(msg)
+ local addr = msg.Tags.Recipient or msg.Tags.Target or msg.From
+ local timestamp = msg.TS or msg.Timestamp
+ local obj = getBalance(addr, timestamp)
+ msg.reply({ Tags = obj, Data = json.encode(obj) })
+ end
+)
+
+Handlers.add(
+ 'balances',
+ "Balances",
+ function(msg)
+ msg.reply({ Data = json.encode(Balances) })
+ end
+)
+
+Handlers.add(
+ 'Get-Stats',
+ "Get-Stats",
+ function(msg)
+ local addr = msg.Address or msg.From
+ assert(isValidAddr(addr), "Invalid address!")
+ local timestamp = msg.TS or msg.Timestamp
+ local bal = getBalance(addr, timestamp)
+ local stake = 0
+ local delegated = 0
+ local stakes = {}
+
+ for k, v in pairs(dbs) do
+ for k2, v2 in pairs(v.stakes) do
+ if k2 == addr then
+ stake = m.add(stake, v2)
+ stakes[k] = stakes[k] or { stake = "0", delegated = "0" }
+ stakes[k].stake = m.add(stakes[k].stake, v2)
+ end
+ end
+ for k2, v2 in pairs(v.delegates) do
+ for k3, v3 in pairs(v2) do
+ if k3 == addr then
+ stakes[k] = stakes[k] or { stake = "0", delegated = "0" }
+ stake = m.add(stake, v3)
+ stakes[k].stake = m.add(stakes[k].stake, v3)
+ end
+ if k2 == addr then
+ stakes[k] = stakes[k] or { stake = "0", delegated = "0" }
+ delegated = m.add(delegated, v3)
+ stakes[k].delegated = m.add(stakes[k].delegated, v3)
+ end
+ end
+ end
+ end
+
+ local stats = {
+ yield = bal.Yield,
+ withdraw = Withdraws[msg["Address"]] or "0",
+ reward_withdraw = RewardWithdraws[msg["Address"]] or "0",
+ reward = bal.Balance,
+ stake = stake,
+ stakes = stakes,
+ delegated = delegated,
+ timestamp = timestamp
+ }
+ msg.reply({ Data = json.encode(stats) })
+ end
+)
diff --git a/lua/contracts/staking2.lua b/lua/contracts/staking2.lua
new file mode 100644
index 0000000..b5a7c6c
--- /dev/null
+++ b/lua/contracts/staking2.lua
@@ -0,0 +1,119 @@
+local json = require("json")
+local bint = require('.bint')(256)
+
+local m = {
+ add = function(a, b)
+ return tostring(bint(a) + bint(b))
+ end,
+ sub = function(a, b)
+ return tostring(bint(a) - bint(b))
+ end,
+ mul = function(a, b)
+ return tostring(bint(a) * bint(b))
+ end,
+ div = function(a, b)
+ return tostring(math.floor(bint(a) / bint(b)))
+ end,
+ toBalanceValue = function(a)
+ return tostring(bint(a))
+ end,
+ toNumber = function(a)
+ return bint.tonumber(a)
+ end,
+ floor = function(a)
+ return tostring(math.floor(bint.tonumber(a)))
+ end,
+ ceil = function(a)
+ return tostring(math.ceil(bint.tonumber(a)))
+ end
+}
+
+local pool = nil
+local stakes = {}
+local total = "0"
+local ts = nil
+local start = nil
+local k = "0"
+local dur = nil
+
+local getStakes = function (addr, deposit, timestamp, unstake)
+ local deadline = m.add(dur, start)
+ if bint.__le(bint(deadline), bint(timestamp)) then timestamp = deadline end
+ local r = m.div(m.mul(pool, m.sub(timestamp, ts)), dur)
+ if bint(total) > 0 then k = m.add(k, m.div(r, total)) end
+ stakes[addr] = stakes[addr] or { amount = 0, k = k, bal = 0 }
+ ts = timestamp
+ local amount = "0"
+ if unstake then
+ amount = deposit
+ else
+ amount = stakes[addr].amount
+ end
+ local reward = m.mul(amount, (m.sub(k, stakes[addr].k)))
+ stakes[addr].bal = m.add(stakes[addr].bal, reward)
+end
+
+Handlers.add(
+ 'setup',
+ "setup",
+ function(msg)
+ pool = msg.pool
+ ts = msg.ts
+ start = msg.ts
+ dur = msg.dur
+ msg.reply({ Data = "set!" })
+ end
+)
+
+Handlers.add(
+ 'stake',
+ "stake",
+ function(msg)
+ deposit = msg.deposit
+ addr = msg.addr
+ getStakes(addr, deposit, msg.ts)
+ stakes[addr].amount = m.add(stakes[addr].amount, deposit)
+ stakes[addr].k = k
+ total = m.add(total, deposit)
+ msg.reply({ Data = "staked!" })
+ end
+)
+
+Handlers.add(
+ 'unstake',
+ "unstake",
+ function(msg)
+ deposit = msg.deposit
+ addr = msg.addr
+ getStakes(addr, deposit, msg.ts, true)
+ stakes[addr].amount = m.sub(stakes[addr].amount, deposit)
+ total = m.sub(total, deposit)
+ msg.reply({ Data = "unstaked!" })
+ end
+)
+
+Handlers.add(
+ 'info',
+ "info",
+ function(msg)
+ msg.reply({
+ Data = json.encode({
+ stakes = stakes,
+ pool = pool,
+ total = total,
+ ts = ts,
+ k = k
+ })
+ })
+ end
+)
+
+Handlers.add(
+ 'get',
+ "get",
+ function(msg)
+ addr = msg.addr
+ getStakes(addr, nil, msg.ts)
+ msg.reply({ Data = json.encode({ amount = stakes[addr].bal, addr = addr, ts = ts }) })
+ end
+)
diff --git a/lua/contracts/staking_mock.lua b/lua/contracts/staking_mock.lua
new file mode 100644
index 0000000..4c1f5dd
--- /dev/null
+++ b/lua/contracts/staking_mock.lua
@@ -0,0 +1,21 @@
+local json = require("json")
+local bint = require('.bint')(256)
+
+Handlers.add(
+ 'Rollup',
+ "Rollup",
+ function(msg)
+ msg.reply({ Data = "rolled up!" })
+ end
+)
+
+
+Handlers.add(
+ 'Finalize',
+ "Finalize",
+ function(msg)
+ Send({ Target = msg.to, Action = "Finalize", ["Block-Height"] = msg.height, TxID = msg.txid })
+ msg.reply({ Data = "finalized!" })
+ end
+)
+
diff --git a/lua/contracts/tDB.lua b/lua/contracts/tDB.lua
new file mode 100644
index 0000000..2dcda30
--- /dev/null
+++ b/lua/contracts/tDB.lua
@@ -0,0 +1,245 @@
+local json = require("json")
+local bint = require('.bint')(256)
+
+Variant = "0.0.3"
+
+local utils = {
+ add = function(a, b)
+ return tostring(bint(a) + bint(b))
+ end,
+ subtract = function(a, b)
+ return tostring(bint(a) - bint(b))
+ end,
+ toBalanceValue = function(a)
+ return tostring(bint(a))
+ end,
+ toNumber = function(a)
+ return bint.tonumber(a)
+ end
+}
+
+Denomination = Denomination or 12
+Balances = Balances or { [ao.id] = "0" }
+TotalSupply = TotalSupply or utils.toBalanceValue(0)
+Name = 'Testnet DB'
+Ticker = 'tDB'
+Logo = 'sUvAzEo-s7JwDV3_JgRCo5uwjaV5koBIi5eFe0sFjCc'
+
+Handlers.add(
+ 'info',
+ "Info",
+ function(msg)
+ if msg.reply then
+ msg.reply({
+ Name = Name,
+ Ticker = Ticker,
+ Logo = Logo,
+ Denomination = tostring(Denomination)
+ })
+ else
+ Send({Target = msg.From,
+ Name = Name,
+ Ticker = Ticker,
+ Logo = Logo,
+ Denomination = tostring(Denomination)
+ })
+ end
+ end
+)
+
+Handlers.add(
+ 'balance',
+ "Balance",
+ function(msg)
+ local bal = '0'
+
+ if (msg.Tags.Recipient) then
+ if (Balances[msg.Tags.Recipient]) then
+ bal = Balances[msg.Tags.Recipient]
+ end
+ elseif msg.Tags.Target and Balances[msg.Tags.Target] then
+ bal = Balances[msg.Tags.Target]
+ elseif Balances[msg.From] then
+ bal = Balances[msg.From]
+ end
+ if msg.reply then
+ msg.reply({
+ Balance = bal,
+ Ticker = Ticker,
+ Account = msg.Tags.Recipient or msg.From,
+ Data = bal
+ })
+ else
+ Send({
+ Target = msg.From,
+ Balance = bal,
+ Ticker = Ticker,
+ Account = msg.Tags.Recipient or msg.From,
+ Data = bal
+ })
+ end
+ end
+)
+
+Handlers.add(
+ 'balances',
+ "Balances",
+ function(msg)
+ if msg.reply then
+ msg.reply({ Data = json.encode(Balances) })
+ else
+ Send({Target = msg.From, Data = json.encode(Balances) })
+ end
+ end
+)
+
+Handlers.add(
+ 'transfer',
+ "Transfer",
+ function(msg)
+ assert(type(msg.Recipient) == 'string', 'Recipient is required!')
+ assert(type(msg.Quantity) == 'string', 'Quantity is required!')
+ assert(bint.__lt(0, bint(msg.Quantity)), 'Quantity must be greater than 0')
+
+ if not Balances[msg.From] then Balances[msg.From] = "0" end
+ if not Balances[msg.Recipient] then Balances[msg.Recipient] = "0" end
+
+ if bint(msg.Quantity) <= bint(Balances[msg.From]) then
+ Balances[msg.From] = utils.subtract(Balances[msg.From], msg.Quantity)
+ Balances[msg.Recipient] = utils.add(Balances[msg.Recipient], msg.Quantity)
+
+ if not msg.Cast then
+ local debitNotice = {
+ Action = 'Debit-Notice',
+ Recipient = msg.Recipient,
+ Quantity = msg.Quantity,
+ Data = Colors.gray ..
+ "You transferred " ..
+ Colors.blue .. msg.Quantity .. Colors.gray .. " to " .. Colors.green .. msg.Recipient .. Colors.reset
+ }
+ local creditNotice = {
+ Target = msg.Recipient,
+ Action = 'Credit-Notice',
+ Sender = msg.From,
+ Quantity = msg.Quantity,
+ Data = Colors.gray ..
+ "You received " ..
+ Colors.blue .. msg.Quantity .. Colors.gray .. " from " .. Colors.green .. msg.From .. Colors.reset
+ }
+
+ for tagName, tagValue in pairs(msg) do
+ if string.sub(tagName, 1, 2) == "X-" then
+ debitNotice[tagName] = tagValue
+ creditNotice[tagName] = tagValue
+ end
+ end
+
+ if msg.reply then
+ msg.reply(debitNotice)
+ else
+ debitNotice.Target = msg.From
+ Send(debitNotice)
+ end
+ Send(creditNotice)
+ end
+ else
+ if msg.reply then
+ msg.reply({
+ Action = 'Transfer-Error',
+ ['Message-Id'] = msg.Id,
+ Error = 'Insufficient Balance!'
+ })
+ else
+ Send({
+ Target = msg.From,
+ Action = 'Transfer-Error',
+ ['Message-Id'] = msg.Id,
+ Error = 'Insufficient Balance!'
+ })
+ end
+ end
+ end
+)
+
+Handlers.add(
+ 'mint',
+ "Mint",
+ function(msg)
+ assert(type(msg.Quantity) == 'string', 'Quantity is required!')
+ assert(bint(0) < bint(msg.Quantity), 'Quantity must be greater than zero!')
+
+ if not Balances[ao.id] then Balances[ao.id] = "0" end
+ if msg.From == ao.env.Process.Owner then
+ Balances[msg.From] = Balances[msg.From] or "0"
+ Balances[msg.From] = utils.add(Balances[msg.From], msg.Quantity)
+ TotalSupply = utils.add(TotalSupply, msg.Quantity)
+ if msg.reply then
+ msg.reply({
+ Data = Colors.gray .. "Successfully minted " .. Colors.blue .. msg.Quantity .. Colors.reset
+ })
+ else
+ Send({
+ Target = msg.From,
+ Data = Colors.gray .. "Successfully minted " .. Colors.blue .. msg.Quantity .. Colors.reset
+ })
+ end
+ else
+ if msg.reply then
+ msg.reply({
+ Action = 'Mint-Error',
+ ['Message-Id'] = msg.Id,
+ Error = 'Only the Process Owner can mint new ' .. Ticker .. ' tokens!'
+ })
+ else
+ Send({
+ Target = msg.From,
+ Action = 'Mint-Error',
+ ['Message-Id'] = msg.Id,
+ Error = 'Only the Process Owner can mint new ' .. Ticker .. ' tokens!'
+ })
+ end
+ end
+ end
+)
+
+Handlers.add(
+ 'totalSupply',
+ "Total-Supply",
+ function(msg)
+ assert(msg.From ~= ao.id, 'Cannot call Total-Supply from the same process!')
+ if msg.reply then
+ msg.reply({
+ Action = 'Total-Supply',
+ Data = TotalSupply,
+ Ticker = Ticker
+ })
+ else
+ Send({
+ Target = msg.From,
+ Action = 'Total-Supply',
+ Data = TotalSupply,
+ Ticker = Ticker
+ })
+ end
+ end
+)
+
+Handlers.add(
+ 'burn',
+ 'Burn',
+ function(msg)
+ assert(type(msg.Tags.Quantity) == 'string', 'Quantity is required!')
+ assert(bint(msg.Tags.Quantity) <= bint(Balances[msg.From]), 'Quantity must be less than or equal to the current balance!')
+
+ Balances[msg.From] = utils.subtract(Balances[msg.From], msg.Tags.Quantity)
+ TotalSupply = utils.subtract(TotalSupply, msg.Tags.Quantity)
+ if msg.reply then
+ msg.reply({
+ Data = Colors.gray .. "Successfully burned " .. Colors.blue .. msg.Tags.Quantity .. Colors.reset
+ })
+ else
+ Send({Target = msg.From, Data = Colors.gray .. "Successfully burned " .. Colors.blue .. msg.Tags.Quantity .. Colors.reset })
+ end
+ end
+)
+
diff --git a/lua/contracts/taoETH.lua b/lua/contracts/taoETH.lua
new file mode 100644
index 0000000..2e18eb9
--- /dev/null
+++ b/lua/contracts/taoETH.lua
@@ -0,0 +1,244 @@
+local json = require("json")
+local bint = require('.bint')(256)
+
+Variant = "0.0.3"
+
+local utils = {
+ add = function(a, b)
+ return tostring(bint(a) + bint(b))
+ end,
+ subtract = function(a, b)
+ return tostring(bint(a) - bint(b))
+ end,
+ toBalanceValue = function(a)
+ return tostring(bint(a))
+ end,
+ toNumber = function(a)
+ return bint.tonumber(a)
+ end
+}
+
+Denomination = Denomination or 18
+Balances = Balances or { [ao.id] = "0" }
+TotalSupply = TotalSupply or utils.toBalanceValue(0)
+Name = 'Testnet aoETH'
+Ticker = 'taoETH'
+Logo = 'PqcXGDozV28R_UgH4OpdroqXvkG4JGtaheDjuXde4lI'
+
+Handlers.add(
+ 'info',
+ "Info",
+ function(msg)
+ if msg.reply then
+ msg.reply({
+ Name = Name,
+ Ticker = Ticker,
+ Logo = Logo,
+ Denomination = tostring(Denomination)
+ })
+ else
+ Send({Target = msg.From,
+ Name = Name,
+ Ticker = Ticker,
+ Logo = Logo,
+ Denomination = tostring(Denomination)
+ })
+ end
+ end
+)
+
+Handlers.add(
+ 'balance',
+ "Balance",
+ function(msg)
+ local bal = '0'
+
+ if (msg.Tags.Recipient) then
+ if (Balances[msg.Tags.Recipient]) then
+ bal = Balances[msg.Tags.Recipient]
+ end
+ elseif msg.Tags.Target and Balances[msg.Tags.Target] then
+ bal = Balances[msg.Tags.Target]
+ elseif Balances[msg.From] then
+ bal = Balances[msg.From]
+ end
+ if msg.reply then
+ msg.reply({
+ Balance = bal,
+ Ticker = Ticker,
+ Account = msg.Tags.Recipient or msg.From,
+ Data = bal
+ })
+ else
+ Send({
+ Target = msg.From,
+ Balance = bal,
+ Ticker = Ticker,
+ Account = msg.Tags.Recipient or msg.From,
+ Data = bal
+ })
+ end
+ end
+)
+
+Handlers.add(
+ 'balances',
+ "Balances",
+ function(msg)
+ if msg.reply then
+ msg.reply({ Data = json.encode(Balances) })
+ else
+ Send({Target = msg.From, Data = json.encode(Balances) })
+ end
+ end
+)
+
+Handlers.add(
+ 'transfer',
+ "Transfer",
+ function(msg)
+ assert(type(msg.Recipient) == 'string', 'Recipient is required!')
+ assert(type(msg.Quantity) == 'string', 'Quantity is required!')
+ assert(bint.__lt(0, bint(msg.Quantity)), 'Quantity must be greater than 0')
+
+ if not Balances[msg.From] then Balances[msg.From] = "0" end
+ if not Balances[msg.Recipient] then Balances[msg.Recipient] = "0" end
+
+ if bint(msg.Quantity) <= bint(Balances[msg.From]) then
+ Balances[msg.From] = utils.subtract(Balances[msg.From], msg.Quantity)
+ Balances[msg.Recipient] = utils.add(Balances[msg.Recipient], msg.Quantity)
+
+ if not msg.Cast then
+ local debitNotice = {
+ Action = 'Debit-Notice',
+ Recipient = msg.Recipient,
+ Quantity = msg.Quantity,
+ Data = Colors.gray ..
+ "You transferred " ..
+ Colors.blue .. msg.Quantity .. Colors.gray .. " to " .. Colors.green .. msg.Recipient .. Colors.reset
+ }
+ local creditNotice = {
+ Target = msg.Recipient,
+ Action = 'Credit-Notice',
+ Sender = msg.From,
+ Quantity = msg.Quantity,
+ Data = Colors.gray ..
+ "You received " ..
+ Colors.blue .. msg.Quantity .. Colors.gray .. " from " .. Colors.green .. msg.From .. Colors.reset
+ }
+
+ for tagName, tagValue in pairs(msg) do
+ if string.sub(tagName, 1, 2) == "X-" then
+ debitNotice[tagName] = tagValue
+ creditNotice[tagName] = tagValue
+ end
+ end
+
+ if msg.reply then
+ msg.reply(debitNotice)
+ else
+ debitNotice.Target = msg.From
+ Send(debitNotice)
+ end
+ Send(creditNotice)
+ end
+ else
+ if msg.reply then
+ msg.reply({
+ Action = 'Transfer-Error',
+ ['Message-Id'] = msg.Id,
+ Error = 'Insufficient Balance!'
+ })
+ else
+ Send({
+ Target = msg.From,
+ Action = 'Transfer-Error',
+ ['Message-Id'] = msg.Id,
+ Error = 'Insufficient Balance!'
+ })
+ end
+ end
+ end
+)
+
+Handlers.add(
+ 'mint',
+ "Mint",
+ function(msg)
+ assert(type(msg.Quantity) == 'string', 'Quantity is required!')
+ assert(bint(0) < bint(msg.Quantity), 'Quantity must be greater than zero!')
+
+ if not Balances[ao.id] then Balances[ao.id] = "0" end
+ if msg.From == ao.env.Process.Owner then
+ Balances[msg.From] = Balances[msg.From] or "0"
+ Balances[msg.From] = utils.add(Balances[msg.From], msg.Quantity)
+ TotalSupply = utils.add(TotalSupply, msg.Quantity)
+ if msg.reply then
+ msg.reply({
+ Data = Colors.gray .. "Successfully minted " .. Colors.blue .. msg.Quantity .. Colors.reset
+ })
+ else
+ Send({
+ Target = msg.From,
+ Data = Colors.gray .. "Successfully minted " .. Colors.blue .. msg.Quantity .. Colors.reset
+ })
+ end
+ else
+ if msg.reply then
+ msg.reply({
+ Action = 'Mint-Error',
+ ['Message-Id'] = msg.Id,
+ Error = 'Only the Process Owner can mint new ' .. Ticker .. ' tokens!'
+ })
+ else
+ Send({
+ Target = msg.From,
+ Action = 'Mint-Error',
+ ['Message-Id'] = msg.Id,
+ Error = 'Only the Process Owner can mint new ' .. Ticker .. ' tokens!'
+ })
+ end
+ end
+ end
+)
+
+Handlers.add(
+ 'totalSupply',
+ "Total-Supply",
+ function(msg)
+ assert(msg.From ~= ao.id, 'Cannot call Total-Supply from the same process!')
+ if msg.reply then
+ msg.reply({
+ Action = 'Total-Supply',
+ Data = TotalSupply,
+ Ticker = Ticker
+ })
+ else
+ Send({
+ Target = msg.From,
+ Action = 'Total-Supply',
+ Data = TotalSupply,
+ Ticker = Ticker
+ })
+ end
+ end
+)
+
+Handlers.add(
+ 'burn',
+ 'Burn',
+ function(msg)
+ assert(type(msg.Tags.Quantity) == 'string', 'Quantity is required!')
+ assert(bint(msg.Tags.Quantity) <= bint(Balances[msg.From]), 'Quantity must be less than or equal to the current balance!')
+
+ Balances[msg.From] = utils.subtract(Balances[msg.From], msg.Tags.Quantity)
+ TotalSupply = utils.subtract(TotalSupply, msg.Tags.Quantity)
+ if msg.reply then
+ msg.reply({
+ Data = Colors.gray .. "Successfully burned " .. Colors.blue .. msg.Tags.Quantity .. Colors.reset
+ })
+ else
+ Send({Target = msg.From, Data = Colors.gray .. "Successfully burned " .. Colors.blue .. msg.Tags.Quantity .. Colors.reset })
+ end
+ end
+)
diff --git a/lua/contracts/weavedb.lua b/lua/contracts/weavedb.lua
new file mode 100644
index 0000000..158a4f7
--- /dev/null
+++ b/lua/contracts/weavedb.lua
@@ -0,0 +1,605 @@
+local json = require("json")
+
+data = data or {}
+cache = cache or {}
+block = block or 0
+
+init = init or false
+if bundler ~= '' then bundler = '' end
+if staking ~= '' then staking = '' end
+
+local function err(message)
+ error(message)
+end
+
+local function is_nil(v) return v == nil end
+local function is_number(v) return type(v) == "number" end
+local function is_string(v) return type(v) == "string" end
+local function is_table(v) return type(v) == "table" end
+
+local function includes(item, list)
+ if type(list) ~= "table" then return false end
+ for _, v in ipairs(list) do if v == item then return true end end
+ return false
+end
+
+local function clone(t)
+ if type(t) ~= "table" then return t end
+ local result = {}
+ for k, v in pairs(t) do result[k] = type(v) == "table" and clone(v) or v end
+ return result
+end
+
+local function split_when(pred, query)
+ local path = {}
+ local opt = {}
+ local split_index = nil
+ for i, v in ipairs(query) do
+ if not is_string(v) and not split_index then split_index = i break end
+ end
+ if split_index then
+ for i = 1, split_index - 1 do table.insert(path, query[i]) end
+ for i = split_index, #query do table.insert(opt, query[i]) end
+ else
+ path = query
+ end
+ return path, opt
+end
+
+local function _parser(query)
+ local path, opt = split_when(function(v) return not is_string(v) end, query)
+ if is_nil(path) or #path == 0 then return nil end
+ if not is_table(opt) then return nil end
+
+ local q = { path = path }
+ local _filter = { ["=="] = {} }
+ local _keys = {}
+ local _ranges = {}
+ local _range_field = nil
+ local _sort = nil
+ local _startAt = nil
+ local _startAfter = nil
+ local _endAt = nil
+ local _endBefore = nil
+ local _startAtCursor = nil
+ local _startAfterCursor = nil
+ local _endAtCursor = nil
+ local _endBeforeCursor = nil
+
+ for _, v in ipairs(clone(opt)) do
+ if is_number(v) then
+ if is_nil(q.limit) then
+ if v > 1000 then return nil end
+ if v ~= math.floor(math.abs(v)) or v < 1 then return nil end
+ q.limit = v
+ else
+ return nil
+ end
+ elseif not is_table(v) then
+ return nil
+ else
+ if #v == 0 then
+ return nil
+ elseif v[1] == "startAt" then
+ if not is_nil(_startAt) or not is_nil(_startAfter) or
+ not is_nil(_startAtCursor) or not is_nil(_startAfterCursor) then
+ return nil
+ elseif #v <= 1 then
+ return nil
+ else
+ if type(v[2]) == "table" and v[2].__cursor__ then
+ _startAtCursor = v
+ _startAtCursor[2].data.__id__ = _startAtCursor[2].id
+ else
+ _startAt = v
+ end
+ end
+ elseif v[1] == "startAfter" then
+ if not is_nil(_startAt) or not is_nil(_startAfter) or
+ not is_nil(_startAtCursor) or not is_nil(_startAfterCursor) then
+ return nil
+ elseif #v <= 1 then
+ return nil
+ else
+ if type(v[2]) == "table" and v[2].__cursor__ then
+ _startAfterCursor = v
+ _startAfterCursor[2].data.__id__ = _startAfterCursor[2].id
+ else
+ _startAfter = v
+ end
+ end
+ elseif v[1] == "endAt" then
+ if not is_nil(_endAt) or not is_nil(_endBefore) or
+ not is_nil(_endAtCursor) or not is_nil(_endBeforeCursor) then
+ return nil
+ elseif #v <= 1 then
+ return nil
+ else
+ if type(v[2]) == "table" and v[2].__cursor__ then
+ _endAtCursor = v
+ _endAtCursor[2].data.__id__ = _endAtCursor[2].id
+ else
+ _endAt = v
+ end
+ end
+ elseif v[1] == "endBefore" then
+ if not is_nil(_endAt) or not is_nil(_endBefore) or
+ not is_nil(_endAtCursor) or not is_nil(_endBeforeCursor) then
+ return nil
+ elseif #v <= 1 then
+ return nil
+ else
+ if type(v[2]) == "table" and v[2].__cursor__ then
+ _endBeforeCursor = v
+ _endBeforeCursor[2].data.__id__ = _endBeforeCursor[2].id
+ else
+ _endBefore = v
+ end
+ end
+ elseif #v == 3 then
+ if includes(v[2], {
+ "==", "!=", ">", "<", ">=", "<=",
+ "in", "not-in", "array-contains", "array-contains-any"
+ }) then
+ if includes(v[2], {"array-contains", "array-contains-any"}) then
+ if not is_nil(_filter["array-contains"]) or
+ not is_nil(_filter["array-contains-any"]) then
+ return nil
+ end
+ if v[2] == "array-contains-any" and not is_table(v[3]) then
+ return nil
+ end
+ _filter[v[2]] = v
+ elseif includes(v[2], {"!=", "in", "not-in", ">", ">=", "<", "<="}) then
+ if includes(v[2], {"in", "not-in"}) and not is_table(v[3]) then
+ return nil
+ end
+ if includes(v[2], {">", ">=", "<", "<="}) then
+ if not is_nil(_filter["!="]) or not is_nil(_filter["in"]) or
+ not is_nil(_filter["not-in"]) then
+ return nil
+ end
+ if not is_nil(_range_field) and _range_field ~= v[1] then
+ return nil
+ elseif _ranges[v[2]] or
+ (v[2] == ">" and _ranges[">="]) or
+ (v[2] == ">=" and _ranges[">"]) or
+ (v[2] == "<" and _ranges["<="]) or
+ (v[2] == "<=" and _ranges["<"]) then
+ return nil
+ else
+ _filter.range = _filter.range or {}
+ table.insert(_filter.range, v)
+ _range_field = v[1]
+ _ranges[v[2]] = true
+ end
+ else
+ if not is_nil(_filter.range) or not is_nil(_filter["!="]) or
+ not is_nil(_filter["in"]) or not is_nil(_filter["not-in"]) then
+ return nil
+ end
+ _filter[v[2]] = v
+ end
+ elseif v[2] == "==" then
+ if not is_nil(_filter.range) or not is_nil(_filter["!="]) or
+ not is_nil(_filter["in"]) or not is_nil(_filter["not-in"]) then
+ return nil
+ elseif _keys[v[1]] then
+ return nil
+ end
+ table.insert(_filter["=="], v)
+ _keys[v[1]] = true
+ else
+ if not is_nil(_filter[v[2]]) then return nil end
+ _filter[v[2]] = v
+ end
+ else
+ return nil
+ end
+ elseif #v == 2 then
+ if includes(v[2], {"asc", "desc"}) then
+ if is_nil(_sort) then
+ _sort = {v}
+ else
+ table.insert(_sort, v)
+ end
+ else
+ return nil
+ end
+ elseif #v == 1 then
+ if is_nil(_sort) then
+ _sort = {{v[1], "asc"}}
+ else
+ table.insert(_sort, {v[1], "asc"})
+ end
+ else
+ return nil
+ end
+ end
+ end
+
+ q.limit = q.limit or 1000
+ q.start = _startAt or _startAfter or nil
+ q.end_ = _endAt or _endBefore or nil
+ q.startCursor = _startAtCursor or _startAfterCursor or nil
+ q.endCursor = _endAtCursor or _endBeforeCursor or nil
+ q.sort = _sort or {}
+ q.reverse = { start = false, end_ = false }
+ q.array = _filter["array-contains"] or _filter["array-contains-any"] or nil
+ q.equals = _filter["=="]
+
+ if _filter.range then
+ q.range = _filter.range
+ elseif not is_nil(_filter["in"]) then
+ q.range = {_filter["in"]}
+ elseif not is_nil(_filter["not-in"]) then
+ q.range = {_filter["not-in"]}
+ elseif not is_nil(_filter["!="]) then
+ q.range = {_filter["!="]}
+ else
+ q.range = nil
+ end
+
+ q.sortByTail = false
+ return q
+end
+
+
+
+local function get_table_keys(t)
+ local keys = {}
+ for k in pairs(t) do table.insert(keys, k) end
+ return keys
+end
+
+local function sort_docs(docs, sort_specs)
+ if #sort_specs == 0 then
+ sort_specs = {{"__id__", "asc"}}
+ end
+ table.sort(
+ docs,
+ function(a, b)
+ for _, spec in ipairs(sort_specs) do
+ local field, direction = spec[1], spec[2]
+ local aVal = field == "__id__" and a.__id__ or a[field]
+ local bVal = field == "__id__" and b.__id__ or b[field]
+
+ if aVal ~= bVal then
+ if direction == "asc" then
+ return aVal < bVal
+ else
+ return aVal > bVal
+ end
+ end
+ end
+ return false
+ end
+ )
+ return docs
+end
+
+local function matches_filters(doc, filters)
+ local id = doc.__id__
+
+ -- Handle equals
+ for _, filter in ipairs(filters.equals or {}) do
+ local field, _, value = table.unpack(filter)
+ if doc[field] ~= value then return false end
+ end
+
+ -- Handle array operations
+ if filters.array then
+ local field, op, value = table.unpack(filters.array)
+ if op == "array-contains" then
+ if not doc[field] or type(doc[field]) ~= "table" then return false end
+ local found = false
+ for _, v in ipairs(doc[field]) do
+ if v == value then found = true; break end
+ end
+ if not found then return false end
+ elseif op == "array-contains-any" then
+ if not doc[field] or type(doc[field]) ~= "table" then return false end
+ local found = false
+ for _, target in ipairs(value) do
+ for _, v in ipairs(doc[field]) do
+ if v == target then found = true; break end
+ end
+ if found then break end
+ end
+ if not found then return false end
+ end
+ end
+
+ -- Handle range operations
+ if filters.range then
+ for _, range in ipairs(filters.range) do
+ local field, op, value = table.unpack(range)
+ local doc_val = doc[field]
+
+ if op == ">" and not (doc_val > value) then return false end
+ if op == ">=" and not (doc_val >= value) then return false end
+ if op == "<" and not (doc_val < value) then return false end
+ if op == "<=" and not (doc_val <= value) then return false end
+ if op == "!=" and doc_val == value then return false end
+ if op == "in" then
+ local found = false
+ for _, v in ipairs(value) do
+ if doc_val == v then found = true; break end
+ end
+ if not found then return false end
+ end
+ if op == "not-in" then
+ for _, v in ipairs(value) do
+ if doc_val == v then return false end
+ end
+ end
+ end
+ end
+
+ return true
+end
+
+local function apply_cursor(docs, cursor, sort)
+ if not cursor or not sort or not sort[1] then return docs end
+ local field = cursor[1][1]
+ local desc = cursor[1][2] == "desc"
+ local op, value = sort[1], sort[2]
+ local isCursor = (type(value) == "table" and value.__cursor__)
+ local cmp = nil
+ local ex = false
+ if op == "startAt" then
+ cmp = function(doc)
+ if isCursor then
+ if doc.__id__ == value.id then ex = true end
+ return ex
+ else
+ if desc then
+ return doc[field] <= value
+ else
+ return doc[field] >= value
+ end
+ end
+ end
+ elseif op == "startAfter" then
+ cmp = function(doc)
+ if isCursor then
+ if ex == false then
+ if doc.__id__ == value.id then ex = true end
+ return false
+ else
+ return true
+ end
+ else
+ if desc then
+ return doc[field] < value
+ else
+ return doc[field] > value
+ end
+ end
+ end
+ elseif op == "endAt" then
+ cmp = function(doc)
+ if isCursor then
+ if ex == false then
+ if doc.__id__ == value.id then ex = true end
+ return true
+ else
+ return ex ~= true
+ end
+ else
+ if desc then
+ return doc[field] >= value
+ else
+ return doc[field] <= value
+ end
+ end
+ end
+ elseif op == "endBefore" then
+ cmp = function(doc)
+ if isCursor then
+ if doc.__id__ == value.id then ex = true end
+ return ex ~= true
+ else
+ if desc then
+ return doc[field] > value
+ else
+ return doc[field] < value
+ end
+ end
+ end
+ end
+ if cmp == nil then return { op } end
+ local result = {}
+ local init = false
+ for i, doc in ipairs(docs) do
+ local ok = cmp(doc)
+ if ok then
+ table.insert(result, doc)
+ init = true
+ end
+ if not ok and init then break end
+ end
+ return result
+end
+
+local function query_data(query, cget)
+ local docs = {}
+ data[query.path[1]] = data[query.path[1]] or {}
+ local collection = data[query.path[1]]
+ local docs = {}
+ for id, doc in pairs(collection) do
+ local doc2 = doc
+ doc2.__id__ = id
+ table.insert(docs, doc2)
+ end
+
+ -- Apply filters
+ local filtered_docs = {}
+ for _, doc in ipairs(docs) do
+ if matches_filters(doc, query) then
+ table.insert(filtered_docs, doc)
+ end
+ end
+
+ -- Sort
+ local sorted_docs = sort_docs(filtered_docs, query.sort)
+
+ -- Apply cursors
+ local cursored_docs = apply_cursor(sorted_docs, query.sort, query.start or query.startCursor)
+ cursored_docs = apply_cursor(cursored_docs, query.sort, query.end_ or query.endCursor)
+
+ -- Apply limit
+ if query.limit and #cursored_docs > query.limit then
+ local limited = {}
+ for i = 1, query.limit do
+ table.insert(limited, cursored_docs[i])
+ end
+ cursored_docs = limited
+ end
+
+ -- Remove injected IDs
+ for _, doc in ipairs(cursored_docs) do
+ local id = doc.__id__
+ doc.__id__ = nil
+ if cget then doc = { id = id, data = doc } end
+ end
+
+ return cursored_docs
+end
+
+Handlers.add(
+ "Init-DB",
+ "Init-DB",
+ function(msg)
+ assert(init == false, 'Already initialized!')
+ assert(msg.From == ao.env.Process.Owner, "Only owner can execute!");
+ assert(type(msg["Node"]) == 'string', 'Node is required!')
+ local isInit = Send({ Target = staking, Action = "Init-DB", Node = msg.Node }).receive().Data
+ if isInit == "initialized!" then
+ init = true
+ msg.reply({ Data = 'DB initialized!' })
+ else
+ msg.reply({ Data = 'DB not initialized!' })
+ end
+ end
+)
+
+Handlers.add(
+ "Set-Bundler",
+ "Set-Bundler",
+ function(msg)
+ assert(msg.From == ao.env.Process.Owner, "Only owner can execute!");
+ assert(type(msg.Tags.Bundler) == "string", "Bundler required!");
+ bundler = msg.Tags.Bundler
+ msg.reply({ Data = 'bundler set!' })
+ end
+)
+
+Handlers.add(
+ "Rollup",
+ "Rollup",
+ function(msg)
+ assert(msg.From == bundler, "Only bundler can execute!");
+ local _data = json.decode(msg.Data)
+ assert(block < _data.block_height, "Invalid Block!");
+ cache[tostring(_data.block_height)] = cache[tostring(_data.block_height)] or {}
+ cache[tostring(_data.block_height)][msg.Id] = _data.diffs
+ local result = Send({
+ TxID = msg.Id,
+ Target = staking,
+ Action = "Rollup",
+ Block = tostring(_data.block_height),
+ Txs = tostring(#_data.txs),
+ }).receive().Data
+ if result == "rolled up!" then
+ msg.reply({ Data = 'committed!' })
+ else
+ msg.reply({ Data = 'failed!'})
+ end
+ end
+)
+
+Handlers.add(
+ "Finalize",
+ "Finalize",
+ function(msg)
+ assert(msg.From == staking, "Only staking can execute!");
+ local _data = cache[msg["Block-Height"]][msg["TxID"]]
+ for i, v in ipairs(_data) do
+ data[v.collection] = data[v.collection] or {}
+ if v.op == "set" then
+ data[v.collection][v.doc] = v.data
+ elseif v.op == "delete" then
+ data[v.collection][v.doc] = nil
+ elseif v.op == "update" then
+ data[v.collection][v.doc] = data[v.collection][v.doc] or {}
+ for key, val in pairs(v.data) do
+ data[v.collection][v.doc][key] = val
+ end
+ end
+ end
+ block = tonumber(msg["Block-Height"])
+ cache[msg["Block-Height"]] = nil
+ msg.reply({ Data = 'finalized!' })
+ end
+)
+
+Handlers.add(
+ "Get",
+ "Get",
+ function(msg)
+ assert(type(msg.Tags.Query) == 'string', 'Query is required!')
+ local query = json.decode(msg.Tags.Query)
+ local q = _parser(query)
+ local result = nil
+ if #q.path == 1 then
+ local __result = query_data(q)
+ result = __result
+ else
+ result = data[query[1]][query[2]]
+ end
+ msg.reply({ Data = json.encode(result) })
+ end
+)
+
+Handlers.add(
+ "Cget",
+ "Cget",
+ function(msg)
+ assert(type(msg.Tags.Query) == 'string', 'Query is required!')
+ local query = json.decode(msg.Tags.Query)
+ local q = _parser(query)
+ local result = nil
+ if #q.path == 1 then
+ local __result = query_data(q, true)
+ result = __result
+ else
+ result = { id = query[2], data = data[query[1]][query[2]], __cursor__ = true }
+ end
+ msg.reply({ Data = json.encode(result) })
+ end
+)
+
+Handlers.add(
+ "Parse",
+ "Parse",
+ function(msg)
+ assert(type(msg.Tags.Query) == 'string', 'Query is required!')
+ local query = json.decode(msg.Tags.Query)
+ local q = _parser(query)
+ msg.reply({ Data = json.encode(q) })
+ end
+)
+
+Handlers.add(
+ "Get-Next-Block",
+ "Get-Next-Block",
+ function(msg)
+ msg.reply({
+ Data = json.encode({
+ height = block + 1,
+ candidates = cache[tostring(block + 1)] or {}
+ })
+ })
+ end
+)
diff --git a/lua/contracts/weavedb_node.lua b/lua/contracts/weavedb_node.lua
new file mode 100644
index 0000000..c80fef7
--- /dev/null
+++ b/lua/contracts/weavedb_node.lua
@@ -0,0 +1,167 @@
+local json = require("json")
+local bint = require('.bint')(256)
+
+Variant = "0.0.3"
+
+local utils = {
+ add = function(a, b)
+ return tostring(bint(a) + bint(b))
+ end,
+ subtract = function(a, b)
+ return tostring(bint(a) - bint(b))
+ end,
+ toBalanceValue = function(a)
+ return tostring(bint(a))
+ end,
+ toNumber = function(a)
+ return bint.tonumber(a)
+ end
+}
+
+Denomination = Denomination or 12
+Balances = Balances or { [ao.id] = "0" }
+TotalSupply = TotalSupply or "0"
+Name = 'Testnet WDB'
+Ticker = 'tdbWDB'
+Logo = 'sUvAzEo-s7JwDV3_JgRCo5uwjaV5koBIi5eFe0sFjCc'
+
+payments = payments or {}
+
+if parent ~= '' then parent = '' end
+if source ~= '' then source = '' end
+
+Handlers.add(
+ "Credit-Notice",
+ "Credit-Notice",
+ function (msg)
+ assert(msg.From == parent, 'Not from parent token!')
+ Balances[msg.Tags.Sender] = Balances[msg.Tags.Sender] or "0"
+ Balances[msg.Tags.Sender] = utils.add(Balances[msg.Tags.Sender], msg.Quantity)
+ end
+)
+
+Handlers.add(
+ 'balance',
+ "Balance",
+ function(msg)
+ local bal = '0'
+
+ if (msg.Tags.Recipient) then
+ if (Balances[msg.Tags.Recipient]) then
+ bal = Balances[msg.Tags.Recipient]
+ end
+ elseif msg.Tags.Target and Balances[msg.Tags.Target] then
+ bal = Balances[msg.Tags.Target]
+ elseif Balances[msg.From] then
+ bal = Balances[msg.From]
+ end
+ msg.reply({
+ Balance = bal,
+ Ticker = Ticker,
+ Account = msg.Tags.Recipient or msg.From,
+ Data = bal
+ })
+ end
+)
+
+Handlers.add(
+ 'balances',
+ "Balances",
+ function(msg)
+ msg.reply({ Data = json.encode(Balances) })
+ end
+)
+
+Handlers.add(
+ 'info',
+ "Info",
+ function(msg)
+ msg.reply({
+ ["Parent-Token"] = parent,
+ ["Source-Token"] = source,
+ Name = Name,
+ Ticker = Ticker,
+ Logo = Logo,
+ Denomination = tostring(Denomination)
+ })
+ end
+)
+
+Handlers.add(
+ 'transfer',
+ "Transfer",
+ function(msg)
+ assert(ao.env.Process.Owner == msg.From, 'Only owner can execute!'..msg.From..":"..ao.env.Process.Owner)
+ assert(type(msg.Tags.Sender) == 'string', 'Sender is required!')
+ assert(type(msg.Recipient) == 'string', 'Recipient is required!')
+ assert(type(msg.Quantity) == 'string', 'Quantity is required!')
+ assert(bint.__lt(0, bint(msg.Quantity)), 'Quantity must be greater than 0')
+
+ if not Balances[msg.Sender] then Balances[msg.Sender] = "0" end
+ if not Balances[msg.Recipient] then Balances[msg.Recipient] = "0" end
+
+ if bint(msg.Quantity) <= bint(Balances[msg.Sender]) then
+ Balances[msg.Sender] = utils.subtract(Balances[msg.Sender], msg.Quantity)
+ Balances[msg.Recipient] = utils.add(Balances[msg.Recipient], msg.Quantity)
+
+ if not msg.Cast then
+ local debitNotice = {
+ Action = 'Debit-Notice',
+ Recipient = msg.Recipient,
+ Quantity = msg.Quantity,
+ Data = Colors.gray ..
+ "You transferred " ..
+ Colors.blue .. msg.Quantity .. Colors.gray .. " to " .. Colors.green .. msg.Recipient .. Colors.reset
+ }
+ local creditNotice = {
+ Target = msg.Recipient,
+ Action = 'Credit-Notice',
+ Sender = msg.Sender,
+ Quantity = msg.Quantity,
+ Data = Colors.gray ..
+ "You received " ..
+ Colors.blue .. msg.Quantity .. Colors.gray .. " from " .. Colors.green .. msg.Sender .. Colors.reset
+ }
+
+ for tagName, tagValue in pairs(msg) do
+ if string.sub(tagName, 1, 2) == "X-" then
+ debitNotice[tagName] = tagValue
+ creditNotice[tagName] = tagValue
+ end
+ end
+
+ msg.reply(debitNotice)
+ Send(creditNotice)
+ end
+ else
+ msg.reply({
+ Action = 'Transfer-Error',
+ ['Message-Id'] = msg.Id,
+ Error = 'Insufficient Balance!'.. Balances[msg.Sender] .. ':' .. msg.Quantity
+ })
+ end
+ end
+)
+
+Handlers.add(
+ "withdraw",
+ "Withdraw",
+ function (msg)
+ assert(type(msg.Quantity) == 'string', 'Quantity is required!')
+ if not Balances[msg.From] then Balances[msg.From] = "0" end
+ local qty = tonumber(msg.Quantity)
+ assert(type(qty) == 'number', 'qty must be number')
+
+ if bint(Balances[msg.From]) >= bint(msg.Quantity) then
+ Balances[msg.From] = utils.subtract(Balances[msg.From], msg.Quantity)
+ ao.send({
+ Target = parent,
+ Tags = {
+ Action = "Transfer",
+ Quantity = msg.Quantity,
+ Recipient = msg.From,
+ }
+ })
+ end
+ end
+)
diff --git a/lua/contracts/weavedb_node_1.lua b/lua/contracts/weavedb_node_1.lua
new file mode 100644
index 0000000..c9112a5
--- /dev/null
+++ b/lua/contracts/weavedb_node_1.lua
@@ -0,0 +1,138 @@
+local json = require("json")
+balances = balances or {}
+payments = payments or {}
+
+if name ~= "Testnet WDB" then name = "Testnet WDB" end
+
+if ticker ~= "tdbWDB" then ticker = "tdbWDB" end
+
+if denomination ~= 12 then denomination = 12 end
+
+if parent ~= '' then parent = '' end
+if source ~= '' then source = '' end
+
+Handlers.add(
+ "Credit-Notice",
+ Handlers.utils.hasMatchingTag("Action", "Credit-Notice"),
+ function (msg)
+ assert(msg.From == parent, 'Not from parent token!')
+ balances[msg.Tags.Sender] = balances[msg.Tags.Sender] or 0
+ balances[msg.Tags.Sender] = balances[msg.Tags.Sender] + tonumber(msg.Tags.Quantity)
+ end
+)
+
+Handlers.add(
+ "balance",
+ Handlers.utils.hasMatchingTag("Action", "Balance"),
+ function (msg)
+ local target = msg.Tags.Target or msg.From
+ local bal = "0"
+ if balances[target] then
+ bal = tostring(balances[target])
+ end
+ ao.send({Target = msg.From, Tags = {
+ Target = target,
+ Balance = bal,
+ Ticker = ticker or ""
+ }})
+ end
+)
+
+Handlers.add(
+ "balances",
+ Handlers.utils.hasMatchingTag("Action", "Balances"),
+ function (msg)
+ ao.send({
+ Target = msg.From,
+ Data = json.encode(balances)
+ })
+ end
+
+)
+
+Handlers.add(
+ "info",
+ Handlers.utils.hasMatchingTag("Action", "Info"),
+ function (msg)
+ ao.send({Target = msg.From, Tags = {
+ ["Parent-Token"] = parent,
+ ["Source-Token"] = source,
+ Name = name,
+ Ticker = ticker,
+ Logo = logo,
+ Denomination = tostring(denomination)
+ }})
+ end
+)
+
+Handlers.add(
+ "transfer",
+ Handlers.utils.hasMatchingTag("Action", "Transfer"),
+ function (msg)
+ assert(ao.env.Process.Owner == msg.From, 'Only owner can execute!'..msg.From..":"..ao.env.Process.Owner)
+ assert(type(msg.Tags.Sender) == 'string', 'Sender is required!')
+ assert(type(msg.Tags.Recipient) == 'string', 'Recipient is required!')
+ assert(type(msg.Tags.Quantity) == 'string', 'Quantity is required!')
+
+ if not balances[msg.Tags.Sender] then
+ balances[msg.Tags.Sender] = 0
+ end
+
+ if not balances[msg.Tags.Recipient] then
+ balances[msg.Tags.Recipient] = 0
+ end
+
+ local qty = tonumber(msg.Tags.Quantity)
+ assert(type(qty) == 'number', 'qty must be number')
+
+ if balances[msg.Tags.Sender] >= qty then
+ balances[msg.Tags.Sender] = balances[msg.Tags.Sender] - qty
+ balances[msg.Tags.Recipient] = balances[msg.Tags.Recipient] + qty
+ ao.send({
+ Target = msg.Tags.Sender,
+ Tags = {
+ Action = "Debit-Notice",
+ Quantity = tostring(qty),
+ Recipient = msg.Tags.Recipient,
+ ["Parent-Token"] = parent,
+ ["Source-Token"] = source,
+ ["X-Note"] = msg.Tags.Note
+ }
+ })
+ ao.send({
+ Target = msg.Tags.Recipient,
+ Tags = {
+ Action = "Credit-Notice",
+ Quantity = tostring(qty),
+ Sender = msg.Tags.Sender,
+ ["Parent-Token"] = parent,
+ ["Source-Token"] = source,
+ ["X-Note"] = msg.Tags.Note
+ }})
+
+ end
+ end
+)
+
+Handlers.add(
+ "withdraw",
+ Handlers.utils.hasMatchingTag("Action", "Withdraw"),
+ function (msg)
+ assert(type(msg.Tags.Quantity) == 'string', 'Quantity is required!')
+ if not balances[msg.From] then balances[msg.From] = 0 end
+ local qty = tonumber(msg.Tags.Quantity)
+ assert(type(qty) == 'number', 'qty must be number')
+
+ if balances[msg.From] >= qty then
+ balances[msg.From] = balances[msg.From] - qty
+ ao.send({
+ Target = parent,
+ Tags = {
+ Action = "Transfer",
+ Quantity = tostring(qty),
+ Recipient = msg.From,
+ }
+ })
+ end
+ end
+)
diff --git a/lua/package.json b/lua/package.json
new file mode 100644
index 0000000..ff133f4
--- /dev/null
+++ b/lua/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "weavedb-ao-lua",
+ "version": "1.0.0",
+ "type": "module",
+ "scripts": {
+ "test": "mocha --node-option=experimental-wasm-memory64"
+ },
+ "dependencies": {
+ "aonote": "^0.10.1",
+ "chai": "^5.1.1",
+ "eth-crypto": "^2.7.0",
+ "mocha": "^10.7.3",
+ "node-forge": "^1.3.1",
+ "wao": "^0.6.3",
+ "weavedb-node-client": "^0.45.2",
+ "yargs": "^17.7.2"
+ },
+ "devDependencies": {
+ "dotenv": "^16.4.5"
+ }
+}
diff --git a/lua/scripts/deploy.js b/lua/scripts/deploy.js
new file mode 100644
index 0000000..c9b2180
--- /dev/null
+++ b/lua/scripts/deploy.js
@@ -0,0 +1,22 @@
+import yargs from "yargs"
+import setup from "./setup.js"
+const {
+ token = "tDB",
+ wallet = "owner",
+ network = "localhost",
+} = yargs(process.argv.slice(2)).argv
+import { createDataItemSigner, spawn } from "@permaweb/aoconnect"
+const main = async () => {
+ const { ao, src } = await setup({ wallet, network })
+ const { err, pid, p } = await ao.deploy({ src_data: src.data(token) })
+ if (err) return console.log(err)
+ const { err: err2 } = await p.msg("Mint", {
+ Quantity:
+ token === "tDB"
+ ? "1000000000" + "000000000000"
+ : "1000000" + "000000000000000000",
+ })
+ if (err2) return console.log(err2)
+ console.log(`${token === "tDB" ? "TDB" : "ETH"}=${pid}`)
+}
+main()
diff --git a/lua/scripts/deploy_all.js b/lua/scripts/deploy_all.js
new file mode 100644
index 0000000..3ae15b1
--- /dev/null
+++ b/lua/scripts/deploy_all.js
@@ -0,0 +1,290 @@
+import yargs from "yargs"
+import { concat } from "ramda"
+import setup from "./setup.js"
+import { Src } from "wao/test"
+import { wait, srcs } from "wao/utils"
+import { dirname, resolve } from "path"
+import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs"
+import { fileURLToPath } from "node:url"
+const __dirname = dirname(fileURLToPath(import.meta.url))
+
+const {
+ owner = "owner",
+ bundler = "bundler",
+ validator1 = "validator1",
+ validator2 = "validator2",
+ delegator = "delegator",
+ committer = "committer",
+ db = "db",
+ network = "localhost",
+ admin = "admin",
+} = yargs(process.argv.slice(2)).argv
+const w = n => Number(n).toString() + "000000000000"
+const g = n => Number(n).toString() + "000000000000000000"
+const zkjson = "0x2F79B95E165011b1A02803B5B7A7a18A4978a3b9"
+let wallets = {
+ owner,
+ bundler,
+ validator1,
+ validator2,
+ db,
+ delegator,
+ committer,
+ admin,
+}
+for (let k in wallets) {
+ wallets[k] = JSON.parse(
+ readFileSync(resolve(__dirname, ".wallets", `${k}.json`), "utf8"),
+ )
+}
+import { createDataItemSigner, spawn } from "@permaweb/aoconnect"
+let env = []
+const deploy_token = async ({ ao, src, token }) => {
+ const { err, pid, p } = await ao.deploy({ src_data: src.data(token) })
+ if (err) {
+ console.log(err)
+ process.exit()
+ }
+ const { err: err2 } = await p.msg("Mint", {
+ Quantity: token === "tDB" ? w(1000000000) : g(1000000),
+ })
+ if (err2) {
+ console.log(err2)
+ process.exit()
+ }
+ console.log(`${token === "tDB" ? "TDB" : "ETH"}=${pid}`)
+ return pid
+}
+
+const deploy_staking = async ({ ao, src, tdb, eth }) => {
+ const { err, pid, p } = await ao.deploy({
+ src_data: src.data("staking"),
+ fills: { DB: tdb, TOKEN: eth },
+ })
+ if (err) {
+ console.log(err)
+ process.exit()
+ }
+ env.push(`STAKING=${pid}`)
+ console.log(`STAKING=${pid}`)
+ return pid
+}
+
+const deploy_node = async ({ ao, src, tdb }) => {
+ const { err, pid, p } = await ao.deploy({
+ src_data: src.data("weavedb_node"),
+ fills: { PARENT: tdb, SOURCE: tdb },
+ jwk: wallets.bundler,
+ })
+ if (err) {
+ console.log(err)
+ process.exit()
+ }
+ env.push(`NODE=${pid}`)
+ console.log(`NODE=${pid}`)
+ return pid
+}
+
+const set_reward = async ({
+ ao,
+ tdb,
+ staking,
+ amount = 100000000,
+ duration = 1000 * 60 * 60 * 24 * 365,
+}) => {
+ const db = ao.p(tdb)
+ const { mid } = await db.msg(
+ "Transfer",
+ {
+ Recipient: staking,
+ Quantity: w(amount),
+ "X-Duration": duration,
+ "X-Action": "Set-Reward",
+ },
+ { check: /transferred/ },
+ )
+ console.log("reward set! " + mid)
+}
+
+const main = async () => {
+ const { ao, src, alchemy } = await setup({ wallet: owner, network })
+ env.push(`ALCHEMY=${alchemy}`)
+ let authority, module_aos2, scheduler
+ if (network === "mainnet") {
+ ;({ scheduler, module_aos2, authority } = srcs)
+ } else {
+ await ao.ar.mint(ao.ar.addr, "10")
+ const src2 = new Src({ ar: ao.ar })
+ await wait(100)
+ const wasm_aos2 = await src2.upload("aos2_0_1", "wasm")
+ ;({ id: module_aos2 } = await ao.postModule({
+ data: await ao.ar.data(wasm_aos2),
+ }))
+ ;({ scheduler } = await ao.postScheduler({
+ url: "http://localhost:4003",
+ overwrite: true,
+ }))
+ authority = ao.authority
+ }
+ env.push(`AUTHORITY=${authority}`)
+ console.log(`AUTHORITY=${authority}`)
+ env.push(`MODULE=${module_aos2}`)
+ console.log(`MODULE=${module_aos2}`)
+ env.push(`SCHEDULER=${scheduler}`)
+ console.log(`SCHEDULER=${scheduler}`)
+ const { ao: ao2 } = await setup({
+ wallet: owner,
+ network,
+ module: module_aos2,
+ scheduler,
+ authority,
+ })
+ const tdb = await deploy_token({ ao: ao2, src, token: "tDB" })
+ const eth = await deploy_token({ ao: ao2, src, token: "taoETH" })
+ const staking = await deploy_staking({ ao: ao2, src, tdb, eth })
+ const node = await deploy_node({ ao: ao2, src, tdb })
+
+ env.push(`TDB=${tdb}`)
+ env.push(`ETH=${eth}`)
+ writeFileSync(resolve(import.meta.dirname, "../.env"), env.join("\n"))
+ writeFileSync(
+ resolve(import.meta.dirname, `../.env.${network}`),
+ env.join("\n"),
+ )
+
+ console.log()
+
+ await set_reward({ ao, tdb, staking })
+
+ let pubs = []
+ try {
+ pubs = readFileSync(
+ resolve(import.meta.dirname, `../../demo/.env.${network}.local`),
+ "utf8",
+ ).split("\n")
+ } catch (e) {
+ const mainnet = [
+ `NEXT_PUBLIC_CONTRACT="${zkjson}"`,
+ `NEXT_PUBLIC_SCAN="https://scan.weavedb.dev"`,
+ `NEXT_PUBLIC_NODE="ao-test"`,
+ `NEXT_PUBLIC_RPC="https://test.wdb.ae"`,
+ `NEXT_PUBLIC_RPC_NODE="test.wdb.ae:443"`,
+ ]
+ const testnet = [
+ `NEXT_PUBLIC_CONTRACT="${zkjson}"`,
+ `NEXT_PUBLIC_SCAN="https://scan.weavedb.dev"`,
+ `NEXT_PUBLIC_NODE="localhost"`,
+ `NEXT_PUBLIC_RPC="http://localhost:8080"`,
+ `NEXT_PUBLIC_RPC_NODE="localhost:8080"`,
+ ]
+
+ pubs = concat(network === "localhost" ? testnet : mainnet, [
+ `NEXT_PUBLIC_TDB=${tdb}`,
+ `NEXT_PUBLIC_ETH=${eth}`,
+ `NEXT_PUBLIC_ADMIN_CONTRACT=${node}`,
+ `NEXT_PUBLIC_STAKING=${staking}`,
+ ])
+ }
+
+ let i = 0
+ for (let v of pubs) {
+ let sp = v.split("=")
+ if (sp[0] === "NEXT_PUBLIC_TDB") pubs[i] = `NEXT_PUBLIC_TDB=${tdb}`
+ if (sp[0] === "NEXT_PUBLIC_ETH") pubs[i] = `NEXT_PUBLIC_ETH=${eth}`
+ if (sp[0] === "NEXT_PUBLIC_ADMIN_CONTRACT")
+ pubs[i] = `NEXT_PUBLIC_ADMIN_CONTRACT=${node}`
+ if (sp[0] === "NEXT_PUBLIC_STAKING")
+ pubs[i] = `NEXT_PUBLIC_STAKING=${staking}`
+ i++
+ }
+ writeFileSync(
+ resolve(import.meta.dirname, "../../demo/.env.local"),
+ pubs.join("\n"),
+ )
+ writeFileSync(
+ resolve(import.meta.dirname, `../../demo/.env.${network}.local`),
+ pubs.join("\n"),
+ )
+ const config_dir = resolve(
+ import.meta.dirname,
+ "../../node/node-server/.configs/",
+ )
+ if (!existsSync(config_dir)) mkdirSync(config_dir)
+ const config_json = resolve(config_dir, `${network}.json`)
+ let config = {}
+ try {
+ config = JSON.parse(readFileSync(config_json, "utf8"))
+ } catch (e) {}
+ config.admin ??= wallets.admin.privateKey
+ config.admin_contract = node
+ config.staking = staking
+ config.zk_contract ??= zkjson
+ config.evm_network ??= "sepolia"
+ config.alchemy_key ??= alchemy
+ config.aos ??= {}
+ config.aos.module = module_aos2
+ config.aos.scheduler = scheduler
+ config.bundler ??= wallets.bundler
+ config.validators ??= [wallets.validator1, wallets.validator2]
+ config.committers ??= [wallets.committer]
+
+ if (network === "localhost") {
+ config.aos.ar = { port: 4000 }
+ config.aos.aoconnect = {
+ MU_URL: "http://localhost:4002",
+ CU_URL: "http://localhost:4004",
+ GATEWAY_URL: "http://localhost:4000",
+ }
+ } else {
+ config.aos.ar = {}
+ delete config.aos.aoconnect
+ }
+ const config_path = resolve(
+ import.meta.dirname,
+ "../../node/node-server/weavedb.config.js",
+ )
+
+ writeFileSync(
+ config_path,
+ `module.exports = ${JSON.stringify(config, null, 2)}`,
+ )
+ writeFileSync(config_json, JSON.stringify(config, null, 2))
+
+ const p = ao.p(tdb)
+ const p2 = ao.p(eth)
+ const db_addr = await ao.ar.toAddr(wallets.db)
+ const bundler_addr = await ao.ar.toAddr(wallets.bundler)
+ const validator1_addr = await ao.ar.toAddr(wallets.validator1)
+ const validator2_addr = await ao.ar.toAddr(wallets.validator2)
+ const delegator_addr = await ao.ar.toAddr(wallets.delegator)
+
+ await p.m("Transfer", { Quantity: w(10000), Recipient: db_addr })
+ console.log(`Transferred 10000 tDB to ${db_addr}`)
+ await p2.m("Transfer", { Quantity: g(10), Recipient: bundler_addr })
+ console.log(`Transferred 10 taoETH to ${bundler_addr}`)
+ await p2.m("Transfer", { Quantity: g(10), Recipient: validator1_addr })
+ console.log(`Transferred 10 taoETH to ${validator1_addr}`)
+ await p2.m("Transfer", { Quantity: g(10), Recipient: validator2_addr })
+ console.log(`Transferred 10 taoETH to ${validator2_addr}`)
+ await p2.m("Transfer", { Quantity: g(10), Recipient: delegator_addr })
+ console.log(`Transferred 10 taoETH to ${delegator_addr}`)
+ const p_eth = ao.p(eth)
+
+ const url =
+ network === "localhost"
+ ? "http://localhost:8080"
+ : "https://test.wdb.ae:443"
+ await p_eth.m(
+ "Transfer",
+ {
+ Recipient: staking,
+ Quantity: g(1),
+ "X-Action": "Add-Node",
+ "X-URL": url,
+ },
+ { jwk: wallets.bundler, check: /transferred/ },
+ )
+ console.log(`Node added: ${url}`)
+}
+
+main()
diff --git a/lua/scripts/deploy_module.js b/lua/scripts/deploy_module.js
new file mode 100644
index 0000000..119df50
--- /dev/null
+++ b/lua/scripts/deploy_module.js
@@ -0,0 +1,28 @@
+import yargs from "yargs"
+import setup from "./setup.js"
+import { Src } from "wao/test"
+import { wait } from "wao/utils"
+const { wallet = "owner", network = "localhost" } = yargs(
+ process.argv.slice(2),
+).argv
+
+import { createDataItemSigner, spawn } from "@permaweb/aoconnect"
+
+const main = async () => {
+ const { ao } = await setup({ wallet, network })
+ await ao.ar.mint(ao.ar.addr, "10")
+ const src = new Src({ ar: ao.ar })
+ await wait(100)
+ const wasm_aos2 = await src.upload("aos2_0_1", "wasm")
+ const { id: module_aos2 } = await ao.postModule({
+ data: await ao.ar.data(wasm_aos2),
+ })
+ const { scheduler } = await ao.postScheduler({
+ url: "http://localhost:4000",
+ overwrite: true,
+ })
+ console.log(`AUTHORITY=${ao.authority}`)
+ console.log(`MODULE=${module_aos2}`)
+ console.log(`SCHEDULER=${scheduler}`)
+}
+main()
diff --git a/lua/scripts/deploy_node.js b/lua/scripts/deploy_node.js
new file mode 100644
index 0000000..097ba19
--- /dev/null
+++ b/lua/scripts/deploy_node.js
@@ -0,0 +1,16 @@
+import yargs from "yargs"
+import setup from "./setup.js"
+const { wallet = "bundler", network = "localhost" } = yargs(
+ process.argv.slice(2),
+).argv
+
+const main = async () => {
+ const { tdb, ao, src } = await setup({ wallet, network })
+ const { err, pid, p } = await ao.deploy({
+ src_data: src.data("weavedb_node"),
+ fills: { PARENT: tdb, SOURCE: tdb },
+ })
+ if (err) return console.log(err)
+ console.log(`NODE=${pid}`)
+}
+main()
diff --git a/lua/scripts/deploy_staking.js b/lua/scripts/deploy_staking.js
new file mode 100644
index 0000000..d5290c0
--- /dev/null
+++ b/lua/scripts/deploy_staking.js
@@ -0,0 +1,16 @@
+import yargs from "yargs"
+import setup from "./setup.js"
+const { wallet = "owner", network = "localhost" } = yargs(
+ process.argv.slice(2),
+).argv
+
+const main = async () => {
+ const { ao, src, tdb, eth } = await setup({ wallet, network })
+ const { err, pid, p } = await ao.deploy({
+ src_data: src.data("staking"),
+ fills: { DB: tdb, TOKEN: eth },
+ })
+ if (err) return console.log(err)
+ console.log(`STAKING=${pid}`)
+}
+main()
diff --git a/lua/scripts/deposit_tdb.js b/lua/scripts/deposit_tdb.js
new file mode 100644
index 0000000..6eba7a9
--- /dev/null
+++ b/lua/scripts/deposit_tdb.js
@@ -0,0 +1,23 @@
+import yargs from "yargs"
+import setup from "./setup.js"
+const {
+ tdb = "tDB",
+ db = "db",
+ wallet = "owner",
+ staking = "stake",
+ network = "mainnet",
+} = yargs(process.argv.slice(2)).argv
+
+const main = async () => {
+ const { ao, src } = await setup({ wallet, network })
+ const p = ao.p(tdb)
+ console.log(
+ await p.msg("Transfer", {
+ Recipient: staking,
+ Quantity: "1000000000000000",
+ "X-DB": db,
+ }),
+ )
+ console.log("depositted!")
+}
+main()
diff --git a/lua/scripts/gen_wallets.js b/lua/scripts/gen_wallets.js
new file mode 100644
index 0000000..9c99f79
--- /dev/null
+++ b/lua/scripts/gen_wallets.js
@@ -0,0 +1,39 @@
+import { existsSync, mkdirSync, writeFileSync, readFileSync } from "fs"
+import EthCrypto from "eth-crypto"
+import { dirname, resolve } from "path"
+import { fileURLToPath } from "node:url"
+import _Arweave from "arweave"
+const Arweave = _Arweave.default ?? _Arweave
+
+const __dirname = dirname(fileURLToPath(import.meta.url))
+const wallets = {
+ ar: ["owner", "bundler", "db", "validator1", "validator2", "delegator"],
+ eth: ["committer", "admin"],
+}
+
+const main = async () => {
+ const dir = resolve(__dirname, ".wallets")
+ if (!existsSync(dir)) mkdirSync(dir)
+ const arweave = Arweave.init()
+ for (const type in wallets) {
+ for (const name of wallets[type]) {
+ const file = resolve(dir, `${name}.json`)
+ if (existsSync(file)) {
+ console.log("exists:", name)
+ } else {
+ let wallet = null
+ if (type === "ar") {
+ wallet = await arweave.wallets.generate()
+ } else if (type === "eth") {
+ wallet = EthCrypto.createIdentity()
+ }
+ if (wallet) {
+ writeFileSync(file, JSON.stringify(wallet))
+ console.log("generated:", name)
+ }
+ }
+ }
+ }
+}
+
+main()
diff --git a/lua/scripts/network.js b/lua/scripts/network.js
new file mode 100644
index 0000000..7bd2dbd
--- /dev/null
+++ b/lua/scripts/network.js
@@ -0,0 +1,14 @@
+export default {
+ localhost: {
+ ar: { port: 4000 },
+ aoconnect: {
+ MU_URL: "http://localhost:4002",
+ CU_URL: "http://localhost:4004",
+ GATEWAY_URL: "http://localhost:4000",
+ },
+ },
+ mainnet: {
+ ar: {},
+ aoconnect: null,
+ },
+}
diff --git a/lua/scripts/set_reward.js b/lua/scripts/set_reward.js
new file mode 100644
index 0000000..c04acfd
--- /dev/null
+++ b/lua/scripts/set_reward.js
@@ -0,0 +1,25 @@
+import yargs from "yargs"
+import setup from "./setup.js"
+const {
+ wallet = "owner",
+ network = "localhost",
+ amount = "100000000",
+ duration = 1000 * 60 * 60 * 24 * 365,
+} = yargs(process.argv.slice(2)).argv
+
+const main = async () => {
+ const { ao, src, staking, tdb } = await setup({ wallet, network })
+ const db = ao.p(tdb)
+ const { mid } = await db.msg(
+ "Transfer",
+ {
+ Recipient: staking,
+ Quantity: amount + "000000000000",
+ "X-Duration": duration,
+ "X-Action": "Set-Reward",
+ },
+ { check: /transferred/ },
+ )
+ console.log("reward set! " + mid)
+}
+main()
diff --git a/lua/scripts/setup.js b/lua/scripts/setup.js
new file mode 100644
index 0000000..1c1a3cf
--- /dev/null
+++ b/lua/scripts/setup.js
@@ -0,0 +1,44 @@
+import { AR, AO } from "wao"
+import { wait } from "wao/utils"
+import { Src } from "wao/test"
+import { dirname, resolve } from "path"
+import yargs from "yargs"
+import networks from "./network.js"
+const { network = "localhost" } = yargs(process.argv.slice(2)).argv
+import dotenv from "dotenv"
+dotenv.config(`.env.${network}`)
+import { readFileSync } from "fs"
+import { fileURLToPath } from "node:url"
+const __dirname = dirname(fileURLToPath(import.meta.url))
+export default async ({ authority, wallet, network, module, scheduler }) => {
+ let opt = {
+ ...networks[network],
+ module: module ?? process.env.MODULE,
+ scheduler: scheduler ?? process.env.SCHEDULER,
+ authority: authority ?? process.env.AUTHORITY,
+ }
+ const jwk = JSON.parse(
+ readFileSync(resolve(__dirname, ".wallets", `${wallet}.json`), "utf8"),
+ )
+ const ao = await new AO(opt).init(jwk)
+ const src = new Src({
+ ar: ao.ar,
+ dir: resolve(__dirname, "../../lua/contracts"),
+ })
+ const tdb = process.env.TDB
+ const eth = process.env.ETH
+ const staking = process.env.STAKING
+ const node = process.env.NODE
+ const alchemy = process.env.ALCHEMY
+ return {
+ jwk,
+ ao,
+ src,
+ authority: opt.authority,
+ tdb,
+ eth,
+ staking,
+ node,
+ alchemy,
+ }
+}
diff --git a/lua/scripts/setup_staking.js b/lua/scripts/setup_staking.js
new file mode 100644
index 0000000..4881bdd
--- /dev/null
+++ b/lua/scripts/setup_staking.js
@@ -0,0 +1,161 @@
+import yargs from "yargs"
+import setup from "./setup.js"
+import { Src } from "wao/test"
+import { wait } from "wao/utils"
+import { dirname, resolve } from "path"
+import { writeFileSync, readFileSync } from "fs"
+import { fileURLToPath } from "node:url"
+import config from "../../node/node-server/weavedb.config.js"
+const __dirname = dirname(fileURLToPath(import.meta.url))
+import DB from "weavedb-node-client"
+
+const {
+ owner = "owner",
+ bundler = "bundler",
+ validator1 = "validator1",
+ validator2 = "validator2",
+ delegator = "delegator",
+ committer = "committer",
+ db = "db",
+ network = "localhost",
+ dbname = "demo",
+} = yargs(process.argv.slice(2)).argv
+const w = n => Number(n).toString() + "000000000000"
+const g = n => Number(n).toString() + "000000000000000000"
+
+let wallets = { owner, bundler, validator1, validator2, db, delegator }
+for (let k in wallets) {
+ wallets[k] = JSON.parse(
+ readFileSync(resolve(__dirname, ".wallets", `${k}.json`), "utf8"),
+ )
+}
+wallets.committer = JSON.parse(
+ readFileSync(resolve(__dirname, ".wallets", `${committer}.json`), "utf8"),
+)
+import { createDataItemSigner, spawn } from "@permaweb/aoconnect"
+
+const main = async () => {
+ const { tdb, eth, staking, node, ao, src } = await setup({
+ wallet: owner,
+ network,
+ })
+
+ await wait(1000)
+ const token = ao.p(tdb)
+ const aoeth = ao.p(eth)
+ const st = ao.p(staking)
+ const nd = ao.p(node)
+ await token.m(
+ "Transfer",
+ { Recipient: node, Quantity: w(100) },
+ { jwk: wallets.db },
+ )
+
+ console.log("deposit 100 tDB to the node!")
+ await wait(5000)
+ const db = new DB({
+ rpc: network === "localhost" ? "localhost:8080" : "test.wdb.ae:443",
+ contractTxId: dbname,
+ })
+ console.log(staking, await st.d("Balances"))
+ console.log(node, await nd.d("Balances"))
+ console.log(tdb, await token.d("Balances"))
+
+ const tx = await db.admin(
+ {
+ op: "add_db",
+ key: dbname,
+ db: { rollup: true, owner: await ao.ar.toAddr(wallets.db) },
+ },
+ { ar2: wallets.db },
+ )
+ if (!tx.success) return console.log("error")
+
+ console.log("db added!")
+ const { contractTxId, srcTxId } = await db.admin(
+ {
+ op: "deploy_contract",
+ key: dbname,
+ type: "ao",
+ },
+ { ar2: wallets.db },
+ )
+ console.log("deployed:", contractTxId)
+ await wait(5000)
+ await token.m(
+ "Transfer",
+ {
+ Recipient: staking,
+ Quantity: w(1000),
+ "X-DB": contractTxId,
+ },
+ { jwk: wallets.db },
+ )
+ console.log(`Deposit 1000 tDB token to:`, contractTxId)
+
+ await aoeth.m(
+ "Transfer",
+ {
+ Recipient: staking,
+ Quantity: g(1),
+ "X-DB": contractTxId,
+ },
+ { check: /transferred/, jwk: wallets.validator1 },
+ )
+
+ console.log(`Stake 1 taoETH as a validator1`)
+
+ await aoeth.m(
+ "Transfer",
+ {
+ Recipient: staking,
+ Quantity: g(1),
+ "X-DB": contractTxId,
+ },
+ { check: /transferred/, jwk: wallets.validator2 },
+ )
+
+ console.log(`Stake 1 taoETH as a validator2`)
+ const db2 = new DB({
+ rpc: network === "localhost" ? "localhost:8080" : "test.wdb.ae:443",
+ contractTxId,
+ })
+ await db2.admin(
+ {
+ op: "add_validator",
+ pid: contractTxId,
+ },
+ { ar2: wallets.validator1 },
+ )
+ console.log(`validator1 added!`)
+ await db2.admin(
+ {
+ op: "add_validator",
+ pid: contractTxId,
+ },
+ { ar2: wallets.validator2 },
+ )
+ console.log(`validator2 added!`)
+ await db2.admin(
+ {
+ op: "add_committer",
+ pid: contractTxId,
+ },
+ { privateKey: wallets.committer.privateKey },
+ )
+ console.log(`zk-committer added!`)
+ const validator1_addr = await ao.ar.toAddr(wallets.validator1)
+ await aoeth.m(
+ "Transfer",
+ {
+ Recipient: staking,
+ Quantity: g(1),
+ "X-Action": "Delegate",
+ "X-DB": contractTxId,
+ "X-Delegate-To": validator1_addr,
+ },
+ { check: /transferred/, jwk: wallets.delegator },
+ )
+ console.log(`Delegated 1 taoETH to: ${validator1_addr}`)
+}
+main()
diff --git a/lua/scripts/transfer.js b/lua/scripts/transfer.js
new file mode 100644
index 0000000..0a953e1
--- /dev/null
+++ b/lua/scripts/transfer.js
@@ -0,0 +1,57 @@
+import { AR, AO } from "aonote"
+import yargs from "yargs"
+import { dirname, resolve } from "path"
+import { readFileSync } from "fs"
+import { fileURLToPath } from "node:url"
+const __dirname = dirname(fileURLToPath(import.meta.url))
+const wait = ms => new Promise(res => setTimeout(() => res(), ms))
+const {
+ token,
+ to,
+ wallet = "bundler",
+ network = "mainnet",
+ quantity = "100000000",
+ decimal = 12,
+} = yargs(process.argv.slice(2)).argv
+
+const main = async () => {
+ const jwk = JSON.parse(
+ readFileSync(resolve(__dirname, ".wallets", `${wallet}.json`), "utf8"),
+ )
+ const opt = network === "localhost" ? { port: 4000 } : {}
+ const ar = await new AR(opt).init(jwk)
+ let opt2 = { ar }
+ if (network === "localhost") {
+ opt2 = {
+ ar,
+ module: "YTNXvQu2x21DD6Pm8zicVBghB-BlnM5VRrVRyfhBPP8",
+ scheduler: "-_vZZQMEnvJmiIIfHfp_KuuV6ud2b9VSThfTmYytYQ8",
+ aoconnect: {
+ MU_URL: "http://localhost:4002",
+ CU_URL: "http://localhost:4004",
+ GATEWAY_URL: "http://localhost:4000",
+ },
+ }
+ }
+ let zero = ""
+ for (let i = 0; i < decimal; i++) {
+ zero += "0"
+ }
+ const ao = new AO(opt2)
+ const res = await ao.msg({
+ pid: token,
+ act: "Transfer",
+ tags: { Recipient: to, Quantity: `${quantity}${zero}` },
+ })
+ console.log(res)
+ console.log(
+ (
+ await ao.dry({
+ pid: token,
+ act: "Balances",
+ get: { data: true, json: true },
+ })
+ ).out,
+ )
+}
+main()
diff --git a/lua/scripts/validate_rollup.js b/lua/scripts/validate_rollup.js
new file mode 100644
index 0000000..7a9d0d1
--- /dev/null
+++ b/lua/scripts/validate_rollup.js
@@ -0,0 +1,71 @@
+import yargs from "yargs"
+import setup from "./setup.js"
+import { reverse } from "ramda"
+import { tags } from "aonote/test/utils.js"
+const {
+ db = "db",
+ wallet = "validator1",
+ wallet2 = "validator2",
+ staking = "stake",
+ network = "mainnet",
+} = yargs(process.argv.slice(2)).argv
+
+let block = 0
+const main = async () => {
+ const { ao, src } = await setup({ wallet, network })
+ const { ao: ao2 } = await setup({ wallet: wallet2, network })
+ const p1 = ao.p(staking)
+ const p2 = ao.p(staking)
+ const txs = await ao.ar.txs(staking)
+ for (let v of reverse(txs)) {
+ for (let v2 of v.tags) {
+ if (v2.value === "Rollup" && v2.value === db) {
+ }
+ }
+ }
+
+ for (let v of (await ao.results({ process: db })).edges) {
+ for (let v2 of v.node.Messages) {
+ let _tags = tags(v2.Tags)
+ if (_tags.Action === "Rollup") {
+ if (_tags.Block * 1 == block + 1) {
+ console.log(_tags.Block)
+ try {
+ await p1.m(
+ "Validate",
+ { DB: db, Block: _tags.Block, ["TxID"]: _tags.TxID },
+ { check: "validated!", jwk: ao.ar.jwk },
+ )
+ console.log("success?")
+ } catch (e) {
+ console.log("error1")
+ console.log(e)
+ }
+ try {
+ await p2.m(
+ "Validate",
+ { DB: db, Block: _tags.Block, ["TxID"]: _tags.TxID },
+ { check: "finalized!", jwk: ao2.ar.jwk },
+ )
+ console.log("finalized!")
+ } catch (e) {
+ console.log(e)
+ console.log("error2")
+ }
+ block += 1
+ }
+ }
+ }
+ }
+ return
+ const p = ao.p(staking)
+ console.log(
+ await p.msg("Transfer", {
+ Recipient: staking,
+ Quantity: "1000000000000000",
+ "X-DB": db,
+ }),
+ )
+ console.log("depositted!")
+}
+main()
diff --git a/lua/test/parser.js b/lua/test/parser.js
new file mode 100644
index 0000000..7b43e98
--- /dev/null
+++ b/lua/test/parser.js
@@ -0,0 +1,815 @@
+import {
+ includes,
+ append,
+ clone,
+ complement,
+ is,
+ splitWhen,
+ isNil,
+} from "ramda"
+
+export const _parser = query => {
+ const [path, opt] = splitWhen(complement(is)(String), query)
+ if (isNil(path) || path.length === 0) return null
+ if (!is(Object, opt)) return null
+ let q = { path }
+ let _filter = { "==": [] }
+ let _keys = {}
+ let _ranges = {}
+ let _range_field = null
+ let _sort = null
+ let _startAt = null
+ let _startAfter = null
+ let _endAt = null
+ let _endBefore = null
+ let _startAtCursor = null
+ let _startAfterCursor = null
+ let _endAtCursor = null
+ let _endBeforeCursor = null
+ let _array_contains = null
+ let _array_contains_any = null
+ for (const v of clone(opt)) {
+ if (is(Number)(v)) {
+ if (isNil(q.limit)) {
+ if (v > 1000) return null
+ if (v !== Math.round(Math.abs(v)) || v < 1) {
+ return null
+ }
+ q.limit = v
+ } else {
+ return null
+ }
+ } else if (!is(Array)(v)) {
+ return null
+ } else {
+ if (v.length === 0) {
+ return null
+ } else if (v[0] === "startAt") {
+ if (
+ !isNil(_startAt) ||
+ !isNil(_startAfter) ||
+ !isNil(_startAtCursor) ||
+ !isNil(_startAfterCursor)
+ ) {
+ return null
+ } else if (v.length <= 1) {
+ return null
+ } else {
+ if (v[1].__cursor__) {
+ _startAtCursor = v
+ _startAtCursor[1].data.__id__ = _startAtCursor[1].id
+ } else {
+ _startAt = v
+ }
+ }
+ } else if (v[0] === "startAfter") {
+ if (
+ !isNil(_startAt) ||
+ !isNil(_startAfter) ||
+ !isNil(_startAtCursor) ||
+ !isNil(_startAfterCursor)
+ ) {
+ return null
+ } else if (v.length <= 1) {
+ return null
+ } else {
+ if (v[1].__cursor__) {
+ _startAfterCursor = v
+ _startAfterCursor[1].data.__id__ = _startAfterCursor[1].id
+ } else {
+ _startAfter = v
+ }
+ }
+ } else if (v[0] === "endAt") {
+ if (
+ !isNil(_endAt) ||
+ !isNil(_endBefore) ||
+ !isNil(_endAtCursor) ||
+ !isNil(_endBeforeCursor)
+ ) {
+ return null
+ } else if (v.length <= 1) {
+ return null
+ } else {
+ if (v[1].__cursor__) {
+ _endAtCursor = v
+ _endAtCursor[1].data.__id__ = _endAtCursor[1].id
+ } else {
+ _endAt = v
+ }
+ }
+ } else if (v[0] === "endBefore") {
+ if (
+ !isNil(_endAt) ||
+ !isNil(_endBefore) ||
+ !isNil(_endAtCursor) ||
+ !isNil(_endBeforeCursor)
+ ) {
+ return null
+ } else if (v.length <= 1) {
+ return null
+ } else {
+ if (v[1].__cursor__) {
+ _endBeforeCursor = v
+ _endBeforeCursor[1].data.__id__ = _endBeforeCursor[1].id
+ } else {
+ _endBefore = v
+ }
+ }
+ } else if (v.length === 3) {
+ if (
+ includes(v[1])([
+ "==",
+ "!=",
+ ">",
+ "<",
+ ">=",
+ "<=",
+ "in",
+ "not-in",
+ "array-contains",
+ "array-contains-any",
+ ])
+ ) {
+ if (includes(v[1], ["array-contains", "array-contains-any"])) {
+ if (
+ !isNil(_filter["array-contains"]) ||
+ !isNil(_filter["array-contains-any"])
+ ) {
+ return null
+ }
+ if (v[1] === "array-contains-any" && !is(Array, v[2])) {
+ return null
+ }
+ _filter[v[1]] = v
+ } else if (
+ includes(v[1], ["!=", "in", "not-in", ">", ">=", "<", "<="])
+ ) {
+ if (includes(v[1], ["in", "not-in"]) && !is(Array, v[2])) {
+ return null
+ }
+ if (includes(v[1], [">", ">=", "<", "<="])) {
+ if (
+ !isNil(_filter["!="]) ||
+ !isNil(_filter["in"]) ||
+ !isNil(_filter["not-in"])
+ ) {
+ return null
+ }
+ if (!isNil(_range_field) && _range_field !== v[0]) {
+ return null
+ } else if (
+ _ranges[v[1]] ||
+ (v[1] === ">" && _ranges[">="]) ||
+ (v[1] === ">=" && _ranges[">"]) ||
+ (v[1] === "<" && _ranges["<="]) ||
+ (v[1] === "<=" && _ranges["<"])
+ ) {
+ return null
+ } else {
+ _filter.range ??= []
+ _filter.range.push(v)
+ _range_field = v[0]
+ _ranges[v[1]] = true
+ }
+ } else {
+ if (
+ !isNil(_filter.range) ||
+ !isNil(_filter["!="]) ||
+ !isNil(_filter["in"]) ||
+ !isNil(_filter["not-in"])
+ ) {
+ return null
+ }
+ _filter[v[1]] = v
+ }
+ } else if (v[1] === "==") {
+ if (
+ !isNil(_filter.range) ||
+ !isNil(_filter["!="]) ||
+ !isNil(_filter["in"]) ||
+ !isNil(_filter["not-in"])
+ ) {
+ return null
+ } else if (_keys[v[0]]) return null
+ _filter["=="].push(v)
+ _keys[v[0]] = true
+ } else {
+ if (!isNil(_filter[v[1]])) return null
+ _filter[v[1]] = v
+ }
+ } else {
+ return null
+ }
+ } else if (v.length === 2) {
+ if (includes(v[1])(["asc", "desc"])) {
+ if (isNil(_sort)) {
+ _sort = [v]
+ } else {
+ _sort.push(v)
+ }
+ } else {
+ return null
+ }
+ } else if (v.length === 1) {
+ if (isNil(_sort)) {
+ _sort = [append("asc", v)]
+ } else {
+ _sort.push(append("asc", v))
+ }
+ } else {
+ return null
+ }
+ }
+ }
+ q.limit ??= 1000
+ q.start = _startAt ?? _startAfter ?? null
+ q.end_ = _endAt ?? _endBefore ?? null
+ q.startCursor = _startAtCursor ?? _startAfterCursor ?? null
+ q.endCursor = _endAtCursor ?? _endBeforeCursor ?? null
+ q.sort = _sort ?? []
+ q.reverse = { start: false, end_: false }
+ q.array = _filter["array-contains"] ?? _filter["array-contains-any"] ?? null
+ q.equals = _filter["=="]
+ q.range =
+ _filter.range ??
+ (!isNil(_filter.in)
+ ? [_filter.in]
+ : !isNil(_filter["not-in"])
+ ? [_filter["not-in"]]
+ : !isNil(_filter["!="])
+ ? [_filter["!="]]
+ : null)
+ q.sortByTail = false
+ return q
+}
+
+export const qs1 = [
+ // Basic path queries
+ ["users"],
+ ["organizations", "departments"],
+ ["users", "documents", "versions"],
+ ["teams", "members", "roles"],
+ ["companies", "employees", "tasks"],
+
+ // Basic limit queries
+ ["users", 10],
+ ["posts", 1],
+ ["tasks", 1000],
+ ["items", 999],
+ ["docs", 500],
+
+ // Basic equality filters
+ ["users", ["name", "==", "John"]],
+ ["posts", ["status", "==", "active"]],
+ ["users", ["age", "==", 25]],
+ ["orders", ["isComplete", "==", true]],
+ ["products", ["price", "==", 99.99]],
+
+ // Multiple equality filters
+ ["users", ["name", "==", "John"], ["age", "==", 25]],
+ ["posts", ["status", "==", "active"], ["type", "==", "blog"]],
+ ["orders", ["status", "==", "pending"], ["total", "==", 100]],
+ ["products", ["category", "==", "electronics"], ["brand", "==", "Apple"]],
+ ["employees", ["department", "==", "IT"], ["level", "==", "senior"]],
+
+ // Range filters
+ ["users", ["age", ">", 18]],
+ ["users", ["age", ">=", 21]],
+ ["users", ["age", "<", 65]],
+ ["users", ["age", "<=", 60]],
+ ["products", ["price", ">=", 100]],
+
+ // Combined range filters on same field (valid combinations)
+ ["users", ["age", ">=", 18], ["age", "<", 65]],
+ ["products", ["price", ">", 10], ["price", "<=", 100]],
+ ["items", ["quantity", ">", 0], ["quantity", "<=", 50]],
+ ["temperatures", ["value", ">=", 0], ["value", "<=", 100]],
+ ["scores", ["points", ">", 50], ["points", "<", 100]],
+
+ // Array contains queries
+ ["users", ["roles", "array-contains", "admin"]],
+ ["posts", ["tags", "array-contains", "featured"]],
+ ["products", ["categories", "array-contains", "electronics"]],
+ ["movies", ["genres", "array-contains", "action"]],
+ ["books", ["authors", "array-contains", "John Doe"]],
+
+ // Array contains any queries
+ ["users", ["roles", "array-contains-any", ["admin", "moderator"]]],
+ ["posts", ["tags", "array-contains-any", ["featured", "trending"]]],
+ [
+ "products",
+ ["categories", "array-contains-any", ["electronics", "accessories"]],
+ ],
+ ["movies", ["genres", "array-contains-any", ["action", "adventure"]]],
+ ["docs", ["status", "array-contains-any", ["draft", "review"]]],
+
+ // IN queries
+ ["users", ["status", "in", ["active", "pending"]]],
+ ["posts", ["type", "in", ["blog", "news", "article"]]],
+ ["products", ["category", "in", ["electronics", "accessories"]]],
+ ["orders", ["status", "in", ["processing", "shipped"]]],
+ ["tasks", ["priority", "in", ["high", "medium", "low"]]],
+
+ // NOT IN queries
+ ["users", ["status", "not-in", ["banned", "deleted"]]],
+ ["posts", ["type", "not-in", ["draft", "archived"]]],
+ ["products", ["category", "not-in", ["discontinued"]]],
+ ["orders", ["status", "not-in", ["cancelled", "refunded"]]],
+ ["employees", ["status", "not-in", ["terminated", "suspended"]]],
+
+ // Not equals queries
+ ["users", ["status", "!=", "banned"]],
+ ["posts", ["type", "!=", "draft"]],
+ ["products", ["price", "!=", 0]],
+ ["orders", ["status", "!=", "cancelled"]],
+ ["tasks", ["priority", "!=", "low"]],
+
+ // Basic sorting
+ ["users", ["name", "asc"]],
+ ["users", ["age", "desc"]],
+ ["products", ["price", "desc"]],
+ ["posts", ["date", "desc"]],
+ ["orders", ["total", "asc"]],
+
+ // Multiple field sorting
+ ["users", ["name", "asc"], ["age", "desc"]],
+ ["products", ["category", "asc"], ["price", "desc"]],
+ ["posts", ["date", "desc"], ["title", "asc"]],
+ ["orders", ["status", "asc"], ["date", "desc"]],
+ ["tasks", ["priority", "desc"], ["dueDate", "asc"]],
+
+ // Implicit ascending sort
+ ["users", ["name"]],
+ ["products", ["price"]],
+ ["posts", ["date"]],
+ ["orders", ["total"]],
+ ["tasks", ["dueDate"]],
+
+ // Cursor queries
+ ["users", ["startAt", "John"]],
+ ["users", ["startAfter", "John"]],
+ ["users", ["endAt", "Zeus"]],
+ ["users", ["endBefore", "Zeus"]],
+ ["products", ["startAt", 100]],
+
+ // Cursor with document snapshots
+ [
+ "users",
+ ["startAt", { __cursor__: true, id: "123", data: { name: "John" } }],
+ ],
+ [
+ "users",
+ ["startAfter", { __cursor__: true, id: "456", data: { name: "Jane" } }],
+ ],
+ ["users", ["endAt", { __cursor__: true, id: "789", data: { name: "Zeus" } }]],
+ [
+ "users",
+ ["endBefore", { __cursor__: true, id: "012", data: { name: "Zack" } }],
+ ],
+ [
+ "products",
+ ["startAt", { __cursor__: true, id: "999", data: { price: 100 } }],
+ ],
+
+ // Complex combinations
+ [
+ "users",
+ ["name", "==", "John"],
+ ["age", ">=", 21],
+ ["status", "in", ["active", "pending"]],
+ ["name", "asc"],
+ 10,
+ ],
+ [
+ "products",
+ ["category", "==", "electronics"],
+ ["price", ">=", 100],
+ ["price", "<=", 1000],
+ ["brand", "in", ["Apple", "Samsung"]],
+ ["rating", "desc"],
+ 20,
+ ],
+ [
+ "posts",
+ ["status", "==", "published"],
+ ["type", "in", ["blog", "article"]],
+ ["tags", "array-contains", "featured"],
+ ["date", "desc"],
+ ["title", "asc"],
+ 50,
+ ],
+
+ // Deep paths with all operations
+ [
+ "organizations",
+ "departments",
+ "teams",
+ ["name", "==", "Engineering"],
+ ["size", ">", 10],
+ ["tags", "array-contains", "technical"],
+ ["status", "in", ["active", "hiring"]],
+ ["createdAt", "desc"],
+ 25,
+ ],
+
+ // Complex queries with multiple features
+ [
+ "users",
+ ["name", "==", "John"],
+ ["age", ">=", 21],
+ ["roles", "array-contains", "admin"],
+ ["status", "in", ["active", "vacation"]],
+ ["department", "!=", "archived"],
+ ["name", "asc"],
+ ["joinDate", "desc"],
+ ["startAt", { __cursor__: true, id: "123", data: { name: "John" } }],
+ 50,
+ ],
+]
+
+export const qs2 = [
+ // Basic path queries
+ (["users"],
+ ["organizations"],
+ ["products"],
+ ["teams"],
+ ["documents"],
+ // Multiple segment paths
+ ["users", "profiles"],
+ ["organizations", "members"],
+ ["teams", "projects"],
+ ["users", "settings"],
+ ["products", "reviews"],
+ // Simple numeric limits
+ ["users", 10],
+ ["teams", 50],
+ ["products", 100],
+ ["documents", 500],
+ ["organizations", 999],
+ // Single equality filters
+ ["users", ["name", "==", "John"]],
+ ["products", ["status", "==", "active"]],
+ ["teams", ["size", "==", 5]],
+ ["orders", ["isComplete", "==", true]],
+ ["tasks", ["priority", "==", 1]],
+ // Single range filters
+ ["users", ["age", ">", 18]],
+ ["products", ["price", ">=", 100]],
+ ["tasks", ["dueDate", "<", "2024-12-31"]],
+ ["orders", ["total", "<=", 1000]],
+ ["teams", ["members", ">", 5]],
+ // Single array-contains
+ ["users", ["roles", "array-contains", "admin"]],
+ ["products", ["categories", "array-contains", "electronics"]],
+ ["documents", ["tags", "array-contains", "important"]],
+ ["teams", ["technologies", "array-contains", "javascript"]],
+ ["tasks", ["assignees", "array-contains", "user1"]],
+ // Single array-contains-any
+ ["users", ["roles", "array-contains-any", ["admin", "moderator"]]],
+ [
+ "products",
+ ["categories", "array-contains-any", ["electronics", "accessories"]],
+ ],
+ ["documents", ["tags", "array-contains-any", ["urgent", "important"]]],
+ ["teams", ["technologies", "array-contains-any", ["javascript", "python"]]],
+ ["tasks", ["labels", "array-contains-any", ["bug", "feature"]]],
+ // Single in filters
+ ["users", ["status", "in", ["active", "pending"]]],
+ ["products", ["category", "in", ["electronics", "books"]]],
+ ["orders", ["status", "in", ["pending", "processing"]]],
+ ["tasks", ["priority", "in", ["high", "medium", "low"]]],
+ ["teams", ["type", "in", ["development", "design"]]],
+ // Single not-in filters
+ ["users", ["status", "not-in", ["banned", "deleted"]]],
+ ["products", ["category", "not-in", ["discontinued"]]],
+ ["orders", ["status", "not-in", ["cancelled", "refunded"]]],
+ ["documents", ["type", "not-in", ["archived", "draft"]]],
+ ["tasks", ["priority", "not-in", ["none"]]],
+ // Single inequality filters
+ ["users", ["status", "!=", "banned"]],
+ ["products", ["price", "!=", 0]],
+ ["orders", ["total", "!=", 0]],
+ ["tasks", ["assignee", "!=", null]],
+ ["teams", ["size", "!=", 0]],
+ // Single sort orders (ascending)
+ ["users", ["name", "asc"]],
+ ["products", ["price", "asc"]],
+ ["orders", ["date", "asc"]],
+ ["tasks", ["priority", "asc"]],
+ ["teams", ["size", "asc"]],
+ // Single sort orders (descending)
+ ["users", ["createdAt", "desc"]],
+ ["products", ["rating", "desc"]],
+ ["orders", ["total", "desc"]],
+ ["tasks", ["dueDate", "desc"]],
+ ["teams", ["updatedAt", "desc"]],
+ // Simple cursor queries
+ ["users", ["startAt", "A"]],
+ ["users", ["startAfter", "B"]],
+ ["users", ["endAt", "Y"]],
+ ["users", ["endBefore", "Z"]],
+ ["products", ["startAt", 0]],
+ // Equality filter with limit
+ ["users", ["role", "==", "admin"], 10],
+ ["products", ["category", "==", "electronics"], 20],
+ ["orders", ["status", "==", "pending"], 30],
+ ["tasks", ["isComplete", "==", false], 40],
+ ["teams", ["isActive", "==", true], 50],
+ // Range filter with limit
+ ["products", ["price", ">", 100], 10],
+ ["users", ["age", ">=", 21], 20],
+ ["orders", ["total", "<", 1000], 30],
+ ["tasks", ["progress", "<=", 90], 40],
+ ["teams", ["size", ">", 5], 50],
+ // Array filter with limit
+ ["users", ["roles", "array-contains", "admin"], 10],
+ ["products", ["tags", "array-contains", "sale"], 20],
+ ["documents", ["categories", "array-contains", "public"], 30],
+ ["teams", ["members", "array-contains", "john"], 40],
+ ["tasks", ["watchers", "array-contains", "jane"], 50],
+ // In filter with limit
+ ["users", ["status", "in", ["active", "pending"]], 10],
+ ["products", ["category", "in", ["electronics", "books"]], 20],
+ ["orders", ["status", "in", ["new", "processing"]], 30],
+ ["tasks", ["priority", "in", ["high", "medium"]], 40],
+ ["teams", ["type", "in", ["dev", "design"]], 50],
+ // Simple numeric cursor queries
+ ["products", ["startAt", 100]],
+ ["products", ["startAfter", 200]],
+ ["products", ["endAt", 900]],
+ ["products", ["endBefore", 1000]],
+ ["users", ["startAt", 1]],
+ // Single equality with ascending sort
+ ["users", ["role", "==", "user"], ["name", "asc"]],
+ ["products", ["category", "==", "books"], ["price", "asc"]],
+ ["orders", ["status", "==", "active"], ["date", "asc"]],
+ ["tasks", ["type", "==", "bug"], ["priority", "asc"]],
+ ["teams", ["department", "==", "engineering"], ["size", "asc"]],
+ // Single equality with descending sort
+ ["users", ["status", "==", "active"], ["createdAt", "desc"]],
+ ["products", ["isAvailable", "==", true], ["rating", "desc"]],
+ ["orders", ["isPaid", "==", true], ["amount", "desc"]],
+ ["tasks", ["isComplete", "==", false], ["dueDate", "desc"]],
+ ["teams", ["isArchived", "==", false], ["updatedAt", "desc"]],
+ // Single array-contains with sort
+ ["users", ["roles", "array-contains", "user"], ["name", "asc"]],
+ ["products", ["categories", "array-contains", "new"], ["date", "desc"]],
+ ["documents", ["tags", "array-contains", "shared"], ["title", "asc"]],
+ ["teams", ["skills", "array-contains", "react"], ["name", "asc"]],
+ ["tasks", ["labels", "array-contains", "urgent"], ["priority", "desc"]],
+ // Simple cursor with sort
+ ["users", ["name", "asc"], ["startAt", "A"]],
+ ["users", ["name", "desc"], ["startAfter", "B"]],
+ ["users", ["age", "asc"], ["endAt", 50]],
+ ["users", ["score", "desc"], ["endBefore", 100]],
+ ["products", ["price", "asc"], ["startAt", 0]]),
+]
+
+export const qs3 = [
+ // Cursors with equality and sort
+ [
+ "users",
+ ["role", "==", "admin"],
+ ["name", "asc"],
+ [
+ "startAt",
+ { __cursor__: true, id: "1", data: { name: "A", role: "admin" } },
+ ],
+ ],
+ [
+ "products",
+ ["category", "==", "electronics"],
+ ["price", "desc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "2",
+ data: { price: 1000, category: "electronics" },
+ },
+ ],
+ ],
+ [
+ "orders",
+ ["status", "==", "pending"],
+ ["date", "desc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "3",
+ data: { date: "2024-01-01", status: "pending" },
+ },
+ ],
+ ],
+ [
+ "users",
+ ["isActive", "==", true],
+ ["joinDate", "asc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "4",
+ data: { joinDate: "2023-01-01", isActive: true },
+ },
+ ],
+ ],
+ [
+ "products",
+ ["isAvailable", "==", true],
+ ["rating", "desc"],
+ [
+ "startAt",
+ { __cursor__: true, id: "5", data: { rating: 5, isAvailable: true } },
+ ],
+ ],
+
+ // Cursors with array-contains and sort
+ [
+ "users",
+ ["roles", "array-contains", "admin"],
+ ["name", "asc"],
+ [
+ "startAt",
+ { __cursor__: true, id: "6", data: { name: "A", roles: ["admin"] } },
+ ],
+ ],
+ [
+ "products",
+ ["tags", "array-contains", "featured"],
+ ["price", "desc"],
+ [
+ "startAt",
+ { __cursor__: true, id: "7", data: { price: 1000, tags: ["featured"] } },
+ ],
+ ],
+ [
+ "documents",
+ ["categories", "array-contains", "public"],
+ ["title", "asc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "8",
+ data: { title: "A", categories: ["public"] },
+ },
+ ],
+ ],
+ [
+ "teams",
+ ["technologies", "array-contains", "react"],
+ ["name", "asc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "9",
+ data: { name: "A", technologies: ["react"] },
+ },
+ ],
+ ],
+ [
+ "projects",
+ ["members", "array-contains", "john"],
+ ["updatedAt", "desc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "10",
+ data: { updatedAt: "2024-01-01", members: ["john"] },
+ },
+ ],
+ ],
+
+ // Cursors with equality, sort, and limit
+ [
+ "users",
+ ["status", "==", "active"],
+ ["name", "asc"],
+ [
+ "startAt",
+ { __cursor__: true, id: "11", data: { name: "A", status: "active" } },
+ ],
+ 10,
+ ],
+ [
+ "products",
+ ["brand", "==", "Apple"],
+ ["price", "desc"],
+ [
+ "startAt",
+ { __cursor__: true, id: "12", data: { price: 2000, brand: "Apple" } },
+ ],
+ 20,
+ ],
+ [
+ "orders",
+ ["type", "==", "subscription"],
+ ["amount", "desc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "13",
+ data: { amount: 1000, type: "subscription" },
+ },
+ ],
+ 50,
+ ],
+ [
+ "teams",
+ ["department", "==", "engineering"],
+ ["size", "desc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "14",
+ data: { size: 100, department: "engineering" },
+ },
+ ],
+ 25,
+ ],
+ [
+ "documents",
+ ["visibility", "==", "public"],
+ ["createdAt", "desc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "15",
+ data: { createdAt: "2024-01-01", visibility: "public" },
+ },
+ ],
+ 30,
+ ],
+
+ // Cursors with array-contains, sort, and limit
+ [
+ "users",
+ ["permissions", "array-contains", "write"],
+ ["level", "desc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "16",
+ data: { level: 10, permissions: ["write"] },
+ },
+ ],
+ 15,
+ ],
+ [
+ "products",
+ ["categories", "array-contains", "premium"],
+ ["rating", "desc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "17",
+ data: { rating: 5, categories: ["premium"] },
+ },
+ ],
+ 40,
+ ],
+ [
+ "teams",
+ ["skills", "array-contains", "typescript"],
+ ["experience", "desc"],
+ [
+ "startAt",
+ {
+ __cursor__: true,
+ id: "18",
+ data: { experience: 5, skills: ["typescript"] },
+ },
+ ],
+ 35,
+ ],
+ [
+ "projects",
+ ["tags", "array-contains", "featured"],
+ ["priority", "desc"],
+ [
+ "startAt",
+ { __cursor__: true, id: "19", data: { priority: 1, tags: ["featured"] } },
+ ],
+ 45,
+ ],
+ [
+ "documents",
+ ["viewers", "array-contains", "team1"],
+ ["size", "desc"],
+ [
+ "startAt",
+ { __cursor__: true, id: "20", data: { size: 1000, viewers: ["team1"] } },
+ ],
+ 60,
+ ],
+]
diff --git a/lua/test/test.js b/lua/test/test.js
new file mode 100644
index 0000000..a1b3221
--- /dev/null
+++ b/lua/test/test.js
@@ -0,0 +1,499 @@
+import { Src, setup, ok, fail } from "aonote/test/helpers.js"
+import { expect } from "chai"
+import { AO } from "wao/test"
+import { readFileSync } from "fs"
+import { resolve } from "path"
+import forge from "node-forge"
+import { _parser, qs3, qs1, qs2 } from "./parser.js"
+import { reverse, map, isNil } from "ramda"
+const bob = { name: "Bob", age: 5, favs: ["apple", "orange"] }
+const alice = { name: "Alice", age: 10, favs: ["apple", "grape"] }
+const mike = { name: "Mike", age: 15, favs: ["lemon", "peach"] }
+const beth = { name: "Beth", age: 20, favs: ["grape", "peach"] }
+const jeff = { name: "Jeff", age: 25, favs: ["apple", "peach"] }
+const david = { name: "David", age: 25, favs: ["lemon"] }
+const ppl = [bob, alice, mike, beth, jeff, david, beth, jeff, david, bob]
+const ppl2 = [bob, alice, mike, beth]
+
+const rmNull = obj => {
+ for (let k in obj) {
+ if (obj[k] === null) delete obj[k]
+ }
+ return obj
+}
+
+const wait = ms => new Promise(res => setTimeout(() => res(), ms))
+const winston = "000000000000"
+const gewi = "000000000000000000"
+const w = n => Number(n).toString() + winston
+const g = n => Number(n).toString() + gewi
+
+async function deriveEntropyForRSA(prfKey) {
+ const hkdfKeyMaterial = await crypto.subtle.importKey(
+ "raw",
+ prfKey,
+ "HKDF",
+ false,
+ ["deriveBits"],
+ )
+
+ const derivedEntropy = await crypto.subtle.deriveBits(
+ {
+ name: "HKDF",
+ hash: "SHA-256",
+ salt: new Uint8Array(32),
+ info: new Uint8Array(0),
+ },
+ hkdfKeyMaterial,
+ 4096,
+ )
+ return new Uint8Array(derivedEntropy)
+}
+
+function to64(x) {
+ let modulus = Buffer.from(x.toByteArray())
+ if (modulus[0] === 0) modulus = modulus.slice(1)
+ return modulus
+ .toString("base64")
+ .replace(/\+/g, "-")
+ .replace(/\//g, "_")
+ .replace(/=+$/, "")
+}
+
+describe("WeaveDB", function () {
+ this.timeout(0)
+ let ao, ao2, opt, profile, ar, thumbnail, banner, src, data, jwk
+
+ before(async () => {
+ //;({ thumbnail, banner, opt, ao, ao2, ar, profile } = await setup({}))
+ ao2 = new AO()
+ await ao2.ar.gen()
+ ar = ao2.ar
+ src = new Src({ ar, dir: resolve(import.meta.dirname, "../contracts") })
+ })
+
+ it.skip("should generate valid arweave keys with node-forge", async () => {
+ const key = new Uint8Array([])
+ const entropy = await deriveEntropyForRSA(key)
+ const rng = forge.random.createInstance()
+ rng.seedFileSync = () => entropy.toString("hex")
+ const rsaKeyPair = forge.pki.rsa.generateKeyPair({
+ bits: 4096,
+ e: 0x10001,
+ prng: rng,
+ })
+ const { publicKey, privateKey } = rsaKeyPair
+ const { n } = publicKey
+ const { d, p, q, dP, dQ, qInv } = privateKey
+ const jwk = {
+ kty: "RSA",
+ e: "AQAB",
+ n: to64(n),
+ d: to64(d),
+ p: to64(p),
+ q: to64(q),
+ dp: to64(dP),
+ dq: to64(dQ),
+ qi: to64(qInv),
+ }
+ const ao = await new AO().init(jwk)
+ const data = readFileSync(
+ resolve(import.meta.dirname, "../contracts/weavedb.lua"),
+ "utf8",
+ )
+ const { err, pid } = await ao.spwn({})
+ await ao.wait({ pid })
+ ok(await ao.load({ pid, data, fills: { BUNDLER: ao.ar.addr } }))
+ })
+
+ it.only("should deploy weavedb process", async () => {
+ const { pid: _stake, p: stake } = await ao2.deploy({
+ src_data: src.data("staking_mock"),
+ })
+ const { pid: _db, p: db } = await ao2.deploy({
+ src_data: src.data("weavedb"),
+ fills: { BUNDLER: ar.addr, STAKING: _stake },
+ })
+
+ const { mid: mid1 } = await db.msg("Rollup", {
+ data: {
+ block_height: 1,
+ txs: ppl2,
+ diffs: map(v => ({
+ collection: "ppl",
+ doc: v.name,
+ op: "set",
+ data: v,
+ }))(ppl2),
+ },
+ check: "committed!",
+ })
+ const { mid: mid2 } = await db.msg("Rollup", {
+ data: {
+ block_height: 2,
+ txs: ppl2,
+ diffs: map(v => ({
+ collection: "ppl",
+ doc: v.name,
+ op: "delete",
+ data: null,
+ }))(ppl2),
+ },
+ check: "committed!",
+ })
+ const { mid: mid3 } = await db.msg("Rollup", {
+ data: {
+ block_height: 3,
+ txs: ppl2,
+ diffs: map(v => ({
+ collection: "ppl",
+ doc: v.name,
+ op: "update",
+ data: v,
+ }))(ppl2),
+ },
+ check: "committed!",
+ })
+ const get = async (...q) => await db.d("Get", { Query: JSON.stringify(q) })
+
+ const q2 = async (...q) => await db.d("Parse", { Query: JSON.stringify(q) })
+
+ const cget = async (...q) =>
+ await db.d("Cget", { Query: JSON.stringify(q) })
+ await stake.m(
+ "Finalize",
+ { to: _db, height: 1, txid: mid1 },
+ { check: "finalized!" },
+ )
+
+ await stake.m(
+ "Finalize",
+ { to: _db, height: 2, txid: mid2 },
+ { check: "finalized!" },
+ )
+ await stake.m(
+ "Finalize",
+ { to: _db, height: 3, txid: mid3 },
+ { check: "finalized!" },
+ )
+
+ //await wait(3000)
+
+ const res0 = await cget("ppl", "Mike") // use this to skip
+ const resx = await get("ppl", ["age", "desc"], ["endBefore", res0])
+ expect(resx).to.eql([beth])
+ const res = await get("ppl", "Bob")
+
+ expect(res).to.eql(bob)
+
+ expect(await get("ppl")).to.eql([alice, beth, bob, mike])
+ expect(await get("ppl", ["age", "desc"])).to.eql([beth, mike, alice, bob])
+ expect(await get("ppl", ["age"], 2)).to.eql([bob, alice])
+ expect(await get("ppl", ["age", "==", 10], 2)).to.eql([alice])
+ expect(
+ await get("ppl", ["age", "desc"], ["age", "in", [10, 20]], 2),
+ ).to.eql([beth, alice])
+
+ expect(
+ await get("ppl", ["age", "desc"], ["age", "not-in", [10, 20]], 2),
+ ).to.eql([mike, bob])
+
+ expect(await get("ppl", ["age", "desc"], ["age", "!=", 10])).to.eql([
+ beth,
+ mike,
+ bob,
+ ])
+
+ expect(await get("ppl", ["favs", "array-contains", "apple"])).to.eql([
+ alice,
+ bob,
+ ])
+
+ expect(
+ await get(
+ "ppl",
+ ["age", "desc"],
+ ["favs", "array-contains-any", ["grape", "apple"]],
+ ),
+ ).to.eql([beth, alice, bob])
+
+ // test parser
+ let i = 0
+ for (let v of qs3) {
+ const lua = await q2(...v)
+ const js = rmNull(_parser(v))
+ expect(lua).to.eql(js)
+ i++
+ }
+ /*
+ const data2 = readFileSync(
+ resolve(import.meta.dirname, "../contracts/app.lua"),
+ "utf8",
+ )
+ const { pid: pid2 } = ok(await ao.spwn({ module: opt.modules.aos2 }))
+ ok(await ao.wait({ pid: pid2 }))
+ ok(
+ await ao.load({
+ pid: pid2,
+ data: data2,
+ fills: { BUNDLER: ar.addr },
+ }),
+ )
+ const { res: res2, out } = await ao.msg({
+ pid: pid2,
+ act: "Fetch",
+ tags: { DB: pid },
+ get: true,
+ })
+ console.log(out)
+ */
+ })
+
+ it("should test simple staking mechanism", async () => {
+ const { p } = ok(await ao2.deploy({ src_data: src.data("staking2") }))
+ await p.m("setup", { ts: 1, pool: 60, dur: 5 })
+ await p.m("stake", { ts: 1, addr: "a", deposit: 2 })
+ await p.m("stake", { ts: 2, addr: "b", deposit: 1 })
+ await p.m("stake", { ts: 3, addr: "c", deposit: 3 })
+ await p.m("unstake", { ts: 4, addr: "a", deposit: 1 })
+ await p.m("unstake", { ts: 4, addr: "b", deposit: 1 })
+ await p.m("stake", { ts: 5, addr: "c", deposit: 2 })
+ expect((await p.d("get", { ts: 7, addr: "a" })).amount).to.eql("29")
+ expect((await p.d("get", { ts: 7, addr: "b" })).amount).to.eql("6")
+ expect((await p.d("get", { ts: 7, addr: "c" })).amount).to.eql("25")
+ return
+ })
+
+ it("should deploy staking contract", async () => {
+ const infra = await ar.gen()
+ const validator_1 = await ar.gen()
+ const validator_2 = await ar.gen()
+ const delegator_1 = await ar.gen()
+ const delegator_2 = await ar.gen()
+ const { pid: _db, p: db } = ok(
+ await ao2.deploy({ src_data: src.data("tDB") }),
+ )
+ expect(await db.d("Info", "Name")).to.eql("Testnet DB")
+ const { pid: _eth, p: eth } = ok(
+ await ao2.deploy({ src_data: src.data("taoETH") }),
+ )
+ expect(await eth.d("Info", "Name")).to.eql("Testnet aoETH")
+
+ const { pid: _stake, p: stake } = ok(
+ await ao2.deploy({
+ src_data: src.data("staking"),
+ fills: { DB: _db, TOKEN: _eth },
+ }),
+ )
+ const { pid: _wdb, p: wdb } = ok(
+ await ao2.deploy({
+ src_data: src.data("weavedb"),
+ fills: { BUNDLER: infra.addr, STAKING: _stake },
+ }),
+ )
+ const bal = async (p, qty, tar) => {
+ tar ??= ar.addr
+ expect((await p.d("Balances"))[tar]).to.eql(Number(qty).toString())
+ }
+ const getNodes = async () => await stake.d("Get-Nodes")
+ const getDB = async () => await stake.d("Get-DB", { DB: _wdb })
+
+ const stakeBal = async (qty, tar) => {
+ tar ??= ar.addr
+ const out = await getDB()
+ expect(out.stakes[tar]).to.eql(Number(qty).toString())
+ }
+
+ const mint = async (p, qty, exp, jwk) => {
+ await p.m("Mint", { Quantity: qty }, { check: /minted/, jwk })
+ if (!isNil(exp)) await bal(p, exp, jwk ? await ar.toAddr(jwk) : null)
+ }
+
+ const transfer = async (p, qty, exp, to = _stake, jwk) => {
+ await p.m(
+ "Transfer",
+ {
+ Recipient: to,
+ Quantity: qty,
+ "X-DB": _wdb,
+ },
+ { check: /transferred/, jwk },
+ )
+ if (!isNil(exp)) await bal(p, exp, jwk ? await ar.toAddr(jwk) : null)
+ }
+ const delegate = async (who, qty, exp, to = _stake, jwk) => {
+ await eth.m(
+ "Transfer",
+ {
+ Recipient: to,
+ Quantity: qty,
+ "X-DB": _wdb,
+ "X-Action": "Delegate",
+ "X-Delegate-To": who,
+ },
+ { check: /transferred/, jwk },
+ )
+ if (!isNil(exp)) await bal(eth, exp, jwk ? await ar.toAddr(jwk) : null)
+ }
+ const setReward = async (qty, exp, jwk) => {
+ await db.m(
+ "Transfer",
+ {
+ Recipient: _stake,
+ Quantity: qty,
+ "X-Duration": 300000,
+ "X-Action": "Set-Reward",
+ },
+ { check: /transferred/, jwk },
+ )
+ if (!isNil(exp)) await bal(db, exp, jwk ? await ar.toAddr(jwk) : null)
+ }
+ const send = async (p, qty, exp, to = _stake, jwk) => {
+ await p.m(
+ "Transfer",
+ { Recipient: to, Quantity: qty },
+ { check: /transferred/, jwk },
+ )
+ if (!isNil(exp)) await bal(p, exp, jwk ? await ar.toAddr(jwk) : null)
+ }
+
+ const withdraw = async (qty, exp, exp_stake, jwk) => {
+ await stake.m(
+ "Withdraw",
+ { Quantity: qty, DB: _wdb },
+ { check: /withdrew/, jwk },
+ )
+ if (!isNil(exp)) await bal(eth, exp, jwk ? await ar.toAddr(jwk) : null)
+ if (!isNil(exp_stake)) {
+ await stakeBal(exp_stake, jwk ? await ar.toAddr(jwk) : null)
+ }
+ }
+
+ const withdrawDB = async (exp, jwk) => {
+ await stake.m("Withdraw-DB", null, { check: /withdrew/, jwk })
+ if (!isNil(exp)) await bal(db, exp, jwk ? await ar.toAddr(jwk) : null)
+ }
+
+ const info = async () => {
+ return await stake.d("Info", null, {
+ get: [
+ "MinETH",
+ "NodeCount",
+ "TotalStake",
+ "TotalDeposit",
+ "TotalReward",
+ ],
+ })
+ }
+
+ const addNode = async () => {
+ await eth.m(
+ "Transfer",
+ {
+ Recipient: _stake,
+ Quantity: g(1),
+ "X-Action": "Add-Node",
+ "X-URL": "https://test.wdb.ae",
+ },
+ { jwk: infra.jwk, check: /transferred/ },
+ )
+ }
+
+ const addDB = async () => {
+ await stake.m(
+ "Add-DB",
+ {
+ Node: 1,
+ Allocations: {
+ infra: "40",
+ protocol: "10",
+ validators: "40",
+ [delegator_2.addr]: "10",
+ },
+ Price: w(1),
+ DB: _wdb,
+ Validators: 2,
+ "Min-Stake": 1,
+ },
+ { jwk: infra.jwk, check: "db added!" },
+ )
+ }
+ await mint(db, w(20000), w(20000))
+ await setReward(w(10000), w(10000))
+ await mint(eth, g(100), g(100))
+ await send(eth, g(10), g(90), infra.addr)
+ await send(eth, g(10), g(80), validator_1.addr)
+ await send(eth, g(10), g(70), validator_2.addr)
+ await send(eth, g(10), g(60), delegator_1.addr)
+ await send(eth, g(10), g(50), delegator_2.addr)
+ await addNode()
+ await addDB()
+ await transfer(eth, g(1), g(9), _stake, validator_1.jwk)
+ await transfer(eth, g(3), g(7), _stake, validator_2.jwk)
+ await transfer(db, w(100), w(9900))
+ await withdraw(g(2), g(9), g(1), validator_2.jwk)
+ await delegate(validator_1.addr, g(1), g(9), _stake, delegator_1.jwk)
+ const { mid, out } = await wdb.msg("Rollup", {
+ jwk: infra.jwk,
+ data: {
+ hash: "abc",
+ block_height: 1,
+ zkdb: "def",
+ txs: ppl,
+ diffs: map(v => ({
+ collection: "ppl",
+ doc: v.name,
+ op: "set",
+ data: v,
+ }))(ppl),
+ },
+ check: "committed!",
+ get: false,
+ })
+
+ await stake.m(
+ "Validate",
+ { DB: _wdb, Block: 1, ["TxID"]: mid },
+ { check: "validated!", jwk: validator_1.jwk },
+ )
+
+ await stake.m(
+ "Validate",
+ { DB: _wdb, Block: 1, ["TxID"]: mid },
+ { check: "finalized!", jwk: validator_2.jwk },
+ )
+ await withdrawDB(null, infra.jwk)
+ await withdrawDB(null, validator_1.jwk)
+ await stake.m(
+ "Withdraw",
+ { DB: _wdb, "Delegate-To": validator_1.addr, Quantity: g(1) },
+ { jwk: delegator_1.jwk },
+ )
+ //await wait(2000)
+ expect(await eth.d("Balance", { Recipient: delegator_1.addr })).to.eql(
+ g(10) * 1,
+ )
+ })
+
+ it("should deploy tDB token and subledgers", async () => {
+ const { pid, p: tdb } = await ao2.deploy({ src_data: src.data("tDB") })
+ expect(await tdb.d("Info", "Name")).to.eql("Testnet DB")
+ await tdb.m("Mint", { Quantity: "100" })
+ expect((await tdb.d("Balances"))[ar.addr]).to.eql("100")
+ const { pid: pid2, p: node } = await ao2.deploy({
+ src_data: src.data("weavedb_node"),
+ fills: { PARENT: pid, SOURCE: pid },
+ })
+ await tdb.m("Transfer", { Recipient: pid2, Quantity: "10" })
+ //await wait(3000)
+ await node.m("Transfer", {
+ Sender: ar.addr,
+ Recipient: pid2,
+ Quantity: "5",
+ })
+ await node.m("Withdraw", { Quantity: "3" })
+ //await wait(3000)
+ expect((await node.d("Balances"))[ar.addr]).to.eql("2")
+ expect((await tdb.d("Balances"))[ar.addr]).to.eql("93")
+ })
+})
diff --git a/lua/yarn.lock b/lua/yarn.lock
new file mode 100644
index 0000000..a420676
--- /dev/null
+++ b/lua/yarn.lock
@@ -0,0 +1,3705 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz"
+ integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==
+ dependencies:
+ "@babel/highlight" "^7.25.7"
+ picocolors "^1.0.0"
+
+"@babel/generator@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz"
+ integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==
+ dependencies:
+ "@babel/types" "^7.25.7"
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jsesc "^3.0.2"
+
+"@babel/helper-module-imports@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz"
+ integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-module-transforms@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz"
+ integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-simple-access" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+
+"@babel/helper-plugin-utils@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz"
+ integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==
+
+"@babel/helper-simple-access@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz"
+ integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==
+ dependencies:
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/helper-string-parser@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz"
+ integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==
+
+"@babel/helper-validator-identifier@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz"
+ integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==
+
+"@babel/highlight@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz"
+ integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.25.7"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+ picocolors "^1.0.0"
+
+"@babel/parser@^7.25.7":
+ version "7.25.8"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz"
+ integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==
+ dependencies:
+ "@babel/types" "^7.25.8"
+
+"@babel/plugin-transform-modules-commonjs@^7.24.8":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz"
+ integrity sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-simple-access" "^7.25.7"
+
+"@babel/runtime@7.26.0":
+ version "7.26.0"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1"
+ integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz"
+ integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==
+ dependencies:
+ "@babel/code-frame" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/types" "^7.25.7"
+
+"@babel/traverse@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz"
+ integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==
+ dependencies:
+ "@babel/code-frame" "^7.25.7"
+ "@babel/generator" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/template" "^7.25.7"
+ "@babel/types" "^7.25.7"
+ debug "^4.3.1"
+ globals "^11.1.0"
+
+"@babel/types@^7.25.7", "@babel/types@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz"
+ integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ to-fast-properties "^2.0.0"
+
+"@cbor-extract/cbor-extract-darwin-arm64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz#8d65cb861a99622e1b4a268e2d522d2ec6137338"
+ integrity sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==
+
+"@cbor-extract/cbor-extract-darwin-x64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz#9fbec199c888c5ec485a1839f4fad0485ab6c40a"
+ integrity sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==
+
+"@cbor-extract/cbor-extract-linux-arm64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz#bf77e0db4a1d2200a5aa072e02210d5043e953ae"
+ integrity sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==
+
+"@cbor-extract/cbor-extract-linux-arm@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz#491335037eb8533ed8e21b139c59f6df04e39709"
+ integrity sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==
+
+"@cbor-extract/cbor-extract-linux-x64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz#672574485ccd24759bf8fb8eab9dbca517d35b97"
+ integrity sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==
+
+"@cbor-extract/cbor-extract-win32-x64@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz#4b3f07af047f984c082de34b116e765cb9af975f"
+ integrity sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==
+
+"@ethereumjs/common@^2.6.4":
+ version "2.6.5"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30"
+ integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==
+ dependencies:
+ crc-32 "^1.2.0"
+ ethereumjs-util "^7.1.5"
+
+"@ethereumjs/tx@3.5.2":
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c"
+ integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==
+ dependencies:
+ "@ethereumjs/common" "^2.6.4"
+ ethereumjs-util "^7.1.5"
+
+"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449"
+ integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz"
+ integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+
+"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz"
+ integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz"
+ integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+
+"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz"
+ integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+
+"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz"
+ integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+
+"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz"
+ integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ bn.js "^5.2.1"
+
+"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz"
+ integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz"
+ integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+
+"@ethersproject/contracts@5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e"
+ integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==
+ dependencies:
+ "@ethersproject/abi" "^5.7.0"
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+
+"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz"
+ integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz"
+ integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz"
+ integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==
+ dependencies:
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/pbkdf2" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ aes-js "3.0.0"
+ scrypt-js "3.0.1"
+
+"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz"
+ integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ js-sha3 "0.8.0"
+
+"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz"
+ integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==
+
+"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz"
+ integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz"
+ integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+
+"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz"
+ integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==
+ dependencies:
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2":
+ version "5.7.2"
+ resolved "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz"
+ integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/basex" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/networks" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/web" "^5.7.0"
+ bech32 "1.1.4"
+ ws "7.4.6"
+
+"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz"
+ integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz"
+ integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz"
+ integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ hash.js "1.1.7"
+
+"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz"
+ integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ bn.js "^5.2.1"
+ elliptic "6.5.4"
+ hash.js "1.1.7"
+
+"@ethersproject/solidity@5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8"
+ integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/sha2" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz"
+ integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz"
+ integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==
+ dependencies:
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/rlp" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+
+"@ethersproject/units@5.7.0":
+ version "5.7.0"
+ resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1"
+ integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==
+ dependencies:
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/constants" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+
+"@ethersproject/wallet@5.7.0", "@ethersproject/wallet@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz"
+ integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==
+ dependencies:
+ "@ethersproject/abstract-provider" "^5.7.0"
+ "@ethersproject/abstract-signer" "^5.7.0"
+ "@ethersproject/address" "^5.7.0"
+ "@ethersproject/bignumber" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/hdnode" "^5.7.0"
+ "@ethersproject/json-wallets" "^5.7.0"
+ "@ethersproject/keccak256" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/random" "^5.7.0"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wordlists" "^5.7.0"
+
+"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0":
+ version "5.7.1"
+ resolved "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz"
+ integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==
+ dependencies:
+ "@ethersproject/base64" "^5.7.0"
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0":
+ version "5.7.0"
+ resolved "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz"
+ integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/logger" "^5.7.0"
+ "@ethersproject/properties" "^5.7.0"
+ "@ethersproject/strings" "^5.7.0"
+
+"@fastify/busboy@^2.0.0":
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz"
+ integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==
+
+"@grpc/grpc-js@^1.1.0":
+ version "1.12.4"
+ resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.12.4.tgz#3208808435ebf1e495f9a5c5c5a0bc3dc8c9e891"
+ integrity sha512-NBhrxEWnFh0FxeA0d//YP95lRFsSx2TNLEUQg4/W+5f/BMxcCjgOOIT24iD+ZB/tZw057j44DaIxja7w4XMrhg==
+ dependencies:
+ "@grpc/proto-loader" "^0.7.13"
+ "@js-sdsl/ordered-map" "^4.4.2"
+
+"@grpc/proto-loader@^0.5.0":
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.5.6.tgz#1dea4b8a6412b05e2d58514d507137b63a52a98d"
+ integrity sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==
+ dependencies:
+ lodash.camelcase "^4.3.0"
+ protobufjs "^6.8.6"
+
+"@grpc/proto-loader@^0.7.13":
+ version "0.7.13"
+ resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf"
+ integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==
+ dependencies:
+ lodash.camelcase "^4.3.0"
+ long "^5.0.0"
+ protobufjs "^7.2.5"
+ yargs "^17.7.2"
+
+"@hexagon/base64@^1.1.25":
+ version "1.1.28"
+ resolved "https://registry.yarnpkg.com/@hexagon/base64/-/base64-1.1.28.tgz#7d306a97f1423829be5b27c9d388fe50e3099d48"
+ integrity sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==
+
+"@irys/arweave@^0.0.2":
+ version "0.0.2"
+ resolved "https://registry.npmjs.org/@irys/arweave/-/arweave-0.0.2.tgz"
+ integrity sha512-ddE5h4qXbl0xfGlxrtBIwzflaxZUDlDs43TuT0u1OMfyobHul4AA1VEX72Rpzw2bOh4vzoytSqA1jCM7x9YtHg==
+ dependencies:
+ asn1.js "^5.4.1"
+ async-retry "^1.3.3"
+ axios "^1.4.0"
+ base64-js "^1.5.1"
+ bignumber.js "^9.1.1"
+
+"@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.5"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz"
+ integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
+ dependencies:
+ "@jridgewell/set-array" "^1.2.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/set-array@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz"
+ integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
+
+"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
+ version "0.3.25"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz"
+ integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@js-sdsl/ordered-map@^4.4.2":
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c"
+ integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==
+
+"@metamask/eth-sig-util@^4.0.1":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088"
+ integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==
+ dependencies:
+ ethereumjs-abi "^0.6.8"
+ ethereumjs-util "^6.2.1"
+ ethjs-util "^0.1.6"
+ tweetnacl "^1.0.3"
+ tweetnacl-util "^0.15.1"
+
+"@metamask/legacy-web3@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@metamask/legacy-web3/-/legacy-web3-2.0.0.tgz#10c506791ef248d79909ff6321a6b25a3f3d2549"
+ integrity sha512-hR5sbVR0wU3sXMXx2btRBKYzzTkBNTYoZbPHqqB7UARwxm9yEe9C/Y79YyciyzC9cnKetNV6s6VAwNQp5LNpLw==
+
+"@noble/ed25519@^1.6.1":
+ version "1.7.3"
+ resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz"
+ integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==
+
+"@peculiar/asn1-android@^2.3.3":
+ version "2.3.13"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-android/-/asn1-android-2.3.13.tgz#7c5fe42b5f11b4266a40d676476cec9df4ff56f2"
+ integrity sha512-0VTNazDGKrLS6a3BwTDZanqq6DR/I3SbvmDMuS8Be+OYpvM6x1SRDh9AGDsHVnaCOIztOspCPc6N1m+iUv1Xxw==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.3.13"
+ asn1js "^3.0.5"
+ tslib "^2.6.2"
+
+"@peculiar/asn1-ecc@^2.3.4":
+ version "2.3.14"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.3.14.tgz#f5997cd2050fc1f5bbf018d757ef0ebc9a1e4800"
+ integrity sha512-zWPyI7QZto6rnLv6zPniTqbGaLh6zBpJyI46r1yS/bVHJXT2amdMHCRRnbV5yst2H8+ppXG6uXu/M6lKakiQ8w==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.3.13"
+ "@peculiar/asn1-x509" "^2.3.13"
+ asn1js "^3.0.5"
+ tslib "^2.6.2"
+
+"@peculiar/asn1-rsa@^2.3.4":
+ version "2.3.13"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.3.13.tgz#e9630a2a976bde5dfaca969906f684dffce13039"
+ integrity sha512-wBNQqCyRtmqvXkGkL4DR3WxZhHy8fDiYtOjTeCd7SFE5F6GBeafw3EJ94PX/V0OJJrjQ40SkRY2IZu3ZSyBqcg==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.3.13"
+ "@peculiar/asn1-x509" "^2.3.13"
+ asn1js "^3.0.5"
+ tslib "^2.6.2"
+
+"@peculiar/asn1-schema@^2.3.13", "@peculiar/asn1-schema@^2.3.3":
+ version "2.3.13"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.13.tgz#ec8509cdcbc0da3abe73fd7e690556b57a61b8f4"
+ integrity sha512-3Xq3a01WkHRZL8X04Zsfg//mGaA21xlL4tlVn4v2xGT0JStiztATRkMwa5b+f/HXmY2smsiLXYK46Gwgzvfg3g==
+ dependencies:
+ asn1js "^3.0.5"
+ pvtsutils "^1.3.5"
+ tslib "^2.6.2"
+
+"@peculiar/asn1-x509@^2.3.13", "@peculiar/asn1-x509@^2.3.4":
+ version "2.3.13"
+ resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.3.13.tgz#3616fb879b61f1f161a61660ca92f6fe4107af7a"
+ integrity sha512-PfeLQl2skXmxX2/AFFCVaWU8U6FKW1Db43mgBhShCOFS1bVxqtvusq1hVjfuEcuSQGedrLdCSvTgabluwN/M9A==
+ dependencies:
+ "@peculiar/asn1-schema" "^2.3.13"
+ asn1js "^3.0.5"
+ ipaddr.js "^2.1.0"
+ pvtsutils "^1.3.5"
+ tslib "^2.6.2"
+
+"@permaweb/ao-loader@^0.0.44":
+ version "0.0.44"
+ resolved "https://registry.yarnpkg.com/@permaweb/ao-loader/-/ao-loader-0.0.44.tgz#47d568c55068e213d47eeda058f027a26f02aeda"
+ integrity sha512-O/5XuwqxCD9dTIN/jZ6x4rmqIA/Css0bqaXScOrXc0xTz7VjYseM+PNXFf8vAXiOgnNFmrZzDJ0or94cjmqhZA==
+ dependencies:
+ "@permaweb/wasm-metering" "^0.2.2"
+
+"@permaweb/ao-scheduler-utils@~0.0.23":
+ version "0.0.24"
+ resolved "https://registry.npmjs.org/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.24.tgz"
+ integrity sha512-G6109Nz8+dQFPuG7mV8mz66kLVA+gl2uTSqU7qpaRwfujrWi6obM94CpmvyvAnrLo3dB29EYiuv7+KOKcns8ig==
+ dependencies:
+ lru-cache "^10.2.2"
+ ramda "^0.30.0"
+ zod "^3.23.5"
+
+"@permaweb/ao-scheduler-utils@~0.0.25":
+ version "0.0.25"
+ resolved "https://registry.yarnpkg.com/@permaweb/ao-scheduler-utils/-/ao-scheduler-utils-0.0.25.tgz#50c96a411d59f58010ace322d6abd3cd5e11e4cd"
+ integrity sha512-b0UYSTgnLMIYLScrfNBgcqK7ZMmd78L3J0Jz4RIsIq2P5PtkdRqQ7fYqLlltg7bD1f3dvl4TkO1925ED4ei7LA==
+ dependencies:
+ lru-cache "^10.2.2"
+ ramda "^0.30.0"
+ zod "^3.23.5"
+
+"@permaweb/aoconnect@^0.0.61":
+ version "0.0.61"
+ resolved "https://registry.yarnpkg.com/@permaweb/aoconnect/-/aoconnect-0.0.61.tgz#471afcd99a528b25407567cfdfe582df9e30fc7d"
+ integrity sha512-qFIFG29pL7+SUEgW/jHeA4GCuz89XOh5abrsRS8l3dASk6OX00mqMlDT9zJcuewxu21HeDwTW2bO230rvdzGQQ==
+ dependencies:
+ "@permaweb/ao-scheduler-utils" "~0.0.23"
+ "@permaweb/protocol-tag-utils" "~0.0.2"
+ buffer "^6.0.3"
+ debug "^4.3.6"
+ hyper-async "^1.1.2"
+ mnemonist "^0.39.8"
+ ramda "^0.30.1"
+ warp-arbundles "^1.0.4"
+ zod "^3.23.8"
+
+"@permaweb/aoconnect@^0.0.62":
+ version "0.0.62"
+ resolved "https://registry.yarnpkg.com/@permaweb/aoconnect/-/aoconnect-0.0.62.tgz#404d9f506b70385027447a9bd7d3d51b93104ce2"
+ integrity sha512-e42yASru6ze09rugKzi2yD3E57OK0xSbjDM5TI7gKnDVMo8JHweiLCntglItJ44vuNUA7Sdool83v4bmEohaZw==
+ dependencies:
+ "@permaweb/ao-scheduler-utils" "~0.0.25"
+ "@permaweb/protocol-tag-utils" "~0.0.2"
+ buffer "^6.0.3"
+ debug "^4.3.7"
+ hyper-async "^1.1.2"
+ mnemonist "^0.39.8"
+ ramda "^0.30.1"
+ warp-arbundles "^1.0.4"
+ zod "^3.23.8"
+
+"@permaweb/protocol-tag-utils@~0.0.2":
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/@permaweb/protocol-tag-utils/-/protocol-tag-utils-0.0.2.tgz#c8a2eddf7da15d70a6e60aecff839730cb59aee3"
+ integrity sha512-2IiKu71W7pkHKIzxabCGQ5q8DSppZaE/sPcPF2hn+OWwfe04M7b5X5LHRXQNPRuxHWuioieGdPQb3F7apOlffQ==
+
+"@permaweb/wasm-json-toolkit@^0.2.9":
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/@permaweb/wasm-json-toolkit/-/wasm-json-toolkit-0.2.9.tgz#241cdf37c1690a751a73dd05987336142e5576d1"
+ integrity sha512-CGCeUwS+UeqUdvORiyG0LykkQXLTwS5TWc590CUkDfOYyBUSPv8pse0sJStvTC9LKAzuNx3ELBvmqHCI4muUAA==
+ dependencies:
+ buffer-pipe "0.0.3"
+ leb128 "0.0.4"
+ safe-buffer "^5.1.2"
+
+"@permaweb/wasm-metering@^0.2.2":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@permaweb/wasm-metering/-/wasm-metering-0.2.2.tgz#a854c485d9ddbbefb4a17a3692822b696d54a2c7"
+ integrity sha512-xM2MbPkHc4rzhTR6VH5eXtfC+liaYSuNCa0kPRaqSZO2gr1SirJWnzUBDa5VOfTBTgIlIVv5RW+Mkbt/VuK+oA==
+ dependencies:
+ "@permaweb/wasm-json-toolkit" "^0.2.9"
+ leb128 "^0.0.4"
+
+"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf"
+ integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==
+
+"@protobufjs/base64@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735"
+ integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==
+
+"@protobufjs/codegen@^2.0.4":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb"
+ integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==
+
+"@protobufjs/eventemitter@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70"
+ integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==
+
+"@protobufjs/fetch@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45"
+ integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.1"
+ "@protobufjs/inquire" "^1.1.0"
+
+"@protobufjs/float@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1"
+ integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==
+
+"@protobufjs/inquire@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089"
+ integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==
+
+"@protobufjs/path@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d"
+ integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==
+
+"@protobufjs/pool@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54"
+ integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==
+
+"@protobufjs/utf8@^1.1.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
+ integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
+
+"@randlabs/communication-bridge@1.0.1":
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/@randlabs/communication-bridge/-/communication-bridge-1.0.1.tgz"
+ integrity sha512-CzS0U8IFfXNK7QaJFE4pjbxDGfPjbXBEsEaCn9FN15F+ouSAEUQkva3Gl66hrkBZOGexKFEWMwUHIDKpZ2hfVg==
+
+"@randlabs/myalgo-connect@^1.1.2":
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/@randlabs/myalgo-connect/-/myalgo-connect-1.4.2.tgz"
+ integrity sha512-K9hEyUi7G8tqOp7kWIALJLVbGCByhilcy6123WfcorxWwiE1sbQupPyIU5f3YdQK6wMjBsyTWiLW52ZBMp7sXA==
+ dependencies:
+ "@randlabs/communication-bridge" "1.0.1"
+
+"@simplewebauthn/iso-webcrypto@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@simplewebauthn/iso-webcrypto/-/iso-webcrypto-7.4.0.tgz#f994132bd7bbcb762fc08021566971aad9005500"
+ integrity sha512-LSx8zghjH+z9IFOhBdDv2AyhqnzDUCYFxFiwJbToowOigCgf4Y8fyZle9Y+0NS232bIoU6j/lgv5iT32m3eGyA==
+ dependencies:
+ "@simplewebauthn/typescript-types" "^7.4.0"
+ "@types/node" "^18.11.9"
+
+"@simplewebauthn/server@^7.2.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@simplewebauthn/server/-/server-7.4.0.tgz#eb76e30f0c6d9e7fb323b8598c1b2d132e5873e0"
+ integrity sha512-Y6jj2WsE3zBDagSdOg3b7+SMw7zHku0Od45Q1ZpA19Wd5aUbV2mH281SbdhFN4UuKcGQSeeAgUObAWHvgxNOVA==
+ dependencies:
+ "@hexagon/base64" "^1.1.25"
+ "@peculiar/asn1-android" "^2.3.3"
+ "@peculiar/asn1-ecc" "^2.3.4"
+ "@peculiar/asn1-rsa" "^2.3.4"
+ "@peculiar/asn1-schema" "^2.3.3"
+ "@peculiar/asn1-x509" "^2.3.4"
+ "@simplewebauthn/iso-webcrypto" "^7.4.0"
+ "@simplewebauthn/typescript-types" "^7.4.0"
+ "@types/debug" "^4.1.7"
+ "@types/node" "^18.11.9"
+ cbor-x "^1.4.1"
+ cross-fetch "^3.1.5"
+ debug "^4.3.2"
+
+"@simplewebauthn/typescript-types@^7.4.0":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@simplewebauthn/typescript-types/-/typescript-types-7.4.0.tgz#1f5d55e187cbd30727a75543caf1bade747625ce"
+ integrity sha512-8/ZjHeUPe210Bt5oyaOIGx4h8lHdsQs19BiOT44gi/jBEgK7uBGA0Fy7NRsyh777al3m6WM0mBf0UR7xd4R7WQ==
+
+"@types/bn.js@5.1.6", "@types/bn.js@^5.1.0":
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.6.tgz#9ba818eec0c85e4d3c679518428afdf611d03203"
+ integrity sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==
+ dependencies:
+ "@types/node" "*"
+
+"@types/bn.js@^4.11.3":
+ version "4.11.6"
+ resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c"
+ integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==
+ dependencies:
+ "@types/node" "*"
+
+"@types/debug@^4.1.7":
+ version "4.1.12"
+ resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917"
+ integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==
+ dependencies:
+ "@types/ms" "*"
+
+"@types/long@^4.0.1":
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a"
+ integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==
+
+"@types/ms@*":
+ version "0.7.34"
+ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433"
+ integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==
+
+"@types/node@*", "@types/node@>=13.7.0":
+ version "22.10.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9"
+ integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==
+ dependencies:
+ undici-types "~6.20.0"
+
+"@types/node@^18.11.9":
+ version "18.19.68"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.68.tgz#f4f10d9927a7eaf3568c46a6d739cc0967ccb701"
+ integrity sha512-QGtpFH1vB99ZmTa63K4/FU8twThj4fuVSBkGddTp7uIL/cuoLWIUSL2RcOaigBhfR+hg5pgGkBnkoOxrTVBMKw==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/pbkdf2@^3.0.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.2.tgz#2dc43808e9985a2c69ff02e2d2027bd4fe33e8dc"
+ integrity sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==
+ dependencies:
+ "@types/node" "*"
+
+"@types/secp256k1@^4.0.1":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.6.tgz#d60ba2349a51c2cbc5e816dcd831a42029d376bf"
+ integrity sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==
+ dependencies:
+ "@types/node" "*"
+
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn@7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
+ integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
+
+aes-js@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz"
+ integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==
+
+algo-msgpack-with-bigint@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/algo-msgpack-with-bigint/-/algo-msgpack-with-bigint-2.1.1.tgz"
+ integrity sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==
+
+algosdk@^1.13.1:
+ version "1.24.1"
+ resolved "https://registry.npmjs.org/algosdk/-/algosdk-1.24.1.tgz"
+ integrity sha512-9moZxdqeJ6GdE4N6fA/GlUP4LrbLZMYcYkt141J4Ss68OfEgH9qW0wBuZ3ZOKEx/xjc5bg7mLP2Gjg7nwrkmww==
+ dependencies:
+ algo-msgpack-with-bigint "^2.1.1"
+ buffer "^6.0.2"
+ cross-fetch "^3.1.5"
+ hi-base32 "^0.5.1"
+ js-sha256 "^0.9.0"
+ js-sha3 "^0.8.0"
+ js-sha512 "^0.8.0"
+ json-bigint "^1.0.0"
+ tweetnacl "^1.0.3"
+ vlq "^2.0.4"
+
+ansi-colors@^4.1.3:
+ 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==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+aonote@^0.10.1:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/aonote/-/aonote-0.10.1.tgz#ee58857ff52145080f9f4f187f1dec1e980f34cb"
+ integrity sha512-pgG+BV4Rea2HDBvKw7de94We2Aq9TLRimWRY3BEoSpInzCdH7DxIBhTF14vD5bTP1yqmlHeyg6Wy5EX3qWsD8A==
+ dependencies:
+ "@babel/plugin-transform-modules-commonjs" "^7.24.8"
+ "@permaweb/aoconnect" "^0.0.61"
+ arbundles "^0.11.1"
+ arweave "^1.15.1"
+ ramda "^0.30.1"
+ test "^3.3.0"
+
+arbundles@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.npmjs.org/arbundles/-/arbundles-0.11.2.tgz"
+ integrity sha512-vyX7vY6S8B4RFhGSoCixbnR/Z7ckpJjK+b/H7zcgRWJqqXjZqQ+3DQIJ19vKl5AvzNSsj5ja9kQDoZhMiGpBFw==
+ dependencies:
+ "@ethersproject/bytes" "^5.7.0"
+ "@ethersproject/hash" "^5.7.0"
+ "@ethersproject/providers" "^5.7.2"
+ "@ethersproject/signing-key" "^5.7.0"
+ "@ethersproject/transactions" "^5.7.0"
+ "@ethersproject/wallet" "^5.7.0"
+ "@irys/arweave" "^0.0.2"
+ "@noble/ed25519" "^1.6.1"
+ base64url "^3.0.1"
+ bs58 "^4.0.1"
+ keccak "^3.0.2"
+ secp256k1 "^5.0.0"
+ optionalDependencies:
+ "@randlabs/myalgo-connect" "^1.1.2"
+ algosdk "^1.13.1"
+ arweave-stream-tx "^1.1.0"
+ multistream "^4.1.0"
+ tmp-promise "^3.0.2"
+
+arconnect@^0.4.2:
+ version "0.4.2"
+ resolved "https://registry.npmjs.org/arconnect/-/arconnect-0.4.2.tgz"
+ integrity sha512-Jkpd4QL3TVqnd3U683gzXmZUVqBUy17DdJDuL/3D9rkysLgX6ymJ2e+sR+xyZF5Rh42CBqDXWNMmCjBXeP7Gbw==
+ dependencies:
+ arweave "^1.10.13"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-buffer-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz"
+ integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==
+ dependencies:
+ call-bind "^1.0.5"
+ is-array-buffer "^3.0.4"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+arraybuffer.prototype.slice@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz"
+ integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ es-abstract "^1.22.3"
+ es-errors "^1.2.1"
+ get-intrinsic "^1.2.3"
+ is-array-buffer "^3.0.4"
+ is-shared-array-buffer "^1.0.2"
+
+arweave-stream-tx@^1.1.0:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/arweave-stream-tx/-/arweave-stream-tx-1.2.2.tgz"
+ integrity sha512-bNt9rj0hbAEzoUZEF2s6WJbIz8nasZlZpxIw03Xm8fzb9gRiiZlZGW3lxQLjfc9Z0VRUWDzwtqoYeEoB/JDToQ==
+ dependencies:
+ exponential-backoff "^3.1.0"
+
+arweave@^1.10.13, arweave@^1.12.2, arweave@^1.13.7, arweave@^1.15.1:
+ version "1.15.5"
+ resolved "https://registry.npmjs.org/arweave/-/arweave-1.15.5.tgz"
+ integrity sha512-Zj3b8juz1ZtDaQDPQlzWyk2I4wZPx3RmcGq8pVJeZXl2Tjw0WRy5ueHPelxZtBLqCirGoZxZEAFRs6SZUSCBjg==
+ dependencies:
+ arconnect "^0.4.2"
+ asn1.js "^5.4.1"
+ base64-js "^1.5.1"
+ bignumber.js "^9.0.2"
+
+asn1.js@^5.4.1:
+ version "5.4.1"
+ resolved "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz"
+ integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ safer-buffer "^2.1.0"
+
+asn1js@^3.0.5:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38"
+ integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==
+ dependencies:
+ pvtsutils "^1.3.2"
+ pvutils "^1.1.3"
+ tslib "^2.4.0"
+
+assertion-error@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz"
+ integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==
+
+async-retry@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz"
+ integrity sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==
+ dependencies:
+ retry "0.13.1"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+ dependencies:
+ possible-typed-array-names "^1.0.0"
+
+axios@^1.4.0:
+ version "1.7.7"
+ resolved "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz"
+ integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==
+ dependencies:
+ follow-redirects "^1.15.6"
+ form-data "^4.0.0"
+ proxy-from-env "^1.1.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+base-x@^3.0.2:
+ version "3.0.10"
+ resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz"
+ integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+base64-js@^1.3.1, base64-js@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base64url@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz"
+ integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==
+
+bech32@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz"
+ integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==
+
+bignumber.js@^9.0.0, bignumber.js@^9.0.2, bignumber.js@^9.1.1, bignumber.js@^9.1.2:
+ version "9.1.2"
+ resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz"
+ integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==
+
+binary-extensions@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
+bindings@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+ integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
+ dependencies:
+ file-uri-to-path "1.0.0"
+
+bip66@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22"
+ integrity sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+blakejs@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814"
+ integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==
+
+bn.js@^4.0.0, bn.js@^4.11.9:
+ version "4.12.0"
+ resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
+ integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==
+
+bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8:
+ version "4.12.1"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7"
+ integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==
+
+bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz"
+ integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==
+
+body-parser@1.20.3, body-parser@^1.20.3:
+ version "1.20.3"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6"
+ integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.5"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.13.0"
+ raw-body "2.5.2"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ 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.2:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+brorand@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
+ integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==
+
+browser-stdout@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+browserify-aes@^1.0.6, browserify-aes@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+bs58@^4.0.0, bs58@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz"
+ integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==
+ dependencies:
+ base-x "^3.0.2"
+
+bs58check@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc"
+ integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==
+ dependencies:
+ bs58 "^4.0.0"
+ create-hash "^1.1.0"
+ safe-buffer "^5.1.2"
+
+buffer-pipe@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/buffer-pipe/-/buffer-pipe-0.0.0.tgz#186ec257d696e8e74c3051160a0e9e9a9811a387"
+ integrity sha512-PvKbsvQOH4dcUyUEvQQSs3CIkkuPcOHt3gKnXwf4HsPKFDxSN7bkmICVIWgOmW/jx/fAEGGn4mIayIJPLs7G8g==
+ dependencies:
+ safe-buffer "^5.1.1"
+
+buffer-pipe@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-pipe/-/buffer-pipe-0.0.3.tgz#242197681d4591e7feda213336af6c07a5ce2409"
+ integrity sha512-GlxfuD/NrKvCNs0Ut+7b1IHjylfdegMBxQIlZHj7bObKVQBxB5S84gtm2yu1mQ8/sSggceWBDPY0cPXgvX2MuA==
+ dependencies:
+ safe-buffer "^5.1.2"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+ integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==
+
+buffer@^6.0.2, buffer@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz"
+ integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.2.1"
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+call-bind-apply-helpers@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840"
+ integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
+call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz"
+ integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.1"
+
+call-bound@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681"
+ integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ get-intrinsic "^1.2.6"
+
+camelcase@^6.0.0:
+ version "6.3.0"
+ resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+cbor-extract@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/cbor-extract/-/cbor-extract-2.2.0.tgz#cee78e630cbeae3918d1e2e58e0cebaf3a3be840"
+ integrity sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==
+ dependencies:
+ node-gyp-build-optional-packages "5.1.1"
+ optionalDependencies:
+ "@cbor-extract/cbor-extract-darwin-arm64" "2.2.0"
+ "@cbor-extract/cbor-extract-darwin-x64" "2.2.0"
+ "@cbor-extract/cbor-extract-linux-arm" "2.2.0"
+ "@cbor-extract/cbor-extract-linux-arm64" "2.2.0"
+ "@cbor-extract/cbor-extract-linux-x64" "2.2.0"
+ "@cbor-extract/cbor-extract-win32-x64" "2.2.0"
+
+cbor-x@^1.4.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/cbor-x/-/cbor-x-1.6.0.tgz#89c35d2d805efc30e09a28349425cc05d57aacd7"
+ integrity sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==
+ optionalDependencies:
+ cbor-extract "^2.2.0"
+
+chai@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz"
+ integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==
+ dependencies:
+ assertion-error "^2.0.1"
+ check-error "^2.1.1"
+ deep-eql "^5.0.1"
+ loupe "^3.1.0"
+ pathval "^2.0.0"
+
+chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+charenc@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
+ integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==
+
+check-error@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz"
+ integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==
+
+chokidar@^3.5.3:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.6.tgz#8fe672437d01cd6c4561af5334e0cc50ff1955f7"
+ integrity sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==
+ dependencies:
+ inherits "^2.0.4"
+ safe-buffer "^5.2.1"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ 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.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4, content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9"
+ integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
+
+cors@^2.8.5:
+ version "2.8.5"
+ resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+ integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+ dependencies:
+ object-assign "^4"
+ vary "^1"
+
+crc-32@^1.2.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+ integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.4, create-hmac@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-fetch@^3.1.5:
+ version "3.1.8"
+ resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz"
+ integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==
+ dependencies:
+ node-fetch "^2.6.12"
+
+crypt@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
+ integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==
+
+data-view-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz"
+ integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz"
+ integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+data-view-byte-offset@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz"
+ integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+debug@2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^4.3.1, debug@^4.3.5, debug@^4.3.6:
+ version "4.3.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
+ dependencies:
+ ms "^2.1.3"
+
+debug@^4.3.2, debug@^4.3.7:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
+ integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
+ dependencies:
+ ms "^2.1.3"
+
+decamelize@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz"
+ integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
+
+deep-eql@^5.0.1:
+ version "5.0.2"
+ resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz"
+ integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==
+
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-properties@^1.2.0, define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-libc@^2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
+ integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==
+
+diff@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz"
+ integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==
+
+dotenv@^16.4.5:
+ version "16.4.5"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f"
+ integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==
+
+drbg.js@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b"
+ integrity sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==
+ dependencies:
+ browserify-aes "^1.0.6"
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+
+dunder-proto@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
+eccrypto@1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/eccrypto/-/eccrypto-1.1.6.tgz#846bd1222323036f7a3515613704386399702bd3"
+ integrity sha512-d78ivVEzu7Tn0ZphUUaL43+jVPKTMPFGtmgtz1D0LrFn7cY3K8CdrvibuLz2AAkHBLKZtR8DMbB2ukRYFk987A==
+ dependencies:
+ acorn "7.1.1"
+ elliptic "6.5.4"
+ es6-promise "4.2.8"
+ nan "2.14.0"
+ optionalDependencies:
+ secp256k1 "3.7.1"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+elliptic@6.5.4, elliptic@^6.5.4:
+ version "6.5.4"
+ resolved "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz"
+ integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+elliptic@^6.4.1, elliptic@^6.5.2, elliptic@^6.5.7:
+ version "6.6.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06"
+ integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==
+ dependencies:
+ bn.js "^4.11.9"
+ brorand "^1.1.0"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.1"
+ inherits "^2.0.4"
+ minimalistic-assert "^1.0.1"
+ minimalistic-crypto-utils "^1.0.1"
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+encodeurl@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+ integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
+es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2:
+ version "1.23.3"
+ resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz"
+ integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ arraybuffer.prototype.slice "^1.0.3"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ data-view-buffer "^1.0.1"
+ data-view-byte-length "^1.0.1"
+ data-view-byte-offset "^1.0.0"
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ es-set-tostringtag "^2.0.3"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.6"
+ get-intrinsic "^1.2.4"
+ get-symbol-description "^1.0.2"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.0.3"
+ has-symbols "^1.0.3"
+ hasown "^2.0.2"
+ internal-slot "^1.0.7"
+ is-array-buffer "^3.0.4"
+ is-callable "^1.2.7"
+ is-data-view "^1.0.1"
+ is-negative-zero "^2.0.3"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.3"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.13"
+ is-weakref "^1.0.2"
+ object-inspect "^1.13.1"
+ object-keys "^1.1.1"
+ object.assign "^4.1.5"
+ regexp.prototype.flags "^1.5.2"
+ safe-array-concat "^1.1.2"
+ safe-regex-test "^1.0.3"
+ string.prototype.trim "^1.2.9"
+ string.prototype.trimend "^1.0.8"
+ string.prototype.trimstart "^1.0.8"
+ typed-array-buffer "^1.0.2"
+ typed-array-byte-length "^1.0.1"
+ typed-array-byte-offset "^1.0.2"
+ typed-array-length "^1.0.6"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.15"
+
+es-define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz"
+ integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+
+es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
+es-errors@^1.2.1, es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz"
+ integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz"
+ integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==
+ dependencies:
+ get-intrinsic "^1.2.4"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es6-promise@4.2.8:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
+ integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
+
+escalade@^3.1.1:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+eth-crypto@^2.3.0, eth-crypto@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/eth-crypto/-/eth-crypto-2.7.0.tgz#b859bf4f45660750fa144d74281b5560e362085d"
+ integrity sha512-MWbDl7OAoBAjkF2a7tklffAJv68uDI/MGPJKontt460nldJ8/2xT4cQacS8sGa6XJlon4ux1nAVzRoa4GxspOQ==
+ dependencies:
+ "@babel/runtime" "7.26.0"
+ "@ethereumjs/tx" "3.5.2"
+ "@types/bn.js" "5.1.6"
+ eccrypto "1.1.6"
+ ethereumjs-util "7.1.5"
+ ethers "5.7.2"
+ secp256k1 "5.0.1"
+
+ethereum-cryptography@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191"
+ integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==
+ dependencies:
+ "@types/pbkdf2" "^3.0.0"
+ "@types/secp256k1" "^4.0.1"
+ blakejs "^1.1.0"
+ browserify-aes "^1.2.0"
+ bs58check "^2.1.2"
+ create-hash "^1.2.0"
+ create-hmac "^1.1.7"
+ hash.js "^1.1.7"
+ keccak "^3.0.0"
+ pbkdf2 "^3.0.17"
+ randombytes "^2.1.0"
+ safe-buffer "^5.1.2"
+ scrypt-js "^3.0.0"
+ secp256k1 "^4.0.1"
+ setimmediate "^1.0.5"
+
+ethereumjs-abi@^0.6.8:
+ version "0.6.8"
+ resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae"
+ integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==
+ dependencies:
+ bn.js "^4.11.8"
+ ethereumjs-util "^6.0.0"
+
+ethereumjs-util@7.1.5, ethereumjs-util@^7.1.5:
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181"
+ integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==
+ dependencies:
+ "@types/bn.js" "^5.1.0"
+ bn.js "^5.1.2"
+ create-hash "^1.1.2"
+ ethereum-cryptography "^0.1.3"
+ rlp "^2.2.4"
+
+ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69"
+ integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==
+ dependencies:
+ "@types/bn.js" "^4.11.3"
+ bn.js "^4.11.0"
+ create-hash "^1.1.2"
+ elliptic "^6.5.2"
+ ethereum-cryptography "^0.1.3"
+ ethjs-util "0.1.6"
+ rlp "^2.2.3"
+
+ethers@5.7.2:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e"
+ integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==
+ dependencies:
+ "@ethersproject/abi" "5.7.0"
+ "@ethersproject/abstract-provider" "5.7.0"
+ "@ethersproject/abstract-signer" "5.7.0"
+ "@ethersproject/address" "5.7.0"
+ "@ethersproject/base64" "5.7.0"
+ "@ethersproject/basex" "5.7.0"
+ "@ethersproject/bignumber" "5.7.0"
+ "@ethersproject/bytes" "5.7.0"
+ "@ethersproject/constants" "5.7.0"
+ "@ethersproject/contracts" "5.7.0"
+ "@ethersproject/hash" "5.7.0"
+ "@ethersproject/hdnode" "5.7.0"
+ "@ethersproject/json-wallets" "5.7.0"
+ "@ethersproject/keccak256" "5.7.0"
+ "@ethersproject/logger" "5.7.0"
+ "@ethersproject/networks" "5.7.1"
+ "@ethersproject/pbkdf2" "5.7.0"
+ "@ethersproject/properties" "5.7.0"
+ "@ethersproject/providers" "5.7.2"
+ "@ethersproject/random" "5.7.0"
+ "@ethersproject/rlp" "5.7.0"
+ "@ethersproject/sha2" "5.7.0"
+ "@ethersproject/signing-key" "5.7.0"
+ "@ethersproject/solidity" "5.7.0"
+ "@ethersproject/strings" "5.7.0"
+ "@ethersproject/transactions" "5.7.0"
+ "@ethersproject/units" "5.7.0"
+ "@ethersproject/wallet" "5.7.0"
+ "@ethersproject/web" "5.7.1"
+ "@ethersproject/wordlists" "5.7.0"
+
+ethjs-util@0.1.6, ethjs-util@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536"
+ integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+ strip-hex-prefix "1.0.0"
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+events@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exponential-backoff@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz"
+ integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==
+
+express@^4.21.2:
+ version "4.21.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32"
+ integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.3"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.7.1"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.3.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.3"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.12"
+ proxy-addr "~2.0.7"
+ qs "6.13.0"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.19.0"
+ serve-static "1.16.2"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+file-uri-to-path@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+ integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ 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"
+
+finalhandler@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019"
+ integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ 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"
+ path-exists "^4.0.0"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+follow-redirects@^1.15.6:
+ version "1.15.9"
+ resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz"
+ integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+form-data@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz"
+ integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz"
+ integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ functions-have-names "^1.2.3"
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz"
+ integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-intrinsic@^1.2.5, get-intrinsic@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5"
+ integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ dunder-proto "^1.0.0"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ function-bind "^1.1.2"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ math-intrinsics "^1.0.0"
+
+get-symbol-description@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz"
+ integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==
+ dependencies:
+ call-bind "^1.0.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+
+glob-parent@~5.1.2:
+ version "5.1.2"
+ 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@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz"
+ integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^5.0.1"
+ once "^1.3.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globalthis@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz"
+ integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+ dependencies:
+ define-properties "^1.2.1"
+ gopd "^1.0.1"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+
+graphql@^16.10.0:
+ version "16.10.0"
+ resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.10.0.tgz#24c01ae0af6b11ea87bf55694429198aaa8e220c"
+ integrity sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
+has-proto@^1.0.1, has-proto@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz"
+ integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
+
+has-tostringtag@^1.0.0, has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
+hash-base@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+ integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.6.0"
+ safe-buffer "^5.2.0"
+
+hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz"
+ integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+hi-base32@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.npmjs.org/hi-base32/-/hi-base32-0.5.1.tgz"
+ integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==
+
+hmac-drbg@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz"
+ integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+hyper-async@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/hyper-async/-/hyper-async-1.1.2.tgz"
+ integrity sha512-cnpOgKa+5FZOaccTtjduac1FrZuSc38/ftCp3vYJdUMt+7c+uvGDKLDK4MTNK8D3aFjIeveVrPcSgUPvzZLopg==
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+internal-slot@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz"
+ integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==
+ dependencies:
+ es-errors "^1.3.0"
+ hasown "^2.0.0"
+ side-channel "^1.0.4"
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+ipaddr.js@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8"
+ integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==
+
+is-array-buffer@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz"
+ integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-buffer@~1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-data-view@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz"
+ integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==
+ dependencies:
+ is-typed-array "^1.1.13"
+
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ 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.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-hex-prefixed@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554"
+ integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==
+
+is-negative-zero@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz"
+ integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-plain-obj@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz"
+ integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz"
+ integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==
+ dependencies:
+ call-bind "^1.0.7"
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.13:
+ version "1.1.13"
+ resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz"
+ integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==
+ dependencies:
+ which-typed-array "^1.1.14"
+
+is-unicode-supported@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz"
+ integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+js-sha256@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz"
+ integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==
+
+js-sha3@0.8.0, js-sha3@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz"
+ integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
+js-sha512@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.npmjs.org/js-sha512/-/js-sha512-0.8.0.tgz"
+ integrity sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
+
+json-bigint@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz"
+ integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==
+ dependencies:
+ bignumber.js "^9.0.0"
+
+keccak@^3.0.0, keccak@^3.0.2:
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz"
+ integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==
+ dependencies:
+ node-addon-api "^2.0.0"
+ node-gyp-build "^4.2.0"
+ readable-stream "^3.6.0"
+
+leb128@0.0.4, leb128@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/leb128/-/leb128-0.0.4.tgz#f96d698cf3ba5b677423abfe50b7e9b2df1463ff"
+ integrity sha512-2zejk0fCIgY8RVcc/KzvyfpDio5Oo8HgPZmkrOmdwmbk0KpKpgD+JKwikxKk8cZYkANIhwHK50SNukkCm3XkCQ==
+ dependencies:
+ bn.js "^4.11.6"
+ buffer-pipe "0.0.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ 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.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+ integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==
+
+log-symbols@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz"
+ integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+ dependencies:
+ chalk "^4.1.0"
+ is-unicode-supported "^0.1.0"
+
+long@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+ integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
+
+long@^5.0.0:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1"
+ integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==
+
+loupe@^3.1.0:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz"
+ integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==
+
+lru-cache@^10.2.2:
+ version "10.4.3"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
+math-intrinsics@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.0.0.tgz#4e04bf87c85aa51e90d078dac2252b4eb5260817"
+ integrity sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==
+
+md5.js@^1.3.4:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+ integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+md5@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
+ integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
+ dependencies:
+ charenc "0.0.2"
+ crypt "0.0.2"
+ is-buffer "~1.1.6"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+merge-descriptors@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
+ integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
+ integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
+
+minimatch@^5.0.1, minimatch@^5.1.6:
+ version "5.1.6"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+mnemonist@^0.39.8:
+ version "0.39.8"
+ resolved "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz"
+ integrity sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==
+ dependencies:
+ obliterator "^2.0.1"
+
+mocha@^10.7.3:
+ version "10.7.3"
+ resolved "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz"
+ integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==
+ dependencies:
+ ansi-colors "^4.1.3"
+ browser-stdout "^1.3.1"
+ chokidar "^3.5.3"
+ debug "^4.3.5"
+ diff "^5.2.0"
+ escape-string-regexp "^4.0.0"
+ find-up "^5.0.0"
+ glob "^8.1.0"
+ he "^1.2.0"
+ js-yaml "^4.1.0"
+ log-symbols "^4.1.0"
+ minimatch "^5.1.6"
+ ms "^2.1.3"
+ serialize-javascript "^6.0.2"
+ strip-json-comments "^3.1.1"
+ supports-color "^8.1.1"
+ workerpool "^6.5.1"
+ yargs "^16.2.0"
+ yargs-parser "^20.2.9"
+ yargs-unparser "^2.0.0"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.3, ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multistream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz"
+ integrity sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==
+ dependencies:
+ once "^1.4.0"
+ readable-stream "^3.6.0"
+
+nan@2.14.0:
+ version "2.14.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
+ integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
+
+nan@^2.14.0:
+ version "2.22.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3"
+ integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+node-addon-api@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz"
+ integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==
+
+node-addon-api@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz"
+ integrity sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==
+
+node-fetch@^2.6.12:
+ 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==
+ dependencies:
+ whatwg-url "^5.0.0"
+
+node-forge@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
+ integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
+
+node-gyp-build-optional-packages@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz#52b143b9dd77b7669073cbfe39e3f4118bfc603c"
+ integrity sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==
+ dependencies:
+ detect-libc "^2.0.1"
+
+node-gyp-build@^4.2.0:
+ version "4.8.2"
+ resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz"
+ integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+object-assign@^4:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.13.1:
+ version "1.13.2"
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz"
+ integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==
+
+object-inspect@^1.13.3:
+ version "1.13.3"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a"
+ integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz"
+ integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==
+ dependencies:
+ call-bind "^1.0.5"
+ define-properties "^1.2.1"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+obliterator@^2.0.1:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz"
+ integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ 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.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"
+
+pako@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86"
+ integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==
+
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-to-regexp@0.1.12:
+ version "0.1.12"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7"
+ integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==
+
+pathval@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz"
+ integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==
+
+pbkdf2@^3.0.17:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075"
+ integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+picocolors@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz"
+ integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
+
+picomatch@^2.0.4, picomatch@^2.2.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+possible-typed-array-names@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz"
+ integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
+
+protobufjs@^6.8.6:
+ version "6.11.4"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa"
+ integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/long" "^4.0.1"
+ "@types/node" ">=13.7.0"
+ long "^4.0.0"
+
+protobufjs@^7.2.5:
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.4.0.tgz#7efe324ce9b3b61c82aae5de810d287bc08a248a"
+ integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==
+ dependencies:
+ "@protobufjs/aspromise" "^1.1.2"
+ "@protobufjs/base64" "^1.1.2"
+ "@protobufjs/codegen" "^2.0.4"
+ "@protobufjs/eventemitter" "^1.1.0"
+ "@protobufjs/fetch" "^1.1.0"
+ "@protobufjs/float" "^1.0.2"
+ "@protobufjs/inquire" "^1.1.0"
+ "@protobufjs/path" "^1.1.2"
+ "@protobufjs/pool" "^1.1.0"
+ "@protobufjs/utf8" "^1.1.0"
+ "@types/node" ">=13.7.0"
+ long "^5.0.0"
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+pvtsutils@^1.3.2, pvtsutils@^1.3.5:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001"
+ integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==
+ dependencies:
+ tslib "^2.8.1"
+
+pvutils@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3"
+ integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==
+
+qs@6.13.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906"
+ integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==
+ dependencies:
+ side-channel "^1.0.6"
+
+ramda@^0.28.0:
+ version "0.28.0"
+ resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.28.0.tgz#acd785690100337e8b063cab3470019be427cc97"
+ integrity sha512-9QnLuG/kPVgWvMQ4aODhsBUFKOUmnbUnsSXACv+NCQZcHbeb+v8Lodp8OVxtRULN1/xOyYLLaL6npE6dMq5QTA==
+
+ramda@^0.30.0, ramda@^0.30.1:
+ version "0.30.1"
+ resolved "https://registry.npmjs.org/ramda/-/ramda-0.30.1.tgz"
+ integrity sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.2:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a"
+ integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+readable-stream@^3.6.0:
+ version "3.6.2"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@^4.3.0:
+ version "4.5.2"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz"
+ integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==
+ dependencies:
+ abort-controller "^3.0.0"
+ buffer "^6.0.3"
+ events "^3.3.0"
+ process "^0.11.10"
+ string_decoder "^1.3.0"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+regenerator-runtime@^0.14.0:
+ version "0.14.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
+ integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
+
+regexp.prototype.flags@^1.5.2:
+ version "1.5.3"
+ resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz"
+ integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-errors "^1.3.0"
+ set-function-name "^2.0.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+retry@0.13.1:
+ version "0.13.1"
+ resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz"
+ integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+rlp@^2.2.3, rlp@^2.2.4:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf"
+ integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==
+ dependencies:
+ bn.js "^5.2.0"
+
+safe-array-concat@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz"
+ integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==
+ dependencies:
+ call-bind "^1.0.7"
+ get-intrinsic "^1.2.4"
+ has-symbols "^1.0.3"
+ isarray "^2.0.5"
+
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-regex-test@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz"
+ integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==
+ dependencies:
+ call-bind "^1.0.6"
+ es-errors "^1.3.0"
+ is-regex "^1.1.4"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+scrypt-js@3.0.1, scrypt-js@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz"
+ integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==
+
+secp256k1@3.7.1:
+ version "3.7.1"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.7.1.tgz#12e473e0e9a7c2f2d4d4818e722ad0e14cc1e2f1"
+ integrity sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==
+ dependencies:
+ bindings "^1.5.0"
+ bip66 "^1.1.5"
+ bn.js "^4.11.8"
+ create-hash "^1.2.0"
+ drbg.js "^1.0.1"
+ elliptic "^6.4.1"
+ nan "^2.14.0"
+ safe-buffer "^5.1.2"
+
+secp256k1@5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-5.0.1.tgz#dc2c86187d48ff2da756f0f7e96417ee03c414b1"
+ integrity sha512-lDFs9AAIaWP9UCdtWrotXWWF9t8PWgQDcxqgAnpM9rMqxb3Oaq2J0thzPVSxBwdJgyQtkU/sYtFtbM1RSt/iYA==
+ dependencies:
+ elliptic "^6.5.7"
+ node-addon-api "^5.0.0"
+ node-gyp-build "^4.2.0"
+
+secp256k1@^4.0.1:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.4.tgz#58f0bfe1830fe777d9ca1ffc7574962a8189f8ab"
+ integrity sha512-6JfvwvjUOn8F/jUoBY2Q1v5WY5XS+rj8qSe0v8Y4ezH4InLgTEeOOPQsRll9OV429Pvo6BCHGavIyJfr3TAhsw==
+ dependencies:
+ elliptic "^6.5.7"
+ node-addon-api "^5.0.0"
+ node-gyp-build "^4.2.0"
+
+secp256k1@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/secp256k1/-/secp256k1-5.0.0.tgz"
+ integrity sha512-TKWX8xvoGHrxVdqbYeZM9w+izTF4b9z3NhSaDkdn81btvuh+ivbIMGT/zQvDtTFWhRlThpoz6LEYTr7n8A5GcA==
+ dependencies:
+ elliptic "^6.5.4"
+ node-addon-api "^5.0.0"
+ node-gyp-build "^4.2.0"
+
+send@0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
+ integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+serialize-javascript@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz"
+ integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-static@1.16.2:
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
+ integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
+ dependencies:
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.19.0"
+
+set-function-length@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz"
+ integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
+
+setimmediate@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+ integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+side-channel-list@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
+ integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+
+side-channel-map@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+
+side-channel-weakmap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+ side-channel-map "^1.0.1"
+
+side-channel@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz"
+ integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.4"
+ object-inspect "^1.13.1"
+
+side-channel@^1.0.6:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
+ integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+ side-channel-list "^1.0.0"
+ side-channel-map "^1.0.1"
+ side-channel-weakmap "^1.0.2"
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ 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"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string.prototype.replaceall@^1.0.6:
+ version "1.0.10"
+ resolved "https://registry.npmjs.org/string.prototype.replaceall/-/string.prototype.replaceall-1.0.10.tgz"
+ integrity sha512-PKLapcZUZmXUdfIM6rTTTMYOxaj4JiQrgl0SKEeCFug1CdMAuJq8hVZd4eek9yMXAW4ldGUq+TiZRtjLJRU96g==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.4"
+ has-symbols "^1.0.3"
+ is-regex "^1.1.4"
+
+string.prototype.trim@^1.2.9:
+ version "1.2.9"
+ resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz"
+ integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.0"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimend@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz"
+ integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimstart@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string_decoder@^1.1.1, string_decoder@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-hex-prefix@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f"
+ integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==
+ dependencies:
+ is-hex-prefixed "1.0.0"
+
+strip-json-comments@^3.1.1:
+ 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==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ 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"
+
+supports-color@^8.1.1:
+ version "8.1.1"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+test@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/test/-/test-3.3.0.tgz"
+ integrity sha512-JKlEohxDIJRjwBH/+BrTcAPHljBALrAHw3Zs99RqZlaC605f6BggqXhxkdqZThbSHgaYPwpNJlf9bTSWkb/1rA==
+ dependencies:
+ minimist "^1.2.6"
+ readable-stream "^4.3.0"
+ string.prototype.replaceall "^1.0.6"
+
+tmp-promise@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz"
+ integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==
+ dependencies:
+ tmp "^0.2.0"
+
+tmp@^0.2.0:
+ version "0.2.3"
+ resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz"
+ integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ 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==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+tslib@^2.4.0, tslib@^2.6.2, tslib@^2.8.1:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
+tweetnacl-util@^0.15.1:
+ version "0.15.1"
+ resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b"
+ integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==
+
+tweetnacl@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz"
+ integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+typed-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz"
+ integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==
+ dependencies:
+ call-bind "^1.0.7"
+ es-errors "^1.3.0"
+ is-typed-array "^1.1.13"
+
+typed-array-byte-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz"
+ integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+
+typed-array-byte-offset@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz"
+ integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+
+typed-array-length@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz"
+ integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-proto "^1.0.3"
+ is-typed-array "^1.1.13"
+ possible-typed-array-names "^1.0.0"
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+undici-types@~6.20.0:
+ version "6.20.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433"
+ integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==
+
+undici@^5.19.1:
+ version "5.28.4"
+ resolved "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz"
+ integrity sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==
+ dependencies:
+ "@fastify/busboy" "^2.0.0"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+vary@^1, vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+vlq@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz"
+ integrity sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==
+
+wao@^0.6.3:
+ version "0.6.3"
+ resolved "https://registry.yarnpkg.com/wao/-/wao-0.6.3.tgz#486145463bfcbafae7818e44d7eb71f5ad422561"
+ integrity sha512-mTGlwwaEaPMhfpil0GbZyOdnIpNLkLKEigOhsSMI4ngWywczdvMWBrYP6vrtxnBWuajjXGkuR5n1zXL+MDpKqQ==
+ dependencies:
+ "@babel/plugin-transform-modules-commonjs" "^7.24.8"
+ "@permaweb/ao-loader" "^0.0.44"
+ "@permaweb/aoconnect" "^0.0.62"
+ arbundles "^0.11.1"
+ arweave "^1.15.1"
+ base64url "^3.0.1"
+ body-parser "^1.20.3"
+ cors "^2.8.5"
+ express "^4.21.2"
+ graphql "^16.10.0"
+ ramda "^0.30.1"
+ yargs "^17.7.2"
+
+warp-arbundles@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/warp-arbundles/-/warp-arbundles-1.0.4.tgz"
+ integrity sha512-KeRac/EJ7VOK+v5+PSMh2SrzpCKOAFnJICLlqZWt6qPkDCzVwcrNE5wFxOlEk5U170ewMDAB3e86UHUblevXpw==
+ dependencies:
+ arweave "^1.13.7"
+ base64url "^3.0.1"
+ buffer "^6.0.3"
+ warp-isomorphic "^1.0.7"
+
+warp-isomorphic@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/warp-isomorphic/-/warp-isomorphic-1.0.7.tgz"
+ integrity sha512-fXHbUXwdYqPm9fRPz8mjv5ndPco09aMQuTe4kXfymzOq8V6F3DLsg9cIafxvjms9/mc6eijzkLBJ63yjEENEjA==
+ dependencies:
+ buffer "^6.0.3"
+ undici "^5.19.1"
+
+weavedb-base@^0.45.2:
+ version "0.45.2"
+ resolved "https://registry.yarnpkg.com/weavedb-base/-/weavedb-base-0.45.2.tgz#1d08daf017960d86dade97032bae0783bdbaa0b3"
+ integrity sha512-ZiuO6Ny9JwHah/WQ/ryCNEh4bD6z0lcJXIDzaeLlJTwq0SWezuQf5n98NaAsVNsyEv2VWJy+zHowaec3P1nrxA==
+ dependencies:
+ "@metamask/eth-sig-util" "^4.0.1"
+ "@metamask/legacy-web3" "^2.0.0"
+ "@simplewebauthn/server" "^7.2.0"
+ bignumber.js "^9.1.2"
+ eth-crypto "^2.3.0"
+ ethereumjs-util "^7.1.5"
+ ethers "5.7.2"
+ md5 "^2.3.0"
+ pako "^2.1.0"
+ ramda "^0.28.0"
+
+weavedb-node-client@^0.45.2:
+ version "0.45.2"
+ resolved "https://registry.yarnpkg.com/weavedb-node-client/-/weavedb-node-client-0.45.2.tgz#f1caf43317db6ea737d6ca5f4099f3a9f28034e4"
+ integrity sha512-CyJZrkQr/UQMx/GXxcAX514kYyw7y+FU6/V21jMw0qa8si/tP5XDpK/4EsAW4LJ1hCxYzaoxtB/xNlDetfJ4LQ==
+ dependencies:
+ "@grpc/grpc-js" "^1.1.0"
+ "@grpc/proto-loader" "^0.5.0"
+ arweave "^1.12.2"
+ ramda "^0.28.0"
+ weavedb-base "^0.45.2"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ 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.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz"
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-typed-array@^1.1.14, which-typed-array@^1.1.15:
+ version "1.1.15"
+ resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz"
+ integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.2"
+
+workerpool@^6.5.1:
+ version "6.5.1"
+ resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz"
+ integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ 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"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+ws@7.4.6:
+ version "7.4.6"
+ resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz"
+ integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yargs-parser@^20.2.2, yargs-parser@^20.2.9:
+ version "20.2.9"
+ resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs-unparser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz"
+ integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==
+ dependencies:
+ camelcase "^6.0.0"
+ decamelize "^4.0.0"
+ flat "^5.0.2"
+ is-plain-obj "^2.1.0"
+
+yargs@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
+
+yargs@^17.7.2:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+zod@^3.23.5, zod@^3.23.8:
+ version "3.23.8"
+ resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz"
+ integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==
diff --git a/module/.gitignore b/module/.gitignore
new file mode 100644
index 0000000..704a0a2
--- /dev/null
+++ b/module/.gitignore
@@ -0,0 +1,7 @@
+# lock files
+package-lock.json
+yarn.lock
+
+# binaries
+process.js
+process.wasm
\ No newline at end of file
diff --git a/module/README.md b/module/README.md
new file mode 100644
index 0000000..f5f06d1
--- /dev/null
+++ b/module/README.md
@@ -0,0 +1,68 @@
+# WeaveDB Lite
+
+WeaveDB Lite is a lightweight AO wasm module, which can run in mainy environments.
+
+```bash
+yarn add weavedb-lite
+```
+## API
+
+The basic query types are the same as [the 1st gen WeaveDB](https://weavedb.vercel.app/docs/sdk/queries). Currently, there is no authentication mechanism implemented since it's expected to be used internally in AO processes or locally in NodeJs scripts.
+
+### AO Process
+
+Coming soon...
+
+### Browser
+
+Coming soon...
+
+### NodeJS
+
+Let's create `db.js`.
+
+```js
+import DB from "weavedb-lite"
+import assert from "assert"
+
+const main = async ()=>{
+ const db = await new DB().init()
+ const { id } = await db.add({ name: "Bob" }, "ppl")
+ await db.update({ age: 20 }, "ppl", id)
+ await db.set({ name: "Alice" }, "ppl", "Alice")
+ await db.upsert({ name: "Mike", age: 30 }, "ppl", "Mike")
+ await db.delete("ppl", "Alice")
+
+ assert.deepEqual(
+ await db.get("ppl"),
+ [{ name: "Bob", age: 20 },{ name: "Mike", age: 30 }]
+ )
+
+ await db.get("ppl", 1) // limit
+ await db.get("ppl", ["age", "desc"]) // sort by age in descending order
+ await db.get("ppl", ["age"], ["age", "==", 30]) // return ppl with age == 30
+ await db.get("ppl", ["age"], ["startAfter", 20]) // return ppl with age > 20
+
+ const doc = await db.cget("ppl", ["age"], 1) // get cursor
+ const doc2 = await db.cget("ppl", ["age"], ["startAfter", doc], 1) // paginate
+}
+
+main()
+```
+It's still experimental and `--experimental-wasm-memory64` flag is necessary to run node scripts.
+
+```bash
+node --experimental-wasm-memory64 db.js
+```
+#### Persistency
+
+By default, WeaveDB Lite runs in memory, but you can make it persistent by specifying a `cache` file to store data.
+
+```js
+const db = await new DB({ cache: ".cache" }).init()
+```
+You can reset the cache by setting `reset` true.
+
+```js
+const db = await new DB({ cache: ".cache", reset: true }).init()
+```
diff --git a/module/dump.js b/module/dump.js
new file mode 100644
index 0000000..a4fc218
--- /dev/null
+++ b/module/dump.js
@@ -0,0 +1,12 @@
+import { resolve } from "path"
+import { writeFileSync, readFileSync } from "fs"
+const wasm = resolve(import.meta.dirname, "lua/process.wasm")
+const client = resolve(import.meta.dirname, "lua/client.lua")
+const data = readFileSync(wasm)
+const data_c = readFileSync(client)
+const wasmjs = resolve(import.meta.dirname, "sdk/src/wasm.js")
+const clientjs = resolve(import.meta.dirname, "sdk/src/client.js")
+const exp = `export default "${data.toString("base64")}"`
+const exp_c = `export default "${data_c.toString("base64")}"`
+writeFileSync(wasmjs, exp)
+writeFileSync(clientjs, exp_c)
diff --git a/module/lua/ao.lua b/module/lua/ao.lua
new file mode 100644
index 0000000..cad2b3c
--- /dev/null
+++ b/module/lua/ao.lua
@@ -0,0 +1,406 @@
+--- The AO module provides functionality for managing the AO environment and handling messages. Returns the ao table.
+-- @module ao
+
+local oldao = ao or {}
+
+--- The AO module
+-- @table ao
+-- @field _version The version number of the ao module
+-- @field _module The module id of the process
+-- @field id The id of the process
+-- @field authorities A table of authorities of the process
+-- @field reference The reference number of the process
+-- @field outbox The outbox of the process
+-- @field nonExtractableTags The non-extractable tags
+-- @field nonForwardableTags The non-forwardable tags
+-- @field clone The clone function
+-- @field normalize The normalize function
+-- @field sanitize The sanitize function
+-- @field init The init function
+-- @field log The log function
+-- @field clearOutbox The clearOutbox function
+-- @field send The send function
+-- @field spawn The spawn function
+-- @field assign The assign function
+-- @field isTrusted The isTrusted function
+-- @field result The result function
+local ao = {
+ _version = "0.0.6",
+ id = oldao.id or "",
+ _module = oldao._module or "",
+ authorities = oldao.authorities or {},
+ reference = oldao.reference or 0,
+ outbox = oldao.outbox or
+ {Output = {}, Messages = {}, Spawns = {}, Assignments = {}},
+ nonExtractableTags = {
+ 'Data-Protocol', 'Variant', 'From-Process', 'From-Module', 'Type',
+ 'From', 'Owner', 'Anchor', 'Target', 'Data', 'Tags', 'Read-Only'
+ },
+ nonForwardableTags = {
+ 'Data-Protocol', 'Variant', 'From-Process', 'From-Module', 'Type',
+ 'From', 'Owner', 'Anchor', 'Target', 'Tags', 'TagArray', 'Hash-Chain',
+ 'Timestamp', 'Nonce', 'Epoch', 'Signature', 'Forwarded-By',
+ 'Pushed-For', 'Read-Only', 'Cron', 'Block-Height', 'Reference', 'Id',
+ 'Reply-To'
+ }
+}
+
+--- Checks if a key exists in a list.
+-- @lfunction _includes
+-- @tparam {table} list The list to check against
+-- @treturn {function} A function that takes a key and returns true if the key exists in the list
+local function _includes(list)
+ return function(key)
+ local exists = false
+ for _, listKey in ipairs(list) do
+ if key == listKey then
+ exists = true
+ break
+ end
+ end
+ if not exists then return false end
+ return true
+ end
+end
+
+--- Checks if a table is an array.
+-- @lfunction isArray
+-- @tparam {table} table The table to check
+-- @treturn {boolean} True if the table is an array, false otherwise
+local function isArray(table)
+ if type(table) == "table" then
+ local maxIndex = 0
+ for k, v in pairs(table) do
+ if type(k) ~= "number" or k < 1 or math.floor(k) ~= k then
+ return false -- If there's a non-integer key, it's not an array
+ end
+ maxIndex = math.max(maxIndex, k)
+ end
+ -- If the highest numeric index is equal to the number of elements, it's an array
+ return maxIndex == #table
+ end
+ return false
+end
+
+--- Pads a number with leading zeros to 32 digits.
+-- @lfunction padZero32
+-- @tparam {number} num The number to pad
+-- @treturn {string} The padded number as a string
+local function padZero32(num) return string.format("%032d", num) end
+
+--- Clones a table recursively.
+-- @function clone
+-- @tparam {any} obj The object to clone
+-- @tparam {table} seen The table of seen objects (default is nil)
+-- @treturn {any} The cloned object
+function ao.clone(obj, seen)
+ -- Handle non-tables and previously-seen tables.
+ if type(obj) ~= 'table' then return obj end
+ if seen and seen[obj] then return seen[obj] end
+
+ -- New table; mark it as seen and copy recursively.
+ local s = seen or {}
+ local res = {}
+ s[obj] = res
+ for k, v in pairs(obj) do res[ao.clone(k, s)] = ao.clone(v, s) end
+ return setmetatable(res, getmetatable(obj))
+end
+
+--- Normalizes a message by extracting tags.
+-- @function normalize
+-- @tparam {table} msg The message to normalize
+-- @treturn {table} The normalized message
+function ao.normalize(msg)
+ for _, o in ipairs(msg.Tags) do
+ if not _includes(ao.nonExtractableTags)(o.name) then
+ msg[o.name] = o.value
+ end
+ end
+ return msg
+end
+
+--- Sanitizes a message by removing non-forwardable tags.
+-- @function sanitize
+-- @tparam {table} msg The message to sanitize
+-- @treturn {table} The sanitized message
+function ao.sanitize(msg)
+ local newMsg = ao.clone(msg)
+
+ for k, _ in pairs(newMsg) do
+ if _includes(ao.nonForwardableTags)(k) then newMsg[k] = nil end
+ end
+
+ return newMsg
+end
+
+--- Initializes the AO environment, including ID, module, authorities, outbox, and environment.
+-- @function init
+-- @tparam {table} env The environment object
+function ao.init(env)
+ if ao.id == "" then ao.id = env.Process.Id end
+
+ if ao._module == "" then
+ for _, o in ipairs(env.Process.Tags) do
+ if o.name == "Module" then ao._module = o.value end
+ end
+ end
+
+ if #ao.authorities < 1 then
+ for _, o in ipairs(env.Process.Tags) do
+ if o.name == "Authority" then
+ table.insert(ao.authorities, o.value)
+ end
+ end
+ end
+
+ ao.outbox = {Output = {}, Messages = {}, Spawns = {}, Assignments = {}}
+ ao.env = env
+
+end
+
+--- Logs a message to the output.
+-- @function log
+-- @tparam {string} txt The message to log
+function ao.log(txt)
+ if type(ao.outbox.Output) == 'string' then
+ ao.outbox.Output = {ao.outbox.Output}
+ end
+ table.insert(ao.outbox.Output, txt)
+end
+
+--- Clears the outbox.
+-- @function clearOutbox
+function ao.clearOutbox()
+ ao.outbox = {Output = {}, Messages = {}, Spawns = {}, Assignments = {}}
+end
+
+--- Sends a message.
+-- @function send
+-- @tparam {table} msg The message to send
+function ao.send(msg)
+ assert(type(msg) == 'table', 'msg should be a table')
+ ao.reference = ao.reference + 1
+ local referenceString = tostring(ao.reference)
+
+ local message = {
+ Target = msg.Target,
+ Data = msg.Data,
+ Anchor = padZero32(ao.reference),
+ Tags = {
+ {name = "Data-Protocol", value = "ao"},
+ {name = "Variant", value = "ao.TN.1"},
+ {name = "Type", value = "Message"},
+ {name = "Reference", value = referenceString}
+ }
+ }
+
+ -- if custom tags in root move them to tags
+ for k, v in pairs(msg) do
+ if not _includes({"Target", "Data", "Anchor", "Tags", "From"})(k) then
+ table.insert(message.Tags, {name = k, value = v})
+ end
+ end
+
+ if msg.Tags then
+ if isArray(msg.Tags) then
+ for _, o in ipairs(msg.Tags) do
+ table.insert(message.Tags, o)
+ end
+ else
+ for k, v in pairs(msg.Tags) do
+ table.insert(message.Tags, {name = k, value = v})
+ end
+ end
+ end
+
+ -- If running in an environment without the AOS Handlers module, do not add
+ -- the onReply and receive functions to the message.
+ if not Handlers then return message end
+
+ -- clone message info and add to outbox
+ local extMessage = {}
+ for k, v in pairs(message) do extMessage[k] = v end
+
+ -- add message to outbox
+ table.insert(ao.outbox.Messages, extMessage)
+
+ -- add callback for onReply handler(s)
+ message.onReply =
+ function(...) -- Takes either (AddressThatWillReply, handler(s)) or (handler(s))
+ local from, resolver
+ if select("#", ...) == 2 then
+ from = select(1, ...)
+ resolver = select(2, ...)
+ else
+ from = message.Target
+ resolver = select(1, ...)
+ end
+
+ -- Add a one-time callback that runs the user's (matching) resolver on reply
+ Handlers.once({From = from, ["X-Reference"] = referenceString},
+ resolver)
+ end
+
+ message.receive = function(...)
+ local from = message.Target
+ if select("#", ...) == 1 then from = select(1, ...) end
+ return
+ Handlers.receive({From = from, ["X-Reference"] = referenceString})
+ end
+
+ return message
+end
+
+--- Spawns a process.
+-- @function spawn
+-- @tparam {string} module The module source id
+-- @tparam {table} msg The message to send
+function ao.spawn(module, msg)
+ assert(type(module) == "string", "Module source id is required!")
+ assert(type(msg) == 'table', 'Message must be a table')
+ -- inc spawn reference
+ ao.reference = ao.reference + 1
+ local spawnRef = tostring(ao.reference)
+
+ local spawn = {
+ Data = msg.Data or "NODATA",
+ Anchor = padZero32(ao.reference),
+ Tags = {
+ {name = "Data-Protocol", value = "ao"},
+ {name = "Variant", value = "ao.TN.1"},
+ {name = "Type", value = "Process"},
+ {name = "From-Process", value = ao.id},
+ {name = "From-Module", value = ao._module},
+ {name = "Module", value = module},
+ {name = "Reference", value = spawnRef}
+ }
+ }
+
+ -- if custom tags in root move them to tags
+ for k, v in pairs(msg) do
+ if not _includes({"Target", "Data", "Anchor", "Tags", "From"})(k) then
+ table.insert(spawn.Tags, {name = k, value = v})
+ end
+ end
+
+ if msg.Tags then
+ if isArray(msg.Tags) then
+ for _, o in ipairs(msg.Tags) do
+ table.insert(spawn.Tags, o)
+ end
+ else
+ for k, v in pairs(msg.Tags) do
+ table.insert(spawn.Tags, {name = k, value = v})
+ end
+ end
+ end
+
+ -- If running in an environment without the AOS Handlers module, do not add
+ -- the after and receive functions to the spawn.
+ if not Handlers then return spawn end
+
+ -- clone spawn info and add to outbox
+ local extSpawn = {}
+ for k, v in pairs(spawn) do extSpawn[k] = v end
+
+ table.insert(ao.outbox.Spawns, extSpawn)
+
+ -- add 'after' callback to returned table
+ -- local result = {}
+ spawn.onReply = function(callback)
+ Handlers.once({
+ Action = "Spawned",
+ From = ao.id,
+ ["Reference"] = spawnRef
+ }, callback)
+ end
+
+ spawn.receive = function()
+ return Handlers.receive({
+ Action = "Spawned",
+ From = ao.id,
+ ["Reference"] = spawnRef
+ })
+
+ end
+
+ return spawn
+end
+
+--- Assigns a message to a process.
+-- @function assign
+-- @tparam {table} assignment The assignment to assign
+function ao.assign(assignment)
+ assert(type(assignment) == 'table', 'assignment should be a table')
+ assert(type(assignment.Processes) == 'table', 'Processes should be a table')
+ assert(type(assignment.Message) == "string", "Message should be a string")
+ table.insert(ao.outbox.Assignments, assignment)
+end
+
+--- Checks if a message is trusted.
+-- The default security model of AOS processes: Trust all and *only* those on the ao.authorities list.
+-- @function isTrusted
+-- @tparam {table} msg The message to check
+-- @treturn {boolean} True if the message is trusted, false otherwise
+function ao.isTrusted(msg)
+ for _, authority in ipairs(ao.authorities) do
+ if msg.From == authority then return true end
+ if msg.Owner == authority then return true end
+ end
+ return false
+end
+
+--- Returns the result of the process.
+-- @function result
+-- @tparam {table} result The result of the process
+-- @treturn {table} The result of the process, including Output, Messages, Spawns, and Assignments
+function ao.result(result)
+ -- if error then only send the Error to CU
+ if ao.outbox.Error or result.Error then
+ return {Error = result.Error or ao.outbox.Error}
+ end
+ return {
+ Output = result.Output or ao.outbox.Output,
+ Messages = ao.outbox.Messages,
+ Spawns = ao.outbox.Spawns,
+ Assignments = ao.outbox.Assignments
+ }
+end
+
+
+--- Add the MatchSpec to the ao.assignables table. A optional name may be provided.
+-- This implies that ao.assignables may have both number and string indices.
+-- Added in the assignment module.
+-- @function addAssignable
+-- @tparam ?string|number|any nameOrMatchSpec The name of the MatchSpec
+-- to be added to ao.assignables. if a MatchSpec is provided, then
+-- no name is included
+-- @tparam ?any matchSpec The MatchSpec to be added to ao.assignables. Only provided
+-- if its name is passed as the first parameter
+-- @treturn ?string|number name The name of the MatchSpec, either as provided
+-- as an argument or as incremented
+-- @see assignment
+
+--- Remove the MatchSpec, either by name or by index
+-- If the name is not found, or if the index does not exist, then do nothing.
+-- Added in the assignment module.
+-- @function removeAssignable
+-- @tparam {string|number} name The name or index of the MatchSpec to be removed
+-- @see assignment
+
+--- Return whether the msg is an assignment or not. This can be determined by simply check whether the msg's Target is this process' id
+-- Added in the assignment module.
+-- @function isAssignment
+-- @param msg The msg to be checked
+-- @treturn boolean isAssignment
+-- @see assignment
+
+--- Check whether the msg matches any assignable MatchSpec.
+-- If not assignables are configured, the msg is deemed not assignable, by default.
+-- Added in the assignment module.
+-- @function isAssignable
+-- @param msg The msg to be checked
+-- @treturn boolean isAssignable
+-- @see assignment
+
+return ao
diff --git a/module/lua/assignment.lua b/module/lua/assignment.lua
new file mode 100644
index 0000000..eb7d3bb
--- /dev/null
+++ b/module/lua/assignment.lua
@@ -0,0 +1,91 @@
+--- The Assignment module provides functionality for handling assignments. Returns the Assignment table.
+-- @module assignment
+
+--- The Assignment module
+-- @table Assignment
+-- @field _version The version number of the assignment module
+-- @field init The init function
+local Assignment = { _version = "0.1.0" }
+local utils = require('.utils')
+
+--- Implement assignable polyfills on ao.
+-- Creates addAssignable, removeAssignable, isAssignment, and isAssignable fields on ao.
+-- @function init
+-- @tparam {table} ao The ao environment object
+-- @see ao.addAssignable
+-- @see ao.removeAssignable
+-- @see ao.isAssignment
+-- @see ao.isAssignable
+function Assignment.init (ao)
+ -- Find the index of an object in an array by a given property
+ -- @lfunction findIndexByProp
+ -- @tparam {table} array The array to search
+ -- @tparam {string} prop The property to search by
+ -- @tparam {any} value The value to search for
+ -- @treturn {number|nil} The index of the object, or nil if not found
+ local function findIndexByProp(array, prop, value)
+ for index, object in ipairs(array) do
+ if object[prop] == value then return index end
+ end
+
+ return nil
+ end
+
+ ao.assignables = ao.assignables or {}
+
+ ao.addAssignable = ao.addAssignable or function (...)
+ local name = nil
+ local matchSpec = nil
+
+ local idx = nil
+
+ -- Initialize the parameters based on arguments
+ if select("#", ...) == 1 then
+ matchSpec = select(1, ...)
+ else
+ name = select(1, ...)
+ matchSpec = select(2, ...)
+ assert(type(name) == 'string', 'MatchSpec name MUST be a string')
+ end
+
+ if name then idx = findIndexByProp(ao.assignables, "name", name) end
+
+ if idx ~= nil and idx > 0 then
+ -- found update
+ ao.assignables[idx].pattern = matchSpec
+ else
+ -- append the new assignable, including potentially nil name
+ table.insert(ao.assignables, { pattern = matchSpec, name = name })
+ end
+ end
+
+ ao.removeAssignable = ao.removeAssignable or function (name)
+ local idx = nil
+
+ if type(name) == 'string' then idx = findIndexByProp(ao.assignables, "name", name)
+ else
+ assert(type(name) == 'number', 'index MUST be a number')
+ idx = name
+ end
+
+ if idx == nil or idx <= 0 or idx > #ao.assignables then return end
+
+ table.remove(ao.assignables, idx)
+ end
+
+ ao.isAssignment = ao.isAssignment or function (msg) return msg.Target ~= ao.id end
+
+ ao.isAssignable = ao.isAssignable or function (msg)
+ for _, assignable in pairs(ao.assignables) do
+ if utils.matchesSpec(msg, assignable.pattern) then return true end
+ end
+
+ -- If assignables is empty, the the above loop will noop,
+ -- and this expression will execute.
+ --
+ -- In other words, all msgs are not assignable, by default.
+ return false
+ end
+end
+
+return Assignment
diff --git a/module/lua/base64.lua b/module/lua/base64.lua
new file mode 100644
index 0000000..6bf473f
--- /dev/null
+++ b/module/lua/base64.lua
@@ -0,0 +1,201 @@
+--[[
+
+ base64 -- v1.5.3 public domain Lua base64 encoder/decoder
+ no warranty implied; use at your own risk
+
+ Needs bit32.extract function. If not present it's implemented using BitOp
+ or Lua 5.3 native bit operators. For Lua 5.1 fallbacks to pure Lua
+ implementation inspired by Rici Lake's post:
+ http://ricilake.blogspot.co.uk/2007/10/iterating-bits-in-lua.html
+
+ author: Ilya Kolbin (iskolbin@gmail.com)
+ url: github.com/iskolbin/lbase64
+
+ COMPATIBILITY
+
+ Lua 5.1+, LuaJIT
+
+ LICENSE
+
+ See end of file for license information.
+
+--]]
+
+
+local base64 = {}
+
+local extract = _G.bit32 and _G.bit32.extract -- Lua 5.2/Lua 5.3 in compatibility mode
+if not extract then
+ if _G.bit then -- LuaJIT
+ local shl, shr, band = _G.bit.lshift, _G.bit.rshift, _G.bit.band
+ extract = function( v, from, width )
+ return band( shr( v, from ), shl( 1, width ) - 1 )
+ end
+ elseif _G._VERSION == "Lua 5.1" then
+ extract = function( v, from, width )
+ local w = 0
+ local flag = 2^from
+ for i = 0, width-1 do
+ local flag2 = flag + flag
+ if v % flag2 >= flag then
+ w = w + 2^i
+ end
+ flag = flag2
+ end
+ return w
+ end
+ else -- Lua 5.3+
+ extract = load[[return function( v, from, width )
+ return ( v >> from ) & ((1 << width) - 1)
+ end]]()
+ end
+end
+
+
+function base64.makeencoder( s62, s63, spad )
+ local encoder = {}
+ for b64code, char in pairs{[0]='A','B','C','D','E','F','G','H','I','J',
+ 'K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y',
+ 'Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n',
+ 'o','p','q','r','s','t','u','v','w','x','y','z','0','1','2',
+ '3','4','5','6','7','8','9',s62 or '+',s63 or'/',spad or'='} do
+ encoder[b64code] = char:byte()
+ end
+ return encoder
+end
+
+function base64.makedecoder( s62, s63, spad )
+ local decoder = {}
+ for b64code, charcode in pairs( base64.makeencoder( s62, s63, spad )) do
+ decoder[charcode] = b64code
+ end
+ return decoder
+end
+
+local DEFAULT_ENCODER = base64.makeencoder()
+local DEFAULT_DECODER = base64.makedecoder()
+
+local char, concat = string.char, table.concat
+
+function base64.encode( str, encoder, usecaching )
+ encoder = encoder or DEFAULT_ENCODER
+ local t, k, n = {}, 1, #str
+ local lastn = n % 3
+ local cache = {}
+ for i = 1, n-lastn, 3 do
+ local a, b, c = str:byte( i, i+2 )
+ local v = a*0x10000 + b*0x100 + c
+ local s
+ if usecaching then
+ s = cache[v]
+ if not s then
+ s = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[extract(v,6,6)], encoder[extract(v,0,6)])
+ cache[v] = s
+ end
+ else
+ s = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[extract(v,6,6)], encoder[extract(v,0,6)])
+ end
+ t[k] = s
+ k = k + 1
+ end
+ if lastn == 2 then
+ local a, b = str:byte( n-1, n )
+ local v = a*0x10000 + b*0x100
+ t[k] = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[extract(v,6,6)], encoder[64])
+ elseif lastn == 1 then
+ local v = str:byte( n )*0x10000
+ t[k] = char(encoder[extract(v,18,6)], encoder[extract(v,12,6)], encoder[64], encoder[64])
+ end
+ return concat( t )
+end
+
+function base64.decode( b64, decoder, usecaching )
+ decoder = decoder or DEFAULT_DECODER
+ local pattern = '[^%w%+%/%=]'
+ if decoder then
+ local s62, s63
+ for charcode, b64code in pairs( decoder ) do
+ if b64code == 62 then s62 = charcode
+ elseif b64code == 63 then s63 = charcode
+ end
+ end
+ pattern = ('[^%%w%%%s%%%s%%=]'):format( char(s62), char(s63) )
+ end
+ b64 = b64:gsub( pattern, '' )
+ local cache = usecaching and {}
+ local t, k = {}, 1
+ local n = #b64
+ local padding = b64:sub(-2) == '==' and 2 or b64:sub(-1) == '=' and 1 or 0
+ for i = 1, padding > 0 and n-4 or n, 4 do
+ local a, b, c, d = b64:byte( i, i+3 )
+ local s
+ if usecaching then
+ local v0 = a*0x1000000 + b*0x10000 + c*0x100 + d
+ s = cache[v0]
+ if not s then
+ local v = decoder[a]*0x40000 + decoder[b]*0x1000 + decoder[c]*0x40 + decoder[d]
+ s = char( extract(v,16,8), extract(v,8,8), extract(v,0,8))
+ cache[v0] = s
+ end
+ else
+ local v = decoder[a]*0x40000 + decoder[b]*0x1000 + decoder[c]*0x40 + decoder[d]
+ s = char( extract(v,16,8), extract(v,8,8), extract(v,0,8))
+ end
+ t[k] = s
+ k = k + 1
+ end
+ if padding == 1 then
+ local a, b, c = b64:byte( n-3, n-1 )
+ local v = decoder[a]*0x40000 + decoder[b]*0x1000 + decoder[c]*0x40
+ t[k] = char( extract(v,16,8), extract(v,8,8))
+ elseif padding == 2 then
+ local a, b = b64:byte( n-3, n-2 )
+ local v = decoder[a]*0x40000 + decoder[b]*0x1000
+ t[k] = char( extract(v,16,8))
+ end
+ return concat( t )
+end
+
+return base64
+
+--[[
+------------------------------------------------------------------------------
+This software is available under 2 licenses -- choose whichever you prefer.
+------------------------------------------------------------------------------
+ALTERNATIVE A - MIT License
+Copyright (c) 2018 Ilya Kolbin
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+------------------------------------------------------------------------------
+ALTERNATIVE B - Public Domain (www.unlicense.org)
+This is free and unencumbered software released into the public domain.
+Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
+software, either in source code form or as a compiled binary, for any purpose,
+commercial or non-commercial, and by any means.
+In jurisdictions that recognize copyright laws, the author or authors of this
+software dedicate any and all copyright interest in the software to the public
+domain. We make this dedication for the benefit of the public at large and to
+the detriment of our heirs and successors. We intend this dedication to be an
+overt act of relinquishment in perpetuity of all present and future rights to
+this software under copyright law.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+------------------------------------------------------------------------------
+--]]
\ No newline at end of file
diff --git a/module/lua/bint.lua b/module/lua/bint.lua
new file mode 100644
index 0000000..ce2164a
--- /dev/null
+++ b/module/lua/bint.lua
@@ -0,0 +1,1739 @@
+--[[--
+lua-bint - v0.5.1 - 26/Jun/2023
+Eduardo Bart - edub4rt@gmail.com
+https://github.com/edubart/lua-bint
+
+Small portable arbitrary-precision integer arithmetic library in pure Lua for
+computing with large integers.
+
+Different from most arbitrary-precision integer libraries in pure Lua out there this one
+uses an array of lua integers as underlying data-type in its implementation instead of
+using strings or large tables, this make it efficient for working with fixed width integers
+and to make bitwise operations.
+
+## Design goals
+
+The main design goal of this library is to be small, correct, self contained and use few
+resources while retaining acceptable performance and feature completeness.
+
+The library is designed to follow recent Lua integer semantics, this means that
+integer overflow warps around,
+signed integers are implemented using two-complement arithmetic rules,
+integer division operations rounds towards minus infinity,
+any mixed operations with float numbers promotes the value to a float,
+and the usual division/power operation always promotes to floats.
+
+The library is designed to be possible to work with only unsigned integer arithmetic
+when using the proper methods.
+
+All the lua arithmetic operators (+, -, *, //, /, %) and bitwise operators (&, |, ~, <<, >>)
+are implemented as metamethods.
+
+The integer size must be fixed in advance and the library is designed to be more efficient when
+working with integers of sizes between 64-4096 bits. If you need to work with really huge numbers
+without size restrictions then use another library. This choice has been made to have more efficiency
+in that specific size range.
+
+## Usage
+
+First on you should require the bint file including how many bits the bint module will work with,
+by calling the returned function from the require, for example:
+
+```lua
+local bint = require 'bint'(1024)
+```
+
+For more information about its arguments see @{newmodule}.
+Then when you need create a bint, you can use one of the following functions:
+
+* @{bint.fromuinteger} (convert from lua integers, but read as unsigned integer)
+* @{bint.frominteger} (convert from lua integers, preserving the sign)
+* @{bint.frombase} (convert from arbitrary bases, like hexadecimal)
+* @{bint.fromstring} (convert from arbitrary string, support binary/hexadecimal/decimal)
+* @{bint.trunc} (convert from lua numbers, truncating the fractional part)
+* @{bint.new} (convert from anything, asserts on invalid integers)
+* @{bint.tobint} (convert from anything, returns nil on invalid integers)
+* @{bint.parse} (convert from anything, returns a lua number as fallback)
+* @{bint.zero}
+* @{bint.one}
+* `bint`
+
+You can also call `bint` as it is an alias to `bint.new`.
+In doubt use @{bint.new} to create a new bint.
+
+Then you can use all the usual lua numeric operations on it,
+all the arithmetic metamethods are implemented.
+When you are done computing and need to get the result,
+get the output from one of the following functions:
+
+* @{bint.touinteger} (convert to a lua integer, wraps around as an unsigned integer)
+* @{bint.tointeger} (convert to a lua integer, wraps around, preserves the sign)
+* @{bint.tonumber} (convert to lua float, losing precision)
+* @{bint.tobase} (convert to a string in any base)
+* @{bint.__tostring} (convert to a string in base 10)
+
+To output a very large integer with no loss you probably want to use @{bint.tobase}
+or call `tostring` to get a string representation.
+
+## Precautions
+
+All library functions can be mixed with lua numbers,
+this makes easy to mix operations between bints and lua numbers,
+however the user should take care in some situations:
+
+* Don't mix integers and float operations if you want to work with integers only.
+* Don't use the regular equal operator ('==') to compare values from this library,
+unless you know in advance that both values are of the same primitive type,
+otherwise it will always return false, use @{bint.eq} to be safe.
+* Don't pass fractional numbers to functions that an integer is expected
+* Don't mix operations between bint classes with different sizes as this is not supported, this
+will throw assertions.
+* Remember that casting back to lua integers or numbers precision can be lost.
+* For dividing while preserving integers use the @{bint.__idiv} (the '//' operator).
+* For doing power operation preserving integers use the @{bint.ipow} function.
+* Configure the proper integer size you intend to work with, otherwise large integers may wrap around.
+
+]]
+
+-- Returns number of bits of the internal lua integer type.
+local function luainteger_bitsize()
+ local n, i = -1, 0
+ repeat
+ n, i = n >> 16, i + 16
+ until n==0
+ return i
+end
+
+local math_type = math.type
+local math_floor = math.floor
+local math_abs = math.abs
+local math_ceil = math.ceil
+local math_modf = math.modf
+local math_mininteger = math.mininteger
+local math_maxinteger = math.maxinteger
+local math_max = math.max
+local math_min = math.min
+local string_format = string.format
+local table_insert = table.insert
+local table_concat = table.concat
+local table_unpack = table.unpack
+
+local memo = {}
+
+--- Create a new bint module representing integers of the desired bit size.
+-- This is the returned function when `require 'bint'` is called.
+-- @function newmodule
+-- @param bits Number of bits for the integer representation, must be multiple of wordbits and
+-- at least 64.
+-- @param[opt] wordbits Number of the bits for the internal word,
+-- defaults to half of Lua's integer size.
+local function newmodule(bits, wordbits)
+
+local intbits = luainteger_bitsize()
+bits = bits or 256
+wordbits = wordbits or (intbits // 2)
+
+-- Memoize bint modules
+local memoindex = bits * 64 + wordbits
+if memo[memoindex] then
+ return memo[memoindex]
+end
+
+-- Validate
+assert(bits % wordbits == 0, 'bitsize is not multiple of word bitsize')
+assert(2*wordbits <= intbits, 'word bitsize must be half of the lua integer bitsize')
+assert(bits >= 64, 'bitsize must be >= 64')
+assert(wordbits >= 8, 'wordbits must be at least 8')
+assert(bits % 8 == 0, 'bitsize must be multiple of 8')
+
+-- Create bint module
+local bint = {}
+bint.__index = bint
+
+--- Number of bits representing a bint instance.
+bint.bits = bits
+
+-- Constants used internally
+local BINT_BITS = bits
+local BINT_BYTES = bits // 8
+local BINT_WORDBITS = wordbits
+local BINT_SIZE = BINT_BITS // BINT_WORDBITS
+local BINT_WORDMAX = (1 << BINT_WORDBITS) - 1
+local BINT_WORDMSB = (1 << (BINT_WORDBITS - 1))
+local BINT_LEPACKFMT = '<'..('I'..(wordbits // 8)):rep(BINT_SIZE)
+local BINT_MATHMININTEGER, BINT_MATHMAXINTEGER
+local BINT_MININTEGER
+
+--- Create a new bint with 0 value.
+function bint.zero()
+ local x = setmetatable({}, bint)
+ for i=1,BINT_SIZE do
+ x[i] = 0
+ end
+ return x
+end
+local bint_zero = bint.zero
+
+--- Create a new bint with 1 value.
+function bint.one()
+ local x = setmetatable({}, bint)
+ x[1] = 1
+ for i=2,BINT_SIZE do
+ x[i] = 0
+ end
+ return x
+end
+local bint_one = bint.one
+
+-- Convert a value to a lua integer without losing precision.
+local function tointeger(x)
+ x = tonumber(x)
+ local ty = math_type(x)
+ if ty == 'float' then
+ local floorx = math_floor(x)
+ if floorx == x then
+ x = floorx
+ ty = math_type(x)
+ end
+ end
+ if ty == 'integer' then
+ return x
+ end
+end
+
+--- Create a bint from an unsigned integer.
+-- Treats signed integers as an unsigned integer.
+-- @param x A value to initialize from convertible to a lua integer.
+-- @return A new bint or nil in case the input cannot be represented by an integer.
+-- @see bint.frominteger
+function bint.fromuinteger(x)
+ x = tointeger(x)
+ if x then
+ if x == 1 then
+ return bint_one()
+ elseif x == 0 then
+ return bint_zero()
+ end
+ local n = setmetatable({}, bint)
+ for i=1,BINT_SIZE do
+ n[i] = x & BINT_WORDMAX
+ x = x >> BINT_WORDBITS
+ end
+ return n
+ end
+end
+local bint_fromuinteger = bint.fromuinteger
+
+--- Create a bint from a signed integer.
+-- @param x A value to initialize from convertible to a lua integer.
+-- @return A new bint or nil in case the input cannot be represented by an integer.
+-- @see bint.fromuinteger
+function bint.frominteger(x)
+ x = tointeger(x)
+ if x then
+ if x == 1 then
+ return bint_one()
+ elseif x == 0 then
+ return bint_zero()
+ end
+ local neg = false
+ if x < 0 then
+ x = math_abs(x)
+ neg = true
+ end
+ local n = setmetatable({}, bint)
+ for i=1,BINT_SIZE do
+ n[i] = x & BINT_WORDMAX
+ x = x >> BINT_WORDBITS
+ end
+ if neg then
+ n:_unm()
+ end
+ return n
+ end
+end
+local bint_frominteger = bint.frominteger
+
+local basesteps = {}
+
+-- Compute the read step for frombase function
+local function getbasestep(base)
+ local step = basesteps[base]
+ if step then
+ return step
+ end
+ step = 0
+ local dmax = 1
+ local limit = math_maxinteger // base
+ repeat
+ step = step + 1
+ dmax = dmax * base
+ until dmax >= limit
+ basesteps[base] = step
+ return step
+end
+
+-- Compute power with lua integers.
+local function ipow(y, x, n)
+ if n == 1 then
+ return y * x
+ elseif n & 1 == 0 then --even
+ return ipow(y, x * x, n // 2)
+ end
+ return ipow(x * y, x * x, (n-1) // 2)
+end
+
+--- Create a bint from a string of the desired base.
+-- @param s The string to be converted from,
+-- must have only alphanumeric and '+-' characters.
+-- @param[opt] base Base that the number is represented, defaults to 10.
+-- Must be at least 2 and at most 36.
+-- @return A new bint or nil in case the conversion failed.
+function bint.frombase(s, base)
+ if type(s) ~= 'string' then
+ return
+ end
+ base = base or 10
+ if not (base >= 2 and base <= 36) then
+ -- number base is too large
+ return
+ end
+ local step = getbasestep(base)
+ if #s < step then
+ -- string is small, use tonumber (faster)
+ return bint_frominteger(tonumber(s, base))
+ end
+ local sign, int = s:lower():match('^([+-]?)(%w+)$')
+ if not (sign and int) then
+ -- invalid integer string representation
+ return
+ end
+ local n = bint_zero()
+ for i=1,#int,step do
+ local part = int:sub(i,i+step-1)
+ local d = tonumber(part, base)
+ if not d then
+ -- invalid integer string representation
+ return
+ end
+ if i > 1 then
+ n = n * ipow(1, base, #part)
+ end
+ if d ~= 0 then
+ n:_add(d)
+ end
+ end
+ if sign == '-' then
+ n:_unm()
+ end
+ return n
+end
+local bint_frombase = bint.frombase
+
+--- Create a new bint from a string.
+-- The string can by a decimal number, binary number prefixed with '0b' or hexadecimal number prefixed with '0x'.
+-- @param s A string convertible to a bint.
+-- @return A new bint or nil in case the conversion failed.
+-- @see bint.frombase
+function bint.fromstring(s)
+ if type(s) ~= 'string' then
+ return
+ end
+ if s:find('^[+-]?[0-9]+$') then
+ return bint_frombase(s, 10)
+ elseif s:find('^[+-]?0[xX][0-9a-fA-F]+$') then
+ return bint_frombase(s:gsub('0[xX]', '', 1), 16)
+ elseif s:find('^[+-]?0[bB][01]+$') then
+ return bint_frombase(s:gsub('0[bB]', '', 1), 2)
+ end
+end
+local bint_fromstring = bint.fromstring
+
+--- Create a new bint from a buffer of little-endian bytes.
+-- @param buffer Buffer of bytes, extra bytes are trimmed from the right, missing bytes are padded to the right.
+-- @raise An assert is thrown in case buffer is not an string.
+-- @return A bint.
+function bint.fromle(buffer)
+ assert(type(buffer) == 'string', 'buffer is not a string')
+ if #buffer > BINT_BYTES then -- trim extra bytes from the right
+ buffer = buffer:sub(1, BINT_BYTES)
+ elseif #buffer < BINT_BYTES then -- add missing bytes to the right
+ buffer = buffer..('\x00'):rep(BINT_BYTES - #buffer)
+ end
+ return setmetatable({BINT_LEPACKFMT:unpack(buffer)}, bint)
+end
+
+--- Create a new bint from a buffer of big-endian bytes.
+-- @param buffer Buffer of bytes, extra bytes are trimmed from the left, missing bytes are padded to the left.
+-- @raise An assert is thrown in case buffer is not an string.
+-- @return A bint.
+function bint.frombe(buffer)
+ assert(type(buffer) == 'string', 'buffer is not a string')
+ if #buffer > BINT_BYTES then -- trim extra bytes from the left
+ buffer = buffer:sub(-BINT_BYTES, #buffer)
+ elseif #buffer < BINT_BYTES then -- add missing bytes to the left
+ buffer = ('\x00'):rep(BINT_BYTES - #buffer)..buffer
+ end
+ return setmetatable({BINT_LEPACKFMT:unpack(buffer:reverse())}, bint)
+end
+
+--- Create a new bint from a value.
+-- @param x A value convertible to a bint (string, number or another bint).
+-- @return A new bint, guaranteed to be a new reference in case needed.
+-- @raise An assert is thrown in case x is not convertible to a bint.
+-- @see bint.tobint
+-- @see bint.parse
+function bint.new(x)
+ if getmetatable(x) ~= bint then
+ local ty = type(x)
+ if ty == 'number' then
+ x = bint_frominteger(x)
+ elseif ty == 'string' then
+ x = bint_fromstring(x)
+ end
+ assert(x, 'value cannot be represented by a bint')
+ return x
+ end
+ -- return a clone
+ local n = setmetatable({}, bint)
+ for i=1,BINT_SIZE do
+ n[i] = x[i]
+ end
+ return n
+end
+local bint_new = bint.new
+
+--- Convert a value to a bint if possible.
+-- @param x A value to be converted (string, number or another bint).
+-- @param[opt] clone A boolean that tells if a new bint reference should be returned.
+-- Defaults to false.
+-- @return A bint or nil in case the conversion failed.
+-- @see bint.new
+-- @see bint.parse
+function bint.tobint(x, clone)
+ if getmetatable(x) == bint then
+ if not clone then
+ return x
+ end
+ -- return a clone
+ local n = setmetatable({}, bint)
+ for i=1,BINT_SIZE do
+ n[i] = x[i]
+ end
+ return n
+ end
+ local ty = type(x)
+ if ty == 'number' then
+ return bint_frominteger(x)
+ elseif ty == 'string' then
+ return bint_fromstring(x)
+ end
+end
+local tobint = bint.tobint
+
+--- Convert a value to a bint if possible otherwise to a lua number.
+-- Useful to prepare values that you are unsure if it's going to be an integer or float.
+-- @param x A value to be converted (string, number or another bint).
+-- @param[opt] clone A boolean that tells if a new bint reference should be returned.
+-- Defaults to false.
+-- @return A bint or a lua number or nil in case the conversion failed.
+-- @see bint.new
+-- @see bint.tobint
+function bint.parse(x, clone)
+ local i = tobint(x, clone)
+ if i then
+ return i
+ end
+ return tonumber(x)
+end
+local bint_parse = bint.parse
+
+--- Convert a bint to an unsigned integer.
+-- Note that large unsigned integers may be represented as negatives in lua integers.
+-- Note that lua cannot represent values larger than 64 bits,
+-- in that case integer values wrap around.
+-- @param x A bint or a number to be converted into an unsigned integer.
+-- @return An integer or nil in case the input cannot be represented by an integer.
+-- @see bint.tointeger
+function bint.touinteger(x)
+ if getmetatable(x) == bint then
+ local n = 0
+ for i=1,BINT_SIZE do
+ n = n | (x[i] << (BINT_WORDBITS * (i - 1)))
+ end
+ return n
+ end
+ return tointeger(x)
+end
+
+--- Convert a bint to a signed integer.
+-- It works by taking absolute values then applying the sign bit in case needed.
+-- Note that lua cannot represent values larger than 64 bits,
+-- in that case integer values wrap around.
+-- @param x A bint or value to be converted into an unsigned integer.
+-- @return An integer or nil in case the input cannot be represented by an integer.
+-- @see bint.touinteger
+function bint.tointeger(x)
+ if getmetatable(x) == bint then
+ local n = 0
+ local neg = x:isneg()
+ if neg then
+ x = -x
+ end
+ for i=1,BINT_SIZE do
+ n = n | (x[i] << (BINT_WORDBITS * (i - 1)))
+ end
+ if neg then
+ n = -n
+ end
+ return n
+ end
+ return tointeger(x)
+end
+local bint_tointeger = bint.tointeger
+
+local function bint_assert_tointeger(x)
+ x = bint_tointeger(x)
+ if not x then
+ error('value has no integer representation')
+ end
+ return x
+end
+
+--- Convert a bint to a lua float in case integer would wrap around or lua integer otherwise.
+-- Different from @{bint.tointeger} the operation does not wrap around integers,
+-- but digits precision are lost in the process of converting to a float.
+-- @param x A bint or value to be converted into a lua number.
+-- @return A lua number or nil in case the input cannot be represented by a number.
+-- @see bint.tointeger
+function bint.tonumber(x)
+ if getmetatable(x) == bint then
+ if x <= BINT_MATHMAXINTEGER and x >= BINT_MATHMININTEGER then
+ return x:tointeger()
+ end
+ return tonumber(tostring(x))
+ end
+ return tonumber(x)
+end
+local bint_tonumber = bint.tonumber
+
+-- Compute base letters to use in bint.tobase
+local BASE_LETTERS = {}
+do
+ for i=1,36 do
+ BASE_LETTERS[i-1] = ('0123456789abcdefghijklmnopqrstuvwxyz'):sub(i,i)
+ end
+end
+
+--- Convert a bint to a string in the desired base.
+-- @param x The bint to be converted from.
+-- @param[opt] base Base to be represented, defaults to 10.
+-- Must be at least 2 and at most 36.
+-- @param[opt] unsigned Whether to output as an unsigned integer.
+-- Defaults to false for base 10 and true for others.
+-- When unsigned is false the symbol '-' is prepended in negative values.
+-- @return A string representing the input.
+-- @raise An assert is thrown in case the base is invalid.
+function bint.tobase(x, base, unsigned)
+ x = tobint(x)
+ if not x then
+ -- x is a fractional float or something else
+ return
+ end
+ base = base or 10
+ if not (base >= 2 and base <= 36) then
+ -- number base is too large
+ return
+ end
+ if unsigned == nil then
+ unsigned = base ~= 10
+ end
+ local isxneg = x:isneg()
+ if (base == 10 and not unsigned) or (base == 16 and unsigned and not isxneg) then
+ if x <= BINT_MATHMAXINTEGER and x >= BINT_MATHMININTEGER then
+ -- integer is small, use tostring or string.format (faster)
+ local n = x:tointeger()
+ if base == 10 then
+ return tostring(n)
+ elseif unsigned then
+ return string_format('%x', n)
+ end
+ end
+ end
+ local ss = {}
+ local neg = not unsigned and isxneg
+ x = neg and x:abs() or bint_new(x)
+ local xiszero = x:iszero()
+ if xiszero then
+ return '0'
+ end
+ -- calculate basepow
+ local step = 0
+ local basepow = 1
+ local limit = (BINT_WORDMSB - 1) // base
+ repeat
+ step = step + 1
+ basepow = basepow * base
+ until basepow >= limit
+ -- serialize base digits
+ local size = BINT_SIZE
+ local xd, carry, d
+ repeat
+ -- single word division
+ carry = 0
+ xiszero = true
+ for i=size,1,-1 do
+ carry = carry | x[i]
+ d, xd = carry // basepow, carry % basepow
+ if xiszero and d ~= 0 then
+ size = i
+ xiszero = false
+ end
+ x[i] = d
+ carry = xd << BINT_WORDBITS
+ end
+ -- digit division
+ for _=1,step do
+ xd, d = xd // base, xd % base
+ if xiszero and xd == 0 and d == 0 then
+ -- stop on leading zeros
+ break
+ end
+ table_insert(ss, 1, BASE_LETTERS[d])
+ end
+ until xiszero
+ if neg then
+ table_insert(ss, 1, '-')
+ end
+ return table_concat(ss)
+end
+
+local function bint_assert_convert(x)
+ return assert(tobint(x), 'value has not integer representation')
+end
+
+--- Convert a bint to a buffer of little-endian bytes.
+-- @param x A bint or lua integer.
+-- @param[opt] trim If true, zero bytes on the right are trimmed.
+-- @return A buffer of bytes representing the input.
+-- @raise Asserts in case input is not convertible to an integer.
+function bint.tole(x, trim)
+ x = bint_assert_convert(x)
+ local s = BINT_LEPACKFMT:pack(table_unpack(x))
+ if trim then
+ s = s:gsub('\x00+$', '')
+ if s == '' then
+ s = '\x00'
+ end
+ end
+ return s
+end
+
+--- Convert a bint to a buffer of big-endian bytes.
+-- @param x A bint or lua integer.
+-- @param[opt] trim If true, zero bytes on the left are trimmed.
+-- @return A buffer of bytes representing the input.
+-- @raise Asserts in case input is not convertible to an integer.
+function bint.tobe(x, trim)
+ x = bint_assert_convert(x)
+ local s = BINT_LEPACKFMT:pack(table_unpack(x)):reverse()
+ if trim then
+ s = s:gsub('^\x00+', '')
+ if s == '' then
+ s = '\x00'
+ end
+ end
+ return s
+end
+
+--- Check if a number is 0 considering bints.
+-- @param x A bint or a lua number.
+function bint.iszero(x)
+ if getmetatable(x) == bint then
+ for i=1,BINT_SIZE do
+ if x[i] ~= 0 then
+ return false
+ end
+ end
+ return true
+ end
+ return x == 0
+end
+
+--- Check if a number is 1 considering bints.
+-- @param x A bint or a lua number.
+function bint.isone(x)
+ if getmetatable(x) == bint then
+ if x[1] ~= 1 then
+ return false
+ end
+ for i=2,BINT_SIZE do
+ if x[i] ~= 0 then
+ return false
+ end
+ end
+ return true
+ end
+ return x == 1
+end
+
+--- Check if a number is -1 considering bints.
+-- @param x A bint or a lua number.
+function bint.isminusone(x)
+ if getmetatable(x) == bint then
+ for i=1,BINT_SIZE do
+ if x[i] ~= BINT_WORDMAX then
+ return false
+ end
+ end
+ return true
+ end
+ return x == -1
+end
+local bint_isminusone = bint.isminusone
+
+--- Check if the input is a bint.
+-- @param x Any lua value.
+function bint.isbint(x)
+ return getmetatable(x) == bint
+end
+
+--- Check if the input is a lua integer or a bint.
+-- @param x Any lua value.
+function bint.isintegral(x)
+ return getmetatable(x) == bint or math_type(x) == 'integer'
+end
+
+--- Check if the input is a bint or a lua number.
+-- @param x Any lua value.
+function bint.isnumeric(x)
+ return getmetatable(x) == bint or type(x) == 'number'
+end
+
+--- Get the number type of the input (bint, integer or float).
+-- @param x Any lua value.
+-- @return Returns "bint" for bints, "integer" for lua integers,
+-- "float" from lua floats or nil otherwise.
+function bint.type(x)
+ if getmetatable(x) == bint then
+ return 'bint'
+ end
+ return math_type(x)
+end
+
+--- Check if a number is negative considering bints.
+-- Zero is guaranteed to never be negative for bints.
+-- @param x A bint or a lua number.
+function bint.isneg(x)
+ if getmetatable(x) == bint then
+ return x[BINT_SIZE] & BINT_WORDMSB ~= 0
+ end
+ return x < 0
+end
+local bint_isneg = bint.isneg
+
+--- Check if a number is positive considering bints.
+-- @param x A bint or a lua number.
+function bint.ispos(x)
+ if getmetatable(x) == bint then
+ return not x:isneg() and not x:iszero()
+ end
+ return x > 0
+end
+
+--- Check if a number is even considering bints.
+-- @param x A bint or a lua number.
+function bint.iseven(x)
+ if getmetatable(x) == bint then
+ return x[1] & 1 == 0
+ end
+ return math_abs(x) % 2 == 0
+end
+
+--- Check if a number is odd considering bints.
+-- @param x A bint or a lua number.
+function bint.isodd(x)
+ if getmetatable(x) == bint then
+ return x[1] & 1 == 1
+ end
+ return math_abs(x) % 2 == 1
+end
+
+--- Create a new bint with the maximum possible integer value.
+function bint.maxinteger()
+ local x = setmetatable({}, bint)
+ for i=1,BINT_SIZE-1 do
+ x[i] = BINT_WORDMAX
+ end
+ x[BINT_SIZE] = BINT_WORDMAX ~ BINT_WORDMSB
+ return x
+end
+
+--- Create a new bint with the minimum possible integer value.
+function bint.mininteger()
+ local x = setmetatable({}, bint)
+ for i=1,BINT_SIZE-1 do
+ x[i] = 0
+ end
+ x[BINT_SIZE] = BINT_WORDMSB
+ return x
+end
+
+--- Bitwise left shift a bint in one bit (in-place).
+function bint:_shlone()
+ local wordbitsm1 = BINT_WORDBITS - 1
+ for i=BINT_SIZE,2,-1 do
+ self[i] = ((self[i] << 1) | (self[i-1] >> wordbitsm1)) & BINT_WORDMAX
+ end
+ self[1] = (self[1] << 1) & BINT_WORDMAX
+ return self
+end
+
+--- Bitwise right shift a bint in one bit (in-place).
+function bint:_shrone()
+ local wordbitsm1 = BINT_WORDBITS - 1
+ for i=1,BINT_SIZE-1 do
+ self[i] = ((self[i] >> 1) | (self[i+1] << wordbitsm1)) & BINT_WORDMAX
+ end
+ self[BINT_SIZE] = self[BINT_SIZE] >> 1
+ return self
+end
+
+-- Bitwise left shift words of a bint (in-place). Used only internally.
+function bint:_shlwords(n)
+ for i=BINT_SIZE,n+1,-1 do
+ self[i] = self[i - n]
+ end
+ for i=1,n do
+ self[i] = 0
+ end
+ return self
+end
+
+-- Bitwise right shift words of a bint (in-place). Used only internally.
+function bint:_shrwords(n)
+ if n < BINT_SIZE then
+ for i=1,BINT_SIZE-n do
+ self[i] = self[i + n]
+ end
+ for i=BINT_SIZE-n+1,BINT_SIZE do
+ self[i] = 0
+ end
+ else
+ for i=1,BINT_SIZE do
+ self[i] = 0
+ end
+ end
+ return self
+end
+
+--- Increment a bint by one (in-place).
+function bint:_inc()
+ for i=1,BINT_SIZE do
+ local tmp = self[i]
+ local v = (tmp + 1) & BINT_WORDMAX
+ self[i] = v
+ if v > tmp then
+ break
+ end
+ end
+ return self
+end
+
+--- Increment a number by one considering bints.
+-- @param x A bint or a lua number to increment.
+function bint.inc(x)
+ local ix = tobint(x, true)
+ if ix then
+ return ix:_inc()
+ end
+ return x + 1
+end
+
+--- Decrement a bint by one (in-place).
+function bint:_dec()
+ for i=1,BINT_SIZE do
+ local tmp = self[i]
+ local v = (tmp - 1) & BINT_WORDMAX
+ self[i] = v
+ if v <= tmp then
+ break
+ end
+ end
+ return self
+end
+
+--- Decrement a number by one considering bints.
+-- @param x A bint or a lua number to decrement.
+function bint.dec(x)
+ local ix = tobint(x, true)
+ if ix then
+ return ix:_dec()
+ end
+ return x - 1
+end
+
+--- Assign a bint to a new value (in-place).
+-- @param y A value to be copied from.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint:_assign(y)
+ y = bint_assert_convert(y)
+ for i=1,BINT_SIZE do
+ self[i] = y[i]
+ end
+ return self
+end
+
+--- Take absolute of a bint (in-place).
+function bint:_abs()
+ if self:isneg() then
+ self:_unm()
+ end
+ return self
+end
+
+--- Take absolute of a number considering bints.
+-- @param x A bint or a lua number to take the absolute.
+function bint.abs(x)
+ local ix = tobint(x, true)
+ if ix then
+ return ix:_abs()
+ end
+ return math_abs(x)
+end
+local bint_abs = bint.abs
+
+--- Take the floor of a number considering bints.
+-- @param x A bint or a lua number to perform the floor operation.
+function bint.floor(x)
+ if getmetatable(x) == bint then
+ return bint_new(x)
+ end
+ return bint_new(math_floor(tonumber(x)))
+end
+
+--- Take ceil of a number considering bints.
+-- @param x A bint or a lua number to perform the ceil operation.
+function bint.ceil(x)
+ if getmetatable(x) == bint then
+ return bint_new(x)
+ end
+ return bint_new(math_ceil(tonumber(x)))
+end
+
+--- Wrap around bits of an integer (discarding left bits) considering bints.
+-- @param x A bint or a lua integer.
+-- @param y Number of right bits to preserve.
+function bint.bwrap(x, y)
+ x = bint_assert_convert(x)
+ if y <= 0 then
+ return bint_zero()
+ elseif y < BINT_BITS then
+ return x & (bint_one() << y):_dec()
+ end
+ return bint_new(x)
+end
+
+--- Rotate left integer x by y bits considering bints.
+-- @param x A bint or a lua integer.
+-- @param y Number of bits to rotate.
+function bint.brol(x, y)
+ x, y = bint_assert_convert(x), bint_assert_tointeger(y)
+ if y > 0 then
+ return (x << y) | (x >> (BINT_BITS - y))
+ elseif y < 0 then
+ if y ~= math_mininteger then
+ return x:bror(-y)
+ else
+ x:bror(-(y+1))
+ x:bror(1)
+ end
+ end
+ return x
+end
+
+--- Rotate right integer x by y bits considering bints.
+-- @param x A bint or a lua integer.
+-- @param y Number of bits to rotate.
+function bint.bror(x, y)
+ x, y = bint_assert_convert(x), bint_assert_tointeger(y)
+ if y > 0 then
+ return (x >> y) | (x << (BINT_BITS - y))
+ elseif y < 0 then
+ if y ~= math_mininteger then
+ return x:brol(-y)
+ else
+ x:brol(-(y+1))
+ x:brol(1)
+ end
+ end
+ return x
+end
+
+--- Truncate a number to a bint.
+-- Floats numbers are truncated, that is, the fractional port is discarded.
+-- @param x A number to truncate.
+-- @return A new bint or nil in case the input does not fit in a bint or is not a number.
+function bint.trunc(x)
+ if getmetatable(x) ~= bint then
+ x = tonumber(x)
+ if x then
+ local ty = math_type(x)
+ if ty == 'float' then
+ -- truncate to integer
+ x = math_modf(x)
+ end
+ return bint_frominteger(x)
+ end
+ return
+ end
+ return bint_new(x)
+end
+
+--- Take maximum between two numbers considering bints.
+-- @param x A bint or lua number to compare.
+-- @param y A bint or lua number to compare.
+-- @return A bint or a lua number. Guarantees to return a new bint for integer values.
+function bint.max(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ return bint_new(ix > iy and ix or iy)
+ end
+ return bint_parse(math_max(x, y))
+end
+
+--- Take minimum between two numbers considering bints.
+-- @param x A bint or lua number to compare.
+-- @param y A bint or lua number to compare.
+-- @return A bint or a lua number. Guarantees to return a new bint for integer values.
+function bint.min(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ return bint_new(ix < iy and ix or iy)
+ end
+ return bint_parse(math_min(x, y))
+end
+
+--- Add an integer to a bint (in-place).
+-- @param y An integer to be added.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint:_add(y)
+ y = bint_assert_convert(y)
+ local carry = 0
+ for i=1,BINT_SIZE do
+ local tmp = self[i] + y[i] + carry
+ carry = tmp >> BINT_WORDBITS
+ self[i] = tmp & BINT_WORDMAX
+ end
+ return self
+end
+
+--- Add two numbers considering bints.
+-- @param x A bint or a lua number to be added.
+-- @param y A bint or a lua number to be added.
+function bint.__add(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ local z = setmetatable({}, bint)
+ local carry = 0
+ for i=1,BINT_SIZE do
+ local tmp = ix[i] + iy[i] + carry
+ carry = tmp >> BINT_WORDBITS
+ z[i] = tmp & BINT_WORDMAX
+ end
+ return z
+ end
+ return bint_tonumber(x) + bint_tonumber(y)
+end
+
+--- Subtract an integer from a bint (in-place).
+-- @param y An integer to subtract.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint:_sub(y)
+ y = bint_assert_convert(y)
+ local borrow = 0
+ local wordmaxp1 = BINT_WORDMAX + 1
+ for i=1,BINT_SIZE do
+ local res = self[i] + wordmaxp1 - y[i] - borrow
+ self[i] = res & BINT_WORDMAX
+ borrow = (res >> BINT_WORDBITS) ~ 1
+ end
+ return self
+end
+
+--- Subtract two numbers considering bints.
+-- @param x A bint or a lua number to be subtracted from.
+-- @param y A bint or a lua number to subtract.
+function bint.__sub(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ local z = setmetatable({}, bint)
+ local borrow = 0
+ local wordmaxp1 = BINT_WORDMAX + 1
+ for i=1,BINT_SIZE do
+ local res = ix[i] + wordmaxp1 - iy[i] - borrow
+ z[i] = res & BINT_WORDMAX
+ borrow = (res >> BINT_WORDBITS) ~ 1
+ end
+ return z
+ end
+ return bint_tonumber(x) - bint_tonumber(y)
+end
+
+--- Multiply two numbers considering bints.
+-- @param x A bint or a lua number to multiply.
+-- @param y A bint or a lua number to multiply.
+function bint.__mul(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ local z = bint_zero()
+ local sizep1 = BINT_SIZE+1
+ local s = sizep1
+ local e = 0
+ for i=1,BINT_SIZE do
+ if ix[i] ~= 0 or iy[i] ~= 0 then
+ e = math_max(e, i)
+ s = math_min(s, i)
+ end
+ end
+ for i=s,e do
+ for j=s,math_min(sizep1-i,e) do
+ local a = ix[i] * iy[j]
+ if a ~= 0 then
+ local carry = 0
+ for k=i+j-1,BINT_SIZE do
+ local tmp = z[k] + (a & BINT_WORDMAX) + carry
+ carry = tmp >> BINT_WORDBITS
+ z[k] = tmp & BINT_WORDMAX
+ a = a >> BINT_WORDBITS
+ end
+ end
+ end
+ end
+ return z
+ end
+ return bint_tonumber(x) * bint_tonumber(y)
+end
+
+--- Check if bints are equal.
+-- @param x A bint to compare.
+-- @param y A bint to compare.
+function bint.__eq(x, y)
+ for i=1,BINT_SIZE do
+ if x[i] ~= y[i] then
+ return false
+ end
+ end
+ return true
+end
+
+--- Check if numbers are equal considering bints.
+-- @param x A bint or lua number to compare.
+-- @param y A bint or lua number to compare.
+function bint.eq(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ return ix == iy
+ end
+ return x == y
+end
+local bint_eq = bint.eq
+
+local function findleftbit(x)
+ for i=BINT_SIZE,1,-1 do
+ local v = x[i]
+ if v ~= 0 then
+ local j = 0
+ repeat
+ v = v >> 1
+ j = j + 1
+ until v == 0
+ return (i-1)*BINT_WORDBITS + j - 1, i
+ end
+ end
+end
+
+-- Single word division modulus
+local function sudivmod(nume, deno)
+ local rema
+ local carry = 0
+ for i=BINT_SIZE,1,-1 do
+ carry = carry | nume[i]
+ nume[i] = carry // deno
+ rema = carry % deno
+ carry = rema << BINT_WORDBITS
+ end
+ return rema
+end
+
+--- Perform unsigned division and modulo operation between two integers considering bints.
+-- This is effectively the same of @{bint.udiv} and @{bint.umod}.
+-- @param x The numerator, must be a bint or a lua integer.
+-- @param y The denominator, must be a bint or a lua integer.
+-- @return The quotient following the remainder, both bints.
+-- @raise Asserts on attempt to divide by zero
+-- or if inputs are not convertible to integers.
+-- @see bint.udiv
+-- @see bint.umod
+function bint.udivmod(x, y)
+ local nume = bint_new(x)
+ local deno = bint_assert_convert(y)
+ -- compute if high bits of denominator are all zeros
+ local ishighzero = true
+ for i=2,BINT_SIZE do
+ if deno[i] ~= 0 then
+ ishighzero = false
+ break
+ end
+ end
+ if ishighzero then
+ -- try to divide by a single word (optimization)
+ local low = deno[1]
+ assert(low ~= 0, 'attempt to divide by zero')
+ if low == 1 then
+ -- denominator is one
+ return nume, bint_zero()
+ elseif low <= (BINT_WORDMSB - 1) then
+ -- can do single word division
+ local rema = sudivmod(nume, low)
+ return nume, bint_fromuinteger(rema)
+ end
+ end
+ if nume:ult(deno) then
+ -- denominator is greater than numerator
+ return bint_zero(), nume
+ end
+ -- align leftmost digits in numerator and denominator
+ local denolbit = findleftbit(deno)
+ local numelbit, numesize = findleftbit(nume)
+ local bit = numelbit - denolbit
+ deno = deno << bit
+ local wordmaxp1 = BINT_WORDMAX + 1
+ local wordbitsm1 = BINT_WORDBITS - 1
+ local denosize = numesize
+ local quot = bint_zero()
+ while bit >= 0 do
+ -- compute denominator <= numerator
+ local le = true
+ local size = math_max(numesize, denosize)
+ for i=size,1,-1 do
+ local a, b = deno[i], nume[i]
+ if a ~= b then
+ le = a < b
+ break
+ end
+ end
+ -- if the portion of the numerator above the denominator is greater or equal than to the denominator
+ if le then
+ -- subtract denominator from the portion of the numerator
+ local borrow = 0
+ for i=1,size do
+ local res = nume[i] + wordmaxp1 - deno[i] - borrow
+ nume[i] = res & BINT_WORDMAX
+ borrow = (res >> BINT_WORDBITS) ~ 1
+ end
+ -- concatenate 1 to the right bit of the quotient
+ local i = (bit // BINT_WORDBITS) + 1
+ quot[i] = quot[i] | (1 << (bit % BINT_WORDBITS))
+ end
+ -- shift right the denominator in one bit
+ for i=1,denosize-1 do
+ deno[i] = ((deno[i] >> 1) | (deno[i+1] << wordbitsm1)) & BINT_WORDMAX
+ end
+ local lastdenoword = deno[denosize] >> 1
+ deno[denosize] = lastdenoword
+ -- recalculate denominator size (optimization)
+ if lastdenoword == 0 then
+ while deno[denosize] == 0 do
+ denosize = denosize - 1
+ end
+ if denosize == 0 then
+ break
+ end
+ end
+ -- decrement current set bit for the quotient
+ bit = bit - 1
+ end
+ -- the remaining numerator is the remainder
+ return quot, nume
+end
+local bint_udivmod = bint.udivmod
+
+--- Perform unsigned division between two integers considering bints.
+-- @param x The numerator, must be a bint or a lua integer.
+-- @param y The denominator, must be a bint or a lua integer.
+-- @return The quotient, a bint.
+-- @raise Asserts on attempt to divide by zero
+-- or if inputs are not convertible to integers.
+function bint.udiv(x, y)
+ return (bint_udivmod(x, y))
+end
+
+--- Perform unsigned integer modulo operation between two integers considering bints.
+-- @param x The numerator, must be a bint or a lua integer.
+-- @param y The denominator, must be a bint or a lua integer.
+-- @return The remainder, a bint.
+-- @raise Asserts on attempt to divide by zero
+-- or if the inputs are not convertible to integers.
+function bint.umod(x, y)
+ local _, rema = bint_udivmod(x, y)
+ return rema
+end
+local bint_umod = bint.umod
+
+--- Perform integer truncate division and modulo operation between two numbers considering bints.
+-- This is effectively the same of @{bint.tdiv} and @{bint.tmod}.
+-- @param x The numerator, a bint or lua number.
+-- @param y The denominator, a bint or lua number.
+-- @return The quotient following the remainder, both bint or lua number.
+-- @raise Asserts on attempt to divide by zero or on division overflow.
+-- @see bint.tdiv
+-- @see bint.tmod
+function bint.tdivmod(x, y)
+ local ax, ay = bint_abs(x), bint_abs(y)
+ local ix, iy = tobint(ax), tobint(ay)
+ local quot, rema
+ if ix and iy then
+ assert(not (bint_eq(x, BINT_MININTEGER) and bint_isminusone(y)), 'division overflow')
+ quot, rema = bint_udivmod(ix, iy)
+ else
+ quot, rema = ax // ay, ax % ay
+ end
+ local isxneg, isyneg = bint_isneg(x), bint_isneg(y)
+ if isxneg ~= isyneg then
+ quot = -quot
+ end
+ if isxneg then
+ rema = -rema
+ end
+ return quot, rema
+end
+local bint_tdivmod = bint.tdivmod
+
+--- Perform truncate division between two numbers considering bints.
+-- Truncate division is a division that rounds the quotient towards zero.
+-- @param x The numerator, a bint or lua number.
+-- @param y The denominator, a bint or lua number.
+-- @return The quotient, a bint or lua number.
+-- @raise Asserts on attempt to divide by zero or on division overflow.
+function bint.tdiv(x, y)
+ return (bint_tdivmod(x, y))
+end
+
+--- Perform integer truncate modulo operation between two numbers considering bints.
+-- The operation is defined as the remainder of the truncate division
+-- (division that rounds the quotient towards zero).
+-- @param x The numerator, a bint or lua number.
+-- @param y The denominator, a bint or lua number.
+-- @return The remainder, a bint or lua number.
+-- @raise Asserts on attempt to divide by zero or on division overflow.
+function bint.tmod(x, y)
+ local _, rema = bint_tdivmod(x, y)
+ return rema
+end
+
+--- Perform integer floor division and modulo operation between two numbers considering bints.
+-- This is effectively the same of @{bint.__idiv} and @{bint.__mod}.
+-- @param x The numerator, a bint or lua number.
+-- @param y The denominator, a bint or lua number.
+-- @return The quotient following the remainder, both bint or lua number.
+-- @raise Asserts on attempt to divide by zero.
+-- @see bint.__idiv
+-- @see bint.__mod
+function bint.idivmod(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ local isnumeneg = ix[BINT_SIZE] & BINT_WORDMSB ~= 0
+ local isdenoneg = iy[BINT_SIZE] & BINT_WORDMSB ~= 0
+ if isnumeneg then
+ ix = -ix
+ end
+ if isdenoneg then
+ iy = -iy
+ end
+ local quot, rema = bint_udivmod(ix, iy)
+ if isnumeneg ~= isdenoneg then
+ quot:_unm()
+ -- round quotient towards minus infinity
+ if not rema:iszero() then
+ quot:_dec()
+ -- adjust the remainder
+ if isnumeneg and not isdenoneg then
+ rema:_unm():_add(y)
+ elseif isdenoneg and not isnumeneg then
+ rema:_add(y)
+ end
+ end
+ elseif isnumeneg then
+ -- adjust the remainder
+ rema:_unm()
+ end
+ return quot, rema
+ end
+ local nx, ny = bint_tonumber(x), bint_tonumber(y)
+ return nx // ny, nx % ny
+end
+local bint_idivmod = bint.idivmod
+
+--- Perform floor division between two numbers considering bints.
+-- Floor division is a division that rounds the quotient towards minus infinity,
+-- resulting in the floor of the division of its operands.
+-- @param x The numerator, a bint or lua number.
+-- @param y The denominator, a bint or lua number.
+-- @return The quotient, a bint or lua number.
+-- @raise Asserts on attempt to divide by zero.
+function bint.__idiv(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ local isnumeneg = ix[BINT_SIZE] & BINT_WORDMSB ~= 0
+ local isdenoneg = iy[BINT_SIZE] & BINT_WORDMSB ~= 0
+ if isnumeneg then
+ ix = -ix
+ end
+ if isdenoneg then
+ iy = -iy
+ end
+ local quot, rema = bint_udivmod(ix, iy)
+ if isnumeneg ~= isdenoneg then
+ quot:_unm()
+ -- round quotient towards minus infinity
+ if not rema:iszero() then
+ quot:_dec()
+ end
+ end
+ return quot, rema
+ end
+ return bint_tonumber(x) // bint_tonumber(y)
+end
+
+--- Perform division between two numbers considering bints.
+-- This always casts inputs to floats, for integer division only use @{bint.__idiv}.
+-- @param x The numerator, a bint or lua number.
+-- @param y The denominator, a bint or lua number.
+-- @return The quotient, a lua number.
+function bint.__div(x, y)
+ return bint_tonumber(x) / bint_tonumber(y)
+end
+
+--- Perform integer floor modulo operation between two numbers considering bints.
+-- The operation is defined as the remainder of the floor division
+-- (division that rounds the quotient towards minus infinity).
+-- @param x The numerator, a bint or lua number.
+-- @param y The denominator, a bint or lua number.
+-- @return The remainder, a bint or lua number.
+-- @raise Asserts on attempt to divide by zero.
+function bint.__mod(x, y)
+ local _, rema = bint_idivmod(x, y)
+ return rema
+end
+
+--- Perform integer power between two integers considering bints.
+-- If y is negative then pow is performed as an unsigned integer.
+-- @param x The base, an integer.
+-- @param y The exponent, an integer.
+-- @return The result of the pow operation, a bint.
+-- @raise Asserts in case inputs are not convertible to integers.
+-- @see bint.__pow
+-- @see bint.upowmod
+function bint.ipow(x, y)
+ y = bint_assert_convert(y)
+ if y:iszero() then
+ return bint_one()
+ elseif y:isone() then
+ return bint_new(x)
+ end
+ -- compute exponentiation by squaring
+ x, y = bint_new(x), bint_new(y)
+ local z = bint_one()
+ repeat
+ if y:iseven() then
+ x = x * x
+ y:_shrone()
+ else
+ z = x * z
+ x = x * x
+ y:_dec():_shrone()
+ end
+ until y:isone()
+ return x * z
+end
+
+--- Perform integer power between two unsigned integers over a modulus considering bints.
+-- @param x The base, an integer.
+-- @param y The exponent, an integer.
+-- @param m The modulus, an integer.
+-- @return The result of the pow operation, a bint.
+-- @raise Asserts in case inputs are not convertible to integers.
+-- @see bint.__pow
+-- @see bint.ipow
+function bint.upowmod(x, y, m)
+ m = bint_assert_convert(m)
+ if m:isone() then
+ return bint_zero()
+ end
+ x, y = bint_new(x), bint_new(y)
+ local z = bint_one()
+ x = bint_umod(x, m)
+ while not y:iszero() do
+ if y:isodd() then
+ z = bint_umod(z*x, m)
+ end
+ y:_shrone()
+ x = bint_umod(x*x, m)
+ end
+ return z
+end
+
+--- Perform numeric power between two numbers considering bints.
+-- This always casts inputs to floats, for integer power only use @{bint.ipow}.
+-- @param x The base, a bint or lua number.
+-- @param y The exponent, a bint or lua number.
+-- @return The result of the pow operation, a lua number.
+-- @see bint.ipow
+function bint.__pow(x, y)
+ return bint_tonumber(x) ^ bint_tonumber(y)
+end
+
+--- Bitwise left shift integers considering bints.
+-- @param x An integer to perform the bitwise shift.
+-- @param y An integer with the number of bits to shift.
+-- @return The result of shift operation, a bint.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint.__shl(x, y)
+ x, y = bint_new(x), bint_assert_tointeger(y)
+ if y == math_mininteger or math_abs(y) >= BINT_BITS then
+ return bint_zero()
+ end
+ if y < 0 then
+ return x >> -y
+ end
+ local nvals = y // BINT_WORDBITS
+ if nvals ~= 0 then
+ x:_shlwords(nvals)
+ y = y - nvals * BINT_WORDBITS
+ end
+ if y ~= 0 then
+ local wordbitsmy = BINT_WORDBITS - y
+ for i=BINT_SIZE,2,-1 do
+ x[i] = ((x[i] << y) | (x[i-1] >> wordbitsmy)) & BINT_WORDMAX
+ end
+ x[1] = (x[1] << y) & BINT_WORDMAX
+ end
+ return x
+end
+
+--- Bitwise right shift integers considering bints.
+-- @param x An integer to perform the bitwise shift.
+-- @param y An integer with the number of bits to shift.
+-- @return The result of shift operation, a bint.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint.__shr(x, y)
+ x, y = bint_new(x), bint_assert_tointeger(y)
+ if y == math_mininteger or math_abs(y) >= BINT_BITS then
+ return bint_zero()
+ end
+ if y < 0 then
+ return x << -y
+ end
+ local nvals = y // BINT_WORDBITS
+ if nvals ~= 0 then
+ x:_shrwords(nvals)
+ y = y - nvals * BINT_WORDBITS
+ end
+ if y ~= 0 then
+ local wordbitsmy = BINT_WORDBITS - y
+ for i=1,BINT_SIZE-1 do
+ x[i] = ((x[i] >> y) | (x[i+1] << wordbitsmy)) & BINT_WORDMAX
+ end
+ x[BINT_SIZE] = x[BINT_SIZE] >> y
+ end
+ return x
+end
+
+--- Bitwise AND bints (in-place).
+-- @param y An integer to perform bitwise AND.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint:_band(y)
+ y = bint_assert_convert(y)
+ for i=1,BINT_SIZE do
+ self[i] = self[i] & y[i]
+ end
+ return self
+end
+
+--- Bitwise AND two integers considering bints.
+-- @param x An integer to perform bitwise AND.
+-- @param y An integer to perform bitwise AND.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint.__band(x, y)
+ return bint_new(x):_band(y)
+end
+
+--- Bitwise OR bints (in-place).
+-- @param y An integer to perform bitwise OR.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint:_bor(y)
+ y = bint_assert_convert(y)
+ for i=1,BINT_SIZE do
+ self[i] = self[i] | y[i]
+ end
+ return self
+end
+
+--- Bitwise OR two integers considering bints.
+-- @param x An integer to perform bitwise OR.
+-- @param y An integer to perform bitwise OR.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint.__bor(x, y)
+ return bint_new(x):_bor(y)
+end
+
+--- Bitwise XOR bints (in-place).
+-- @param y An integer to perform bitwise XOR.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint:_bxor(y)
+ y = bint_assert_convert(y)
+ for i=1,BINT_SIZE do
+ self[i] = self[i] ~ y[i]
+ end
+ return self
+end
+
+--- Bitwise XOR two integers considering bints.
+-- @param x An integer to perform bitwise XOR.
+-- @param y An integer to perform bitwise XOR.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint.__bxor(x, y)
+ return bint_new(x):_bxor(y)
+end
+
+--- Bitwise NOT a bint (in-place).
+function bint:_bnot()
+ for i=1,BINT_SIZE do
+ self[i] = (~self[i]) & BINT_WORDMAX
+ end
+ return self
+end
+
+--- Bitwise NOT a bint.
+-- @param x An integer to perform bitwise NOT.
+-- @raise Asserts in case inputs are not convertible to integers.
+function bint.__bnot(x)
+ local y = setmetatable({}, bint)
+ for i=1,BINT_SIZE do
+ y[i] = (~x[i]) & BINT_WORDMAX
+ end
+ return y
+end
+
+--- Negate a bint (in-place). This effectively applies two's complements.
+function bint:_unm()
+ return self:_bnot():_inc()
+end
+
+--- Negate a bint. This effectively applies two's complements.
+-- @param x A bint to perform negation.
+function bint.__unm(x)
+ return (~x):_inc()
+end
+
+--- Compare if integer x is less than y considering bints (unsigned version).
+-- @param x Left integer to compare.
+-- @param y Right integer to compare.
+-- @raise Asserts in case inputs are not convertible to integers.
+-- @see bint.__lt
+function bint.ult(x, y)
+ x, y = bint_assert_convert(x), bint_assert_convert(y)
+ for i=BINT_SIZE,1,-1 do
+ local a, b = x[i], y[i]
+ if a ~= b then
+ return a < b
+ end
+ end
+ return false
+end
+
+--- Compare if bint x is less or equal than y considering bints (unsigned version).
+-- @param x Left integer to compare.
+-- @param y Right integer to compare.
+-- @raise Asserts in case inputs are not convertible to integers.
+-- @see bint.__le
+function bint.ule(x, y)
+ x, y = bint_assert_convert(x), bint_assert_convert(y)
+ for i=BINT_SIZE,1,-1 do
+ local a, b = x[i], y[i]
+ if a ~= b then
+ return a < b
+ end
+ end
+ return true
+end
+
+--- Compare if number x is less than y considering bints and signs.
+-- @param x Left value to compare, a bint or lua number.
+-- @param y Right value to compare, a bint or lua number.
+-- @see bint.ult
+function bint.__lt(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ local xneg = ix[BINT_SIZE] & BINT_WORDMSB ~= 0
+ local yneg = iy[BINT_SIZE] & BINT_WORDMSB ~= 0
+ if xneg == yneg then
+ for i=BINT_SIZE,1,-1 do
+ local a, b = ix[i], iy[i]
+ if a ~= b then
+ return a < b
+ end
+ end
+ return false
+ end
+ return xneg and not yneg
+ end
+ return bint_tonumber(x) < bint_tonumber(y)
+end
+
+--- Compare if number x is less or equal than y considering bints and signs.
+-- @param x Left value to compare, a bint or lua number.
+-- @param y Right value to compare, a bint or lua number.
+-- @see bint.ule
+function bint.__le(x, y)
+ local ix, iy = tobint(x), tobint(y)
+ if ix and iy then
+ local xneg = ix[BINT_SIZE] & BINT_WORDMSB ~= 0
+ local yneg = iy[BINT_SIZE] & BINT_WORDMSB ~= 0
+ if xneg == yneg then
+ for i=BINT_SIZE,1,-1 do
+ local a, b = ix[i], iy[i]
+ if a ~= b then
+ return a < b
+ end
+ end
+ return true
+ end
+ return xneg and not yneg
+ end
+ return bint_tonumber(x) <= bint_tonumber(y)
+end
+
+--- Convert a bint to a string on base 10.
+-- @see bint.tobase
+function bint:__tostring()
+ return self:tobase(10)
+end
+
+-- Allow creating bints by calling bint itself
+setmetatable(bint, {
+ __call = function(_, x)
+ return bint_new(x)
+ end
+})
+
+BINT_MATHMININTEGER, BINT_MATHMAXINTEGER = bint_new(math.mininteger), bint_new(math.maxinteger)
+BINT_MININTEGER = bint.mininteger()
+memo[memoindex] = bint
+
+return bint
+
+end
+
+return newmodule
\ No newline at end of file
diff --git a/module/lua/boot.lua b/module/lua/boot.lua
new file mode 100644
index 0000000..502b0dc
--- /dev/null
+++ b/module/lua/boot.lua
@@ -0,0 +1,47 @@
+--- The Boot module provides functionality for booting the process. Returns the boot function.
+-- @module boot
+
+-- This is for aop6 Boot Loader
+-- See: https://github.com/permaweb/aos/issues/342
+-- For the Process as the first Message, if On-Boot
+-- has the value 'data' then evaluate the data
+-- if it is a tx id, then download and evaluate the tx
+
+local drive = { _version = "0.0.1" }
+
+function drive.getData(txId)
+ local file = io.open('/data/' .. txId)
+ if not file then
+ return nil, "File not found!"
+ end
+ local contents = file:read(
+ file:seek('end')
+ )
+ file:close()
+ return contents
+end
+
+--- The boot function.
+-- If the message has no On-Boot tag, do nothing.
+-- If the message has an On-Boot tag with the value 'Data', then evaluate the message.
+-- If the message has an On-Boot tag with a tx id, then download and evaluate the tx data.
+-- @function boot
+-- @param ao The ao environment object
+-- @see eval
+return function (ao)
+ local eval = require(".eval")(ao)
+ return function (msg)
+ if #Inbox == 0 then
+ table.insert(Inbox, msg)
+ end
+ if msg.Tags['On-Boot'] == nil then
+ return
+ end
+ if msg.Tags['On-Boot'] == 'Data' then
+ eval(msg)
+ else
+ local loadedVal = drive.getData(msg.Tags['On-Boot'])
+ eval({ Data = loadedVal })
+ end
+ end
+end
\ No newline at end of file
diff --git a/module/lua/chance.lua b/module/lua/chance.lua
new file mode 100644
index 0000000..7c84f8d
--- /dev/null
+++ b/module/lua/chance.lua
@@ -0,0 +1,105 @@
+--- The Chance module provides utilities for generating random numbers and values. Returns the chance table.
+-- @module chance
+
+local N = 624
+local M = 397
+local MATRIX_A = 0x9908b0df
+local UPPER_MASK = 0x80000000
+local LOWER_MASK = 0x7fffffff
+
+--- Initializes mt[N] with a seed
+-- @lfunction init_genrand
+-- @tparam {table} o The table to initialize
+-- @tparam {number} s The seed
+local function init_genrand(o, s)
+ o.mt[0] = s & 0xffffffff
+ for i = 1, N - 1 do
+ o.mt[i] = (1812433253 * (o.mt[i - 1] ~ (o.mt[i - 1] >> 30))) + i
+ -- See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier.
+ -- In the previous versions, MSBs of the seed affect
+ -- only MSBs of the array mt[].
+ -- 2002/01/09 modified by Makoto Matsumoto
+ o.mt[i] = o.mt[i] & 0xffffffff
+ -- for >32 bit machines
+ end
+ o.mti = N
+end
+
+--- Generates a random number on [0,0xffffffff]-interval
+-- @lfunction genrand_int32
+-- @tparam {table} o The table to generate the random number from
+-- @treturn {number} The random number
+local function genrand_int32(o)
+ local y
+ local mag01 = {} -- mag01[x] = x * MATRIX_A for x=0,1
+ mag01[0] = 0x0
+ mag01[1] = MATRIX_A
+ if o.mti >= N then -- generate N words at one time
+ if o.mti == N + 1 then -- if init_genrand() has not been called,
+ init_genrand(o, 5489) -- a default initial seed is used
+ end
+ for kk = 0, N - M - 1 do
+ y = (o.mt[kk] & UPPER_MASK) | (o.mt[kk + 1] & LOWER_MASK)
+ o.mt[kk] = o.mt[kk + M] ~ (y >> 1) ~ mag01[y & 0x1]
+ end
+ for kk = N - M, N - 2 do
+ y = (o.mt[kk] & UPPER_MASK) | (o.mt[kk + 1] & LOWER_MASK)
+ o.mt[kk] = o.mt[kk + (M - N)] ~ (y >> 1) ~ mag01[y & 0x1]
+ end
+ y = (o.mt[N - 1] & UPPER_MASK) | (o.mt[0] & LOWER_MASK)
+ o.mt[N - 1] = o.mt[M - 1] ~ (y >> 1) ~ mag01[y & 0x1]
+
+ o.mti = 0
+ end
+
+ y = o.mt[o.mti]
+ o.mti = o.mti + 1
+
+ -- Tempering
+ y = y ~ (y >> 11)
+ y = y ~ ((y << 7) & 0x9d2c5680)
+ y = y ~ ((y << 15) & 0xefc60000)
+ y = y ~ (y >> 18)
+
+ return y
+end
+
+local MersenneTwister = {}
+MersenneTwister.mt = {}
+MersenneTwister.mti = N + 1
+
+
+--- The Random table
+-- @table Random
+-- @field seed The seed function
+-- @field random The random function
+-- @field integer The integer function
+local Random = {}
+
+--- Sets a new random table given a seed.
+-- @function seed
+-- @tparam {number} seed The seed
+function Random.seed(seed)
+ init_genrand(MersenneTwister, seed)
+end
+
+--- Generates a random number on [0,1)-real-interval.
+-- @function random
+-- @treturn {number} The random number
+function Random.random()
+ return genrand_int32(MersenneTwister) * (1.0 / 4294967296.0)
+end
+
+--- Returns a random integer. The min and max are INCLUDED in the range.
+-- The max integer in lua is math.maxinteger
+-- The min is math.mininteger
+-- @function Random.integer
+-- @tparam {number} min The minimum value
+-- @tparam {number} max The maximum value
+-- @treturn {number} The random integer
+function Random.integer(min, max)
+ assert(max >= min, "max must bigger than min")
+ return math.floor(Random.random() * (max - min + 1) + min)
+end
+
+return Random
\ No newline at end of file
diff --git a/module/lua/client.lua b/module/lua/client.lua
new file mode 100644
index 0000000..4838c8f
--- /dev/null
+++ b/module/lua/client.lua
@@ -0,0 +1,15 @@
+local wdb = require("weavedb")
+local json = require("json")
+
+local function parse(msg)
+ assert(type(msg.Tags.Query) == 'string', 'Query is required!')
+ return json.decode(msg.Tags.Query)
+end
+
+Handlers.add("Get", "Get", function(msg) msg.reply({ Data = wdb.get(parse(msg)) }) end)
+Handlers.add("Cget", "Cget", function(msg) msg.reply({ Data = wdb.cget(parse(msg)) }) end)
+Handlers.add("Add", "Add", function(msg) msg.reply({ Data = { id = wdb.add(parse(msg)) } }) end)
+Handlers.add("Set", "Set", function(msg) msg.reply({ Data = { id = wdb.set(parse(msg)) } }) end)
+Handlers.add("Update", "Update", function(msg) msg.reply({ Data = { id = wdb.update(parse(msg)) } }) end)
+Handlers.add("Upsert", "Upsert", function(msg) msg.reply({ Data = { id = wdb.upsert(parse(msg)) } }) end)
+Handlers.add("Delete", "Delete", function(msg) msg.reply({ Data = { id = wdb.delete(parse(msg)) } }) end)
diff --git a/module/lua/crypto/cipher/aes.lua b/module/lua/crypto/cipher/aes.lua
new file mode 100644
index 0000000..5ed1f5d
--- /dev/null
+++ b/module/lua/crypto/cipher/aes.lua
@@ -0,0 +1,142 @@
+local Stream = require(".crypto.util.stream")
+local Hex = require(".crypto.util.hex")
+local Array = require(".crypto.util.array")
+
+-- Ciphers
+local AES128Cipher = require(".crypto.cipher.aes128")
+local AES192Cipher = require(".crypto.cipher.aes192")
+local AES256Cipher = require(".crypto.cipher.aes256")
+
+-- Modes
+local CBCMode = require(".crypto.cipher.mode.cbc")
+local ECBMode = require(".crypto.cipher.mode.ecb")
+local CFBMode = require(".crypto.cipher.mode.cfb")
+local OFBMode = require(".crypto.cipher.mode.ofb")
+local CTRMode = require(".crypto.cipher.mode.ctr")
+
+-- Padding
+local ZeroPadding = require(".crypto.padding.zero")
+
+local public = {}
+
+local getBlockCipher = function(keyLength)
+ if keyLength == 128 then
+ return AES128Cipher
+ elseif keyLength == 192 then
+ return AES192Cipher
+ elseif keyLength == 256 then
+ return AES256Cipher
+ elseif keyLength == nil then
+ return AES128Cipher
+ else
+ return nil
+ end
+end
+
+local getMode = function(mode)
+ if mode == "CBC" then
+ return CBCMode
+ elseif mode == "ECB" then
+ return ECBMode
+ elseif mode == "CFB" then
+ return CFBMode
+ elseif mode == "OFB" then
+ return OFBMode
+ elseif mode == "CTR" then
+ return CTRMode
+ else
+ return nil
+ end
+end
+
+
+--- Encrypts the given data using AES encryption.
+--- @param data string - The data to be encrypted.
+--- @param key string - The key to use for encryption.
+--- @param iv? string (optional) - The initialization vector to use for encryption. Defaults to 16 null bytes.
+--- @param mode? string (optional) - The mode to use for encryption. Defaults to "CBC".
+--- @param keyLength? number (optional) - The length of the key to use for encryption. Defaults to 128.
+--- @returns table - A table containing the encrypted data in bytes, hex, and string formats.
+public.encrypt = function(data, key, iv, mode, keyLength)
+ local d = Array.fromString(data)
+ local k = Array.fromString(key)
+ local _iv = iv ~= nil and Array.fromString(iv) or Array.fromHex("00000000000000000000000000000000")
+
+ local cipherMode = getMode(mode) or CBCMode
+ local blockCipher = getBlockCipher(keyLength) or AES128Cipher
+
+ local cipher = cipherMode.Cipher()
+ .setKey(k)
+ .setBlockCipher(blockCipher)
+ .setPadding(ZeroPadding);
+
+
+ local cipherOutput = cipher
+ .init()
+ .update(Stream.fromArray(_iv))
+ .update(Stream.fromArray(d))
+ .finish()
+
+ local results = {}
+
+ results.asBytes = function()
+ return cipherOutput.asBytes()
+ end
+
+ results.asHex = function()
+ return cipherOutput.asHex()
+ end
+
+ results.asString = function()
+ return cipherOutput.asString()
+ end
+
+ return results
+end
+
+--- Decrypts the given data using AES decryption.
+--- @param cipher string - The hex encoded cipher to be decrypted.
+--- @param key string - The key to use for decryption.
+--- @param iv? string (optional) - The initialization vector to use for decryption. Defaults to 16 null bytes.
+--- @param mode? string (optional) - The mode to use for decryption. Defaults to "CBC".
+--- @param keyLength? number (optional) - The length of the key to use for decryption. Defaults to 128.
+public.decrypt = function(cipher, key, iv, mode, keyLength)
+ local cipherText = Array.fromHex(cipher)
+ local k = Array.fromString(key)
+ local _iv = iv ~= nil and Array.fromString(iv) or Array.fromHex("00000000000000000000000000000000")
+
+ local cipherMode = getMode(mode) or CBCMode
+ local blockCipher = getBlockCipher(keyLength) or AES128Cipher
+
+
+ local decipher = cipherMode.Decipher()
+ .setKey(k)
+ .setBlockCipher(blockCipher)
+ .setPadding(ZeroPadding);
+
+
+ local plainOutput = decipher
+ .init()
+ .update(Stream.fromArray(_iv))
+ .update(Stream.fromArray(cipherText))
+ .finish()
+
+ local results = {}
+
+ results.asBytes = function()
+ return plainOutput.asBytes()
+ end
+
+ results.asHex = function()
+ return plainOutput.asHex()
+ end
+
+ results.asString = function()
+ return plainOutput.asString()
+ end
+
+ return results
+end
+
+
+return public
diff --git a/module/lua/crypto/cipher/aes128.lua b/module/lua/crypto/cipher/aes128.lua
new file mode 100644
index 0000000..061598e
--- /dev/null
+++ b/module/lua/crypto/cipher/aes128.lua
@@ -0,0 +1,415 @@
+local Array = require(".crypto.util.array");
+local Bit = require(".crypto.util.bit");
+
+local XOR = Bit.bxor;
+
+local SBOX = {
+ [0] = 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
+ 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
+ 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
+ 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
+ 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
+ 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
+ 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
+ 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
+ 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
+ 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
+ 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
+ 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
+ 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
+ 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
+ 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
+ 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16};
+
+local ISBOX = {
+ [0] = 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
+ 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
+ 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
+ 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
+ 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
+ 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
+ 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
+ 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
+ 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
+ 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
+ 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
+ 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
+ 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
+ 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
+ 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D};
+
+local ROW_SHIFT = { 1, 6, 11, 16, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, };
+local IROW_SHIFT = { 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3, 16, 13, 10, 7, 4, };
+
+local ETABLE = {
+ [0] = 0x01, 0x03, 0x05, 0x0F, 0x11, 0x33, 0x55, 0xFF, 0x1A, 0x2E, 0x72, 0x96, 0xA1, 0xF8, 0x13, 0x35,
+ 0x5F, 0xE1, 0x38, 0x48, 0xD8, 0x73, 0x95, 0xA4, 0xF7, 0x02, 0x06, 0x0A, 0x1E, 0x22, 0x66, 0xAA,
+ 0xE5, 0x34, 0x5C, 0xE4, 0x37, 0x59, 0xEB, 0x26, 0x6A, 0xBE, 0xD9, 0x70, 0x90, 0xAB, 0xE6, 0x31,
+ 0x53, 0xF5, 0x04, 0x0C, 0x14, 0x3C, 0x44, 0xCC, 0x4F, 0xD1, 0x68, 0xB8, 0xD3, 0x6E, 0xB2, 0xCD,
+ 0x4C, 0xD4, 0x67, 0xA9, 0xE0, 0x3B, 0x4D, 0xD7, 0x62, 0xA6, 0xF1, 0x08, 0x18, 0x28, 0x78, 0x88,
+ 0x83, 0x9E, 0xB9, 0xD0, 0x6B, 0xBD, 0xDC, 0x7F, 0x81, 0x98, 0xB3, 0xCE, 0x49, 0xDB, 0x76, 0x9A,
+ 0xB5, 0xC4, 0x57, 0xF9, 0x10, 0x30, 0x50, 0xF0, 0x0B, 0x1D, 0x27, 0x69, 0xBB, 0xD6, 0x61, 0xA3,
+ 0xFE, 0x19, 0x2B, 0x7D, 0x87, 0x92, 0xAD, 0xEC, 0x2F, 0x71, 0x93, 0xAE, 0xE9, 0x20, 0x60, 0xA0,
+ 0xFB, 0x16, 0x3A, 0x4E, 0xD2, 0x6D, 0xB7, 0xC2, 0x5D, 0xE7, 0x32, 0x56, 0xFA, 0x15, 0x3F, 0x41,
+ 0xC3, 0x5E, 0xE2, 0x3D, 0x47, 0xC9, 0x40, 0xC0, 0x5B, 0xED, 0x2C, 0x74, 0x9C, 0xBF, 0xDA, 0x75,
+ 0x9F, 0xBA, 0xD5, 0x64, 0xAC, 0xEF, 0x2A, 0x7E, 0x82, 0x9D, 0xBC, 0xDF, 0x7A, 0x8E, 0x89, 0x80,
+ 0x9B, 0xB6, 0xC1, 0x58, 0xE8, 0x23, 0x65, 0xAF, 0xEA, 0x25, 0x6F, 0xB1, 0xC8, 0x43, 0xC5, 0x54,
+ 0xFC, 0x1F, 0x21, 0x63, 0xA5, 0xF4, 0x07, 0x09, 0x1B, 0x2D, 0x77, 0x99, 0xB0, 0xCB, 0x46, 0xCA,
+ 0x45, 0xCF, 0x4A, 0xDE, 0x79, 0x8B, 0x86, 0x91, 0xA8, 0xE3, 0x3E, 0x42, 0xC6, 0x51, 0xF3, 0x0E,
+ 0x12, 0x36, 0x5A, 0xEE, 0x29, 0x7B, 0x8D, 0x8C, 0x8F, 0x8A, 0x85, 0x94, 0xA7, 0xF2, 0x0D, 0x17,
+ 0x39, 0x4B, 0xDD, 0x7C, 0x84, 0x97, 0xA2, 0xFD, 0x1C, 0x24, 0x6C, 0xB4, 0xC7, 0x52, 0xF6, 0x01};
+
+local LTABLE = {
+ [0] = 0x00, 0x00, 0x19, 0x01, 0x32, 0x02, 0x1A, 0xC6, 0x4B, 0xC7, 0x1B, 0x68, 0x33, 0xEE, 0xDF, 0x03,
+ 0x64, 0x04, 0xE0, 0x0E, 0x34, 0x8D, 0x81, 0xEF, 0x4C, 0x71, 0x08, 0xC8, 0xF8, 0x69, 0x1C, 0xC1,
+ 0x7D, 0xC2, 0x1D, 0xB5, 0xF9, 0xB9, 0x27, 0x6A, 0x4D, 0xE4, 0xA6, 0x72, 0x9A, 0xC9, 0x09, 0x78,
+ 0x65, 0x2F, 0x8A, 0x05, 0x21, 0x0F, 0xE1, 0x24, 0x12, 0xF0, 0x82, 0x45, 0x35, 0x93, 0xDA, 0x8E,
+ 0x96, 0x8F, 0xDB, 0xBD, 0x36, 0xD0, 0xCE, 0x94, 0x13, 0x5C, 0xD2, 0xF1, 0x40, 0x46, 0x83, 0x38,
+ 0x66, 0xDD, 0xFD, 0x30, 0xBF, 0x06, 0x8B, 0x62, 0xB3, 0x25, 0xE2, 0x98, 0x22, 0x88, 0x91, 0x10,
+ 0x7E, 0x6E, 0x48, 0xC3, 0xA3, 0xB6, 0x1E, 0x42, 0x3A, 0x6B, 0x28, 0x54, 0xFA, 0x85, 0x3D, 0xBA,
+ 0x2B, 0x79, 0x0A, 0x15, 0x9B, 0x9F, 0x5E, 0xCA, 0x4E, 0xD4, 0xAC, 0xE5, 0xF3, 0x73, 0xA7, 0x57,
+ 0xAF, 0x58, 0xA8, 0x50, 0xF4, 0xEA, 0xD6, 0x74, 0x4F, 0xAE, 0xE9, 0xD5, 0xE7, 0xE6, 0xAD, 0xE8,
+ 0x2C, 0xD7, 0x75, 0x7A, 0xEB, 0x16, 0x0B, 0xF5, 0x59, 0xCB, 0x5F, 0xB0, 0x9C, 0xA9, 0x51, 0xA0,
+ 0x7F, 0x0C, 0xF6, 0x6F, 0x17, 0xC4, 0x49, 0xEC, 0xD8, 0x43, 0x1F, 0x2D, 0xA4, 0x76, 0x7B, 0xB7,
+ 0xCC, 0xBB, 0x3E, 0x5A, 0xFB, 0x60, 0xB1, 0x86, 0x3B, 0x52, 0xA1, 0x6C, 0xAA, 0x55, 0x29, 0x9D,
+ 0x97, 0xB2, 0x87, 0x90, 0x61, 0xBE, 0xDC, 0xFC, 0xBC, 0x95, 0xCF, 0xCD, 0x37, 0x3F, 0x5B, 0xD1,
+ 0x53, 0x39, 0x84, 0x3C, 0x41, 0xA2, 0x6D, 0x47, 0x14, 0x2A, 0x9E, 0x5D, 0x56, 0xF2, 0xD3, 0xAB,
+ 0x44, 0x11, 0x92, 0xD9, 0x23, 0x20, 0x2E, 0x89, 0xB4, 0x7C, 0xB8, 0x26, 0x77, 0x99, 0xE3, 0xA5,
+ 0x67, 0x4A, 0xED, 0xDE, 0xC5, 0x31, 0xFE, 0x18, 0x0D, 0x63, 0x8C, 0x80, 0xC0, 0xF7, 0x70, 0x07};
+
+local MIXTABLE = {
+ 0x02, 0x03, 0x01, 0x01,
+ 0x01, 0x02, 0x03, 0x01,
+ 0x01, 0x01, 0x02, 0x03,
+ 0x03, 0x01, 0x01, 0x02};
+
+local IMIXTABLE = {
+ 0x0E, 0x0B, 0x0D, 0x09,
+ 0x09, 0x0E, 0x0B, 0x0D,
+ 0x0D, 0x09, 0x0E, 0x0B,
+ 0x0B, 0x0D, 0x09, 0x0E};
+
+local RCON = {
+[0] = 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
+0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39,
+0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
+0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef,
+0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b,
+0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
+0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
+0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
+0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
+0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63,
+0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d};
+
+
+local GMUL = function(A, B)
+ if(A == 0x01) then return B; end
+ if(B == 0x01) then return A; end
+ if(A == 0x00) then return 0; end
+ if(B == 0x00) then return 0; end
+
+ local LA = LTABLE[A];
+ local LB = LTABLE[B];
+
+ local sum = LA + LB;
+ if (sum > 0xFF) then sum = sum - 0xFF; end
+
+ return ETABLE[sum];
+end
+
+local byteSub = Array.substitute;
+
+local shiftRow = Array.permute;
+
+local mixCol = function(i, mix)
+ local out = {};
+
+ local a, b, c, d;
+
+ a = GMUL(i[ 1], mix[ 1]);
+ b = GMUL(i[ 2], mix[ 2]);
+ c = GMUL(i[ 3], mix[ 3]);
+ d = GMUL(i[ 4], mix[ 4]);
+ out[ 1] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 1], mix[ 5]);
+ b = GMUL(i[ 2], mix[ 6]);
+ c = GMUL(i[ 3], mix[ 7]);
+ d = GMUL(i[ 4], mix[ 8]);
+ out[ 2] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 1], mix[ 9]);
+ b = GMUL(i[ 2], mix[10]);
+ c = GMUL(i[ 3], mix[11]);
+ d = GMUL(i[ 4], mix[12]);
+ out[ 3] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 1], mix[13]);
+ b = GMUL(i[ 2], mix[14]);
+ c = GMUL(i[ 3], mix[15]);
+ d = GMUL(i[ 4], mix[16]);
+ out[ 4] = XOR(XOR(a, b), XOR(c, d));
+
+
+ a = GMUL(i[ 5], mix[ 1]);
+ b = GMUL(i[ 6], mix[ 2]);
+ c = GMUL(i[ 7], mix[ 3]);
+ d = GMUL(i[ 8], mix[ 4]);
+ out[ 5] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 5], mix[ 5]);
+ b = GMUL(i[ 6], mix[ 6]);
+ c = GMUL(i[ 7], mix[ 7]);
+ d = GMUL(i[ 8], mix[ 8]);
+ out[ 6] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 5], mix[ 9]);
+ b = GMUL(i[ 6], mix[10]);
+ c = GMUL(i[ 7], mix[11]);
+ d = GMUL(i[ 8], mix[12]);
+ out[ 7] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 5], mix[13]);
+ b = GMUL(i[ 6], mix[14]);
+ c = GMUL(i[ 7], mix[15]);
+ d = GMUL(i[ 8], mix[16]);
+ out[ 8] = XOR(XOR(a, b), XOR(c, d));
+
+
+ a = GMUL(i[ 9], mix[ 1]);
+ b = GMUL(i[10], mix[ 2]);
+ c = GMUL(i[11], mix[ 3]);
+ d = GMUL(i[12], mix[ 4]);
+ out[ 9] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 9], mix[ 5]);
+ b = GMUL(i[10], mix[ 6]);
+ c = GMUL(i[11], mix[ 7]);
+ d = GMUL(i[12], mix[ 8]);
+ out[10] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 9], mix[ 9]);
+ b = GMUL(i[10], mix[10]);
+ c = GMUL(i[11], mix[11]);
+ d = GMUL(i[12], mix[12]);
+ out[11] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 9], mix[13]);
+ b = GMUL(i[10], mix[14]);
+ c = GMUL(i[11], mix[15]);
+ d = GMUL(i[12], mix[16]);
+ out[12] = XOR(XOR(a, b), XOR(c, d));
+
+
+ a = GMUL(i[13], mix[ 1]);
+ b = GMUL(i[14], mix[ 2]);
+ c = GMUL(i[15], mix[ 3]);
+ d = GMUL(i[16], mix[ 4]);
+ out[13] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[13], mix[ 5]);
+ b = GMUL(i[14], mix[ 6]);
+ c = GMUL(i[15], mix[ 7]);
+ d = GMUL(i[16], mix[ 8]);
+ out[14] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[13], mix[ 9]);
+ b = GMUL(i[14], mix[10]);
+ c = GMUL(i[15], mix[11]);
+ d = GMUL(i[16], mix[12]);
+ out[15] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[13], mix[13]);
+ b = GMUL(i[14], mix[14]);
+ c = GMUL(i[15], mix[15]);
+ d = GMUL(i[16], mix[16]);
+ out[16] = XOR(XOR(a, b), XOR(c, d));
+
+ return out;
+end
+
+local keyRound = function(key, round)
+ local out = {};
+
+ out[ 1] = XOR(key[ 1], XOR(SBOX[key[14]], RCON[round]));
+ out[ 2] = XOR(key[ 2], SBOX[key[15]]);
+ out[ 3] = XOR(key[ 3], SBOX[key[16]]);
+ out[ 4] = XOR(key[ 4], SBOX[key[13]]);
+
+ out[ 5] = XOR(out[ 1], key[ 5]);
+ out[ 6] = XOR(out[ 2], key[ 6]);
+ out[ 7] = XOR(out[ 3], key[ 7]);
+ out[ 8] = XOR(out[ 4], key[ 8]);
+
+ out[ 9] = XOR(out[ 5], key[ 9]);
+ out[10] = XOR(out[ 6], key[10]);
+ out[11] = XOR(out[ 7], key[11]);
+ out[12] = XOR(out[ 8], key[12]);
+
+ out[13] = XOR(out[ 9], key[13]);
+ out[14] = XOR(out[10], key[14]);
+ out[15] = XOR(out[11], key[15]);
+ out[16] = XOR(out[12], key[16]);
+
+ return out;
+end
+
+local keyExpand = function(key)
+ local keys = {};
+
+ local temp = key;
+
+ keys[1] = temp;
+
+ for i = 1, 10 do
+ temp = keyRound(temp, i);
+ keys[i + 1] = temp;
+ end
+
+ return keys;
+
+end
+
+local addKey = Array.XOR;
+
+
+
+local AES = {};
+
+AES.blockSize = 16;
+
+AES.encrypt = function(key, block)
+
+ local keySchedule = keyExpand(key);
+
+ --round 0
+ block = addKey(block, keySchedule[1]);
+
+ --round 1
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[2]);
+
+ --round 2
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[3]);
+
+ --round 3
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[4]);
+
+ --round 4
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[5]);
+
+ --round 5
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[6]);
+
+ --round 6
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[7]);
+
+ --round 7
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[8]);
+
+ --round 8
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[9]);
+
+ --round 9
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[10]);
+
+ --round 10
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = addKey(block, keySchedule[11]);
+
+ return block;
+
+end
+
+AES.decrypt = function(key, block)
+
+ local keySchedule = keyExpand(key);
+
+ --round 0
+ block = addKey(block, keySchedule[11]);
+
+ --round 1
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[10]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 2
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[9]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 3
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[8]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 4
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[7]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 5
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[6]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 6
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[5]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 7
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[4]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 8
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[3]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 9
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[2]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 10
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[1]);
+
+ return block;
+end
+
+return AES;
\ No newline at end of file
diff --git a/module/lua/crypto/cipher/aes192.lua b/module/lua/crypto/cipher/aes192.lua
new file mode 100644
index 0000000..67eb603
--- /dev/null
+++ b/module/lua/crypto/cipher/aes192.lua
@@ -0,0 +1,462 @@
+
+local Array = require(".crypto.util.array");
+local Bit = require(".crypto.util.bit");
+
+local XOR = Bit.bxor;
+
+local SBOX = {
+ [0] = 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
+ 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
+ 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
+ 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
+ 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
+ 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
+ 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
+ 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
+ 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
+ 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
+ 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
+ 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
+ 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
+ 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
+ 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
+ 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16};
+
+local ISBOX = {
+ [0] = 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
+ 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
+ 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
+ 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
+ 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
+ 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
+ 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
+ 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
+ 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
+ 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
+ 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
+ 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
+ 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
+ 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
+ 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D};
+
+local ROW_SHIFT = { 1, 6, 11, 16, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, };
+local IROW_SHIFT = { 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3, 16, 13, 10, 7, 4, };
+
+local ETABLE = {
+ [0] = 0x01, 0x03, 0x05, 0x0F, 0x11, 0x33, 0x55, 0xFF, 0x1A, 0x2E, 0x72, 0x96, 0xA1, 0xF8, 0x13, 0x35,
+ 0x5F, 0xE1, 0x38, 0x48, 0xD8, 0x73, 0x95, 0xA4, 0xF7, 0x02, 0x06, 0x0A, 0x1E, 0x22, 0x66, 0xAA,
+ 0xE5, 0x34, 0x5C, 0xE4, 0x37, 0x59, 0xEB, 0x26, 0x6A, 0xBE, 0xD9, 0x70, 0x90, 0xAB, 0xE6, 0x31,
+ 0x53, 0xF5, 0x04, 0x0C, 0x14, 0x3C, 0x44, 0xCC, 0x4F, 0xD1, 0x68, 0xB8, 0xD3, 0x6E, 0xB2, 0xCD,
+ 0x4C, 0xD4, 0x67, 0xA9, 0xE0, 0x3B, 0x4D, 0xD7, 0x62, 0xA6, 0xF1, 0x08, 0x18, 0x28, 0x78, 0x88,
+ 0x83, 0x9E, 0xB9, 0xD0, 0x6B, 0xBD, 0xDC, 0x7F, 0x81, 0x98, 0xB3, 0xCE, 0x49, 0xDB, 0x76, 0x9A,
+ 0xB5, 0xC4, 0x57, 0xF9, 0x10, 0x30, 0x50, 0xF0, 0x0B, 0x1D, 0x27, 0x69, 0xBB, 0xD6, 0x61, 0xA3,
+ 0xFE, 0x19, 0x2B, 0x7D, 0x87, 0x92, 0xAD, 0xEC, 0x2F, 0x71, 0x93, 0xAE, 0xE9, 0x20, 0x60, 0xA0,
+ 0xFB, 0x16, 0x3A, 0x4E, 0xD2, 0x6D, 0xB7, 0xC2, 0x5D, 0xE7, 0x32, 0x56, 0xFA, 0x15, 0x3F, 0x41,
+ 0xC3, 0x5E, 0xE2, 0x3D, 0x47, 0xC9, 0x40, 0xC0, 0x5B, 0xED, 0x2C, 0x74, 0x9C, 0xBF, 0xDA, 0x75,
+ 0x9F, 0xBA, 0xD5, 0x64, 0xAC, 0xEF, 0x2A, 0x7E, 0x82, 0x9D, 0xBC, 0xDF, 0x7A, 0x8E, 0x89, 0x80,
+ 0x9B, 0xB6, 0xC1, 0x58, 0xE8, 0x23, 0x65, 0xAF, 0xEA, 0x25, 0x6F, 0xB1, 0xC8, 0x43, 0xC5, 0x54,
+ 0xFC, 0x1F, 0x21, 0x63, 0xA5, 0xF4, 0x07, 0x09, 0x1B, 0x2D, 0x77, 0x99, 0xB0, 0xCB, 0x46, 0xCA,
+ 0x45, 0xCF, 0x4A, 0xDE, 0x79, 0x8B, 0x86, 0x91, 0xA8, 0xE3, 0x3E, 0x42, 0xC6, 0x51, 0xF3, 0x0E,
+ 0x12, 0x36, 0x5A, 0xEE, 0x29, 0x7B, 0x8D, 0x8C, 0x8F, 0x8A, 0x85, 0x94, 0xA7, 0xF2, 0x0D, 0x17,
+ 0x39, 0x4B, 0xDD, 0x7C, 0x84, 0x97, 0xA2, 0xFD, 0x1C, 0x24, 0x6C, 0xB4, 0xC7, 0x52, 0xF6, 0x01};
+
+local LTABLE = {
+ [0] = 0x00, 0x00, 0x19, 0x01, 0x32, 0x02, 0x1A, 0xC6, 0x4B, 0xC7, 0x1B, 0x68, 0x33, 0xEE, 0xDF, 0x03,
+ 0x64, 0x04, 0xE0, 0x0E, 0x34, 0x8D, 0x81, 0xEF, 0x4C, 0x71, 0x08, 0xC8, 0xF8, 0x69, 0x1C, 0xC1,
+ 0x7D, 0xC2, 0x1D, 0xB5, 0xF9, 0xB9, 0x27, 0x6A, 0x4D, 0xE4, 0xA6, 0x72, 0x9A, 0xC9, 0x09, 0x78,
+ 0x65, 0x2F, 0x8A, 0x05, 0x21, 0x0F, 0xE1, 0x24, 0x12, 0xF0, 0x82, 0x45, 0x35, 0x93, 0xDA, 0x8E,
+ 0x96, 0x8F, 0xDB, 0xBD, 0x36, 0xD0, 0xCE, 0x94, 0x13, 0x5C, 0xD2, 0xF1, 0x40, 0x46, 0x83, 0x38,
+ 0x66, 0xDD, 0xFD, 0x30, 0xBF, 0x06, 0x8B, 0x62, 0xB3, 0x25, 0xE2, 0x98, 0x22, 0x88, 0x91, 0x10,
+ 0x7E, 0x6E, 0x48, 0xC3, 0xA3, 0xB6, 0x1E, 0x42, 0x3A, 0x6B, 0x28, 0x54, 0xFA, 0x85, 0x3D, 0xBA,
+ 0x2B, 0x79, 0x0A, 0x15, 0x9B, 0x9F, 0x5E, 0xCA, 0x4E, 0xD4, 0xAC, 0xE5, 0xF3, 0x73, 0xA7, 0x57,
+ 0xAF, 0x58, 0xA8, 0x50, 0xF4, 0xEA, 0xD6, 0x74, 0x4F, 0xAE, 0xE9, 0xD5, 0xE7, 0xE6, 0xAD, 0xE8,
+ 0x2C, 0xD7, 0x75, 0x7A, 0xEB, 0x16, 0x0B, 0xF5, 0x59, 0xCB, 0x5F, 0xB0, 0x9C, 0xA9, 0x51, 0xA0,
+ 0x7F, 0x0C, 0xF6, 0x6F, 0x17, 0xC4, 0x49, 0xEC, 0xD8, 0x43, 0x1F, 0x2D, 0xA4, 0x76, 0x7B, 0xB7,
+ 0xCC, 0xBB, 0x3E, 0x5A, 0xFB, 0x60, 0xB1, 0x86, 0x3B, 0x52, 0xA1, 0x6C, 0xAA, 0x55, 0x29, 0x9D,
+ 0x97, 0xB2, 0x87, 0x90, 0x61, 0xBE, 0xDC, 0xFC, 0xBC, 0x95, 0xCF, 0xCD, 0x37, 0x3F, 0x5B, 0xD1,
+ 0x53, 0x39, 0x84, 0x3C, 0x41, 0xA2, 0x6D, 0x47, 0x14, 0x2A, 0x9E, 0x5D, 0x56, 0xF2, 0xD3, 0xAB,
+ 0x44, 0x11, 0x92, 0xD9, 0x23, 0x20, 0x2E, 0x89, 0xB4, 0x7C, 0xB8, 0x26, 0x77, 0x99, 0xE3, 0xA5,
+ 0x67, 0x4A, 0xED, 0xDE, 0xC5, 0x31, 0xFE, 0x18, 0x0D, 0x63, 0x8C, 0x80, 0xC0, 0xF7, 0x70, 0x07};
+
+local MIXTABLE = {
+ 0x02, 0x03, 0x01, 0x01,
+ 0x01, 0x02, 0x03, 0x01,
+ 0x01, 0x01, 0x02, 0x03,
+ 0x03, 0x01, 0x01, 0x02};
+
+local IMIXTABLE = {
+ 0x0E, 0x0B, 0x0D, 0x09,
+ 0x09, 0x0E, 0x0B, 0x0D,
+ 0x0D, 0x09, 0x0E, 0x0B,
+ 0x0B, 0x0D, 0x09, 0x0E};
+
+local RCON = {
+[0] = 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
+0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39,
+0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
+0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef,
+0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b,
+0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
+0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
+0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
+0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
+0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63,
+0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d};
+
+
+local GMUL = function(A, B)
+ if(A == 0x01) then return B; end
+ if(B == 0x01) then return A; end
+ if(A == 0x00) then return 0; end
+ if(B == 0x00) then return 0; end
+
+ local LA = LTABLE[A];
+ local LB = LTABLE[B];
+
+ local sum = LA + LB;
+ if (sum > 0xFF) then sum = sum - 0xFF; end
+
+ return ETABLE[sum];
+end
+
+local byteSub = Array.substitute;
+
+local shiftRow = Array.permute;
+
+local mixCol = function(i, mix)
+ local out = {};
+
+ local a, b, c, d;
+
+ a = GMUL(i[ 1], mix[ 1]);
+ b = GMUL(i[ 2], mix[ 2]);
+ c = GMUL(i[ 3], mix[ 3]);
+ d = GMUL(i[ 4], mix[ 4]);
+ out[ 1] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 1], mix[ 5]);
+ b = GMUL(i[ 2], mix[ 6]);
+ c = GMUL(i[ 3], mix[ 7]);
+ d = GMUL(i[ 4], mix[ 8]);
+ out[ 2] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 1], mix[ 9]);
+ b = GMUL(i[ 2], mix[10]);
+ c = GMUL(i[ 3], mix[11]);
+ d = GMUL(i[ 4], mix[12]);
+ out[ 3] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 1], mix[13]);
+ b = GMUL(i[ 2], mix[14]);
+ c = GMUL(i[ 3], mix[15]);
+ d = GMUL(i[ 4], mix[16]);
+ out[ 4] = XOR(XOR(a, b), XOR(c, d));
+
+
+ a = GMUL(i[ 5], mix[ 1]);
+ b = GMUL(i[ 6], mix[ 2]);
+ c = GMUL(i[ 7], mix[ 3]);
+ d = GMUL(i[ 8], mix[ 4]);
+ out[ 5] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 5], mix[ 5]);
+ b = GMUL(i[ 6], mix[ 6]);
+ c = GMUL(i[ 7], mix[ 7]);
+ d = GMUL(i[ 8], mix[ 8]);
+ out[ 6] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 5], mix[ 9]);
+ b = GMUL(i[ 6], mix[10]);
+ c = GMUL(i[ 7], mix[11]);
+ d = GMUL(i[ 8], mix[12]);
+ out[ 7] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 5], mix[13]);
+ b = GMUL(i[ 6], mix[14]);
+ c = GMUL(i[ 7], mix[15]);
+ d = GMUL(i[ 8], mix[16]);
+ out[ 8] = XOR(XOR(a, b), XOR(c, d));
+
+
+ a = GMUL(i[ 9], mix[ 1]);
+ b = GMUL(i[10], mix[ 2]);
+ c = GMUL(i[11], mix[ 3]);
+ d = GMUL(i[12], mix[ 4]);
+ out[ 9] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 9], mix[ 5]);
+ b = GMUL(i[10], mix[ 6]);
+ c = GMUL(i[11], mix[ 7]);
+ d = GMUL(i[12], mix[ 8]);
+ out[10] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 9], mix[ 9]);
+ b = GMUL(i[10], mix[10]);
+ c = GMUL(i[11], mix[11]);
+ d = GMUL(i[12], mix[12]);
+ out[11] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 9], mix[13]);
+ b = GMUL(i[10], mix[14]);
+ c = GMUL(i[11], mix[15]);
+ d = GMUL(i[12], mix[16]);
+ out[12] = XOR(XOR(a, b), XOR(c, d));
+
+
+ a = GMUL(i[13], mix[ 1]);
+ b = GMUL(i[14], mix[ 2]);
+ c = GMUL(i[15], mix[ 3]);
+ d = GMUL(i[16], mix[ 4]);
+ out[13] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[13], mix[ 5]);
+ b = GMUL(i[14], mix[ 6]);
+ c = GMUL(i[15], mix[ 7]);
+ d = GMUL(i[16], mix[ 8]);
+ out[14] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[13], mix[ 9]);
+ b = GMUL(i[14], mix[10]);
+ c = GMUL(i[15], mix[11]);
+ d = GMUL(i[16], mix[12]);
+ out[15] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[13], mix[13]);
+ b = GMUL(i[14], mix[14]);
+ c = GMUL(i[15], mix[15]);
+ d = GMUL(i[16], mix[16]);
+ out[16] = XOR(XOR(a, b), XOR(c, d));
+
+ return out;
+end
+
+local keyRound = function(key, round)
+ local i = (round - 1) * 24;
+ local out = key;
+
+ out[25 + i] = XOR(key[ 1 + i], XOR(SBOX[key[22 + i]], RCON[round]));
+ out[26 + i] = XOR(key[ 2 + i], SBOX[key[23 + i]]);
+ out[27 + i] = XOR(key[ 3 + i], SBOX[key[24 + i]]);
+ out[28 + i] = XOR(key[ 4 + i], SBOX[key[21 + i]]);
+
+ out[29 + i] = XOR(out[25 + i], key[ 5 + i]);
+ out[30 + i] = XOR(out[26 + i], key[ 6 + i]);
+ out[31 + i] = XOR(out[27 + i], key[ 7 + i]);
+ out[32 + i] = XOR(out[28 + i], key[ 8 + i]);
+
+ out[33 + i] = XOR(out[29 + i], key[ 9 + i]);
+ out[34 + i] = XOR(out[30 + i], key[10 + i]);
+ out[35 + i] = XOR(out[31 + i], key[11 + i]);
+ out[36 + i] = XOR(out[32 + i], key[12 + i]);
+
+ out[37 + i] = XOR(out[33 + i], key[13 + i]);
+ out[38 + i] = XOR(out[34 + i], key[14 + i]);
+ out[39 + i] = XOR(out[35 + i], key[15 + i]);
+ out[40 + i] = XOR(out[36 + i], key[16 + i]);
+
+ out[41 + i] = XOR(out[37 + i], key[17 + i]);
+ out[42 + i] = XOR(out[38 + i], key[18 + i]);
+ out[43 + i] = XOR(out[39 + i], key[19 + i]);
+ out[44 + i] = XOR(out[40 + i], key[20 + i]);
+
+ out[45 + i] = XOR(out[41 + i], key[21 + i]);
+ out[46 + i] = XOR(out[42 + i], key[22 + i]);
+ out[47 + i] = XOR(out[43 + i], key[23 + i]);
+ out[48 + i] = XOR(out[44 + i], key[24 + i]);
+
+ return out;
+end
+
+local keyExpand = function(key)
+ local bytes = Array.copy(key);
+
+ for i = 1, 8 do
+ keyRound(bytes, i);
+ end
+
+ local keys = {};
+
+ keys[ 1] = Array.slice(bytes, 1, 16);
+ keys[ 2] = Array.slice(bytes, 17, 32);
+ keys[ 3] = Array.slice(bytes, 33, 48);
+ keys[ 4] = Array.slice(bytes, 49, 64);
+ keys[ 5] = Array.slice(bytes, 65, 80);
+ keys[ 6] = Array.slice(bytes, 81, 96);
+ keys[ 7] = Array.slice(bytes, 97, 112);
+ keys[ 8] = Array.slice(bytes, 113, 128);
+ keys[ 9] = Array.slice(bytes, 129, 144);
+ keys[10] = Array.slice(bytes, 145, 160);
+ keys[11] = Array.slice(bytes, 161, 176);
+ keys[12] = Array.slice(bytes, 177, 192);
+ keys[13] = Array.slice(bytes, 193, 208);
+
+ return keys;
+
+end
+
+local addKey = Array.XOR;
+
+
+
+local AES = {};
+
+AES.blockSize = 16;
+
+AES.encrypt = function(key, block)
+
+ local keySchedule = keyExpand(key);
+
+ --round 0
+ block = addKey(block, keySchedule[1]);
+
+ --round 1
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[2]);
+
+ --round 2
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[3]);
+
+ --round 3
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[4]);
+
+ --round 4
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[5]);
+
+ --round 5
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[6]);
+
+ --round 6
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[7]);
+
+ --round 7
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[8]);
+
+ --round 8
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[9]);
+
+ --round 9
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[10]);
+
+ --round 10
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[11]);
+
+ --round 11
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[12]);
+
+ --round 12
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = addKey(block, keySchedule[13]);
+
+ return block;
+
+end
+
+AES.decrypt = function(key, block)
+
+ local keySchedule = keyExpand(key);
+
+ --round 0
+ block = addKey(block, keySchedule[13]);
+
+ --round 1
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[12]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 2
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[11]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 3
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[10]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 4
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[9]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 5
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[8]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 6
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[7]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 7
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[6]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 8
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[5]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 9
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[4]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 10
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[3]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 11
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[2]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 12
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[1]);
+
+ return block;
+end
+
+return AES;
\ No newline at end of file
diff --git a/module/lua/crypto/cipher/aes256.lua b/module/lua/crypto/cipher/aes256.lua
new file mode 100644
index 0000000..bc79e77
--- /dev/null
+++ b/module/lua/crypto/cipher/aes256.lua
@@ -0,0 +1,498 @@
+local Array = require(".crypto.util.array");
+local Bit = require(".crypto.util.bit");
+
+local XOR = Bit.bxor;
+
+local SBOX = {
+ [0] = 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
+ 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
+ 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
+ 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
+ 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
+ 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
+ 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
+ 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
+ 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
+ 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
+ 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
+ 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
+ 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
+ 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
+ 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
+ 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16};
+
+local ISBOX = {
+ [0] = 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
+ 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
+ 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
+ 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
+ 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
+ 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
+ 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
+ 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
+ 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
+ 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
+ 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
+ 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
+ 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
+ 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
+ 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D};
+
+local ROW_SHIFT = { 1, 6, 11, 16, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, };
+local IROW_SHIFT = { 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3, 16, 13, 10, 7, 4, };
+
+local ETABLE = {
+ [0] = 0x01, 0x03, 0x05, 0x0F, 0x11, 0x33, 0x55, 0xFF, 0x1A, 0x2E, 0x72, 0x96, 0xA1, 0xF8, 0x13, 0x35,
+ 0x5F, 0xE1, 0x38, 0x48, 0xD8, 0x73, 0x95, 0xA4, 0xF7, 0x02, 0x06, 0x0A, 0x1E, 0x22, 0x66, 0xAA,
+ 0xE5, 0x34, 0x5C, 0xE4, 0x37, 0x59, 0xEB, 0x26, 0x6A, 0xBE, 0xD9, 0x70, 0x90, 0xAB, 0xE6, 0x31,
+ 0x53, 0xF5, 0x04, 0x0C, 0x14, 0x3C, 0x44, 0xCC, 0x4F, 0xD1, 0x68, 0xB8, 0xD3, 0x6E, 0xB2, 0xCD,
+ 0x4C, 0xD4, 0x67, 0xA9, 0xE0, 0x3B, 0x4D, 0xD7, 0x62, 0xA6, 0xF1, 0x08, 0x18, 0x28, 0x78, 0x88,
+ 0x83, 0x9E, 0xB9, 0xD0, 0x6B, 0xBD, 0xDC, 0x7F, 0x81, 0x98, 0xB3, 0xCE, 0x49, 0xDB, 0x76, 0x9A,
+ 0xB5, 0xC4, 0x57, 0xF9, 0x10, 0x30, 0x50, 0xF0, 0x0B, 0x1D, 0x27, 0x69, 0xBB, 0xD6, 0x61, 0xA3,
+ 0xFE, 0x19, 0x2B, 0x7D, 0x87, 0x92, 0xAD, 0xEC, 0x2F, 0x71, 0x93, 0xAE, 0xE9, 0x20, 0x60, 0xA0,
+ 0xFB, 0x16, 0x3A, 0x4E, 0xD2, 0x6D, 0xB7, 0xC2, 0x5D, 0xE7, 0x32, 0x56, 0xFA, 0x15, 0x3F, 0x41,
+ 0xC3, 0x5E, 0xE2, 0x3D, 0x47, 0xC9, 0x40, 0xC0, 0x5B, 0xED, 0x2C, 0x74, 0x9C, 0xBF, 0xDA, 0x75,
+ 0x9F, 0xBA, 0xD5, 0x64, 0xAC, 0xEF, 0x2A, 0x7E, 0x82, 0x9D, 0xBC, 0xDF, 0x7A, 0x8E, 0x89, 0x80,
+ 0x9B, 0xB6, 0xC1, 0x58, 0xE8, 0x23, 0x65, 0xAF, 0xEA, 0x25, 0x6F, 0xB1, 0xC8, 0x43, 0xC5, 0x54,
+ 0xFC, 0x1F, 0x21, 0x63, 0xA5, 0xF4, 0x07, 0x09, 0x1B, 0x2D, 0x77, 0x99, 0xB0, 0xCB, 0x46, 0xCA,
+ 0x45, 0xCF, 0x4A, 0xDE, 0x79, 0x8B, 0x86, 0x91, 0xA8, 0xE3, 0x3E, 0x42, 0xC6, 0x51, 0xF3, 0x0E,
+ 0x12, 0x36, 0x5A, 0xEE, 0x29, 0x7B, 0x8D, 0x8C, 0x8F, 0x8A, 0x85, 0x94, 0xA7, 0xF2, 0x0D, 0x17,
+ 0x39, 0x4B, 0xDD, 0x7C, 0x84, 0x97, 0xA2, 0xFD, 0x1C, 0x24, 0x6C, 0xB4, 0xC7, 0x52, 0xF6, 0x01};
+
+local LTABLE = {
+ [0] = 0x00, 0x00, 0x19, 0x01, 0x32, 0x02, 0x1A, 0xC6, 0x4B, 0xC7, 0x1B, 0x68, 0x33, 0xEE, 0xDF, 0x03,
+ 0x64, 0x04, 0xE0, 0x0E, 0x34, 0x8D, 0x81, 0xEF, 0x4C, 0x71, 0x08, 0xC8, 0xF8, 0x69, 0x1C, 0xC1,
+ 0x7D, 0xC2, 0x1D, 0xB5, 0xF9, 0xB9, 0x27, 0x6A, 0x4D, 0xE4, 0xA6, 0x72, 0x9A, 0xC9, 0x09, 0x78,
+ 0x65, 0x2F, 0x8A, 0x05, 0x21, 0x0F, 0xE1, 0x24, 0x12, 0xF0, 0x82, 0x45, 0x35, 0x93, 0xDA, 0x8E,
+ 0x96, 0x8F, 0xDB, 0xBD, 0x36, 0xD0, 0xCE, 0x94, 0x13, 0x5C, 0xD2, 0xF1, 0x40, 0x46, 0x83, 0x38,
+ 0x66, 0xDD, 0xFD, 0x30, 0xBF, 0x06, 0x8B, 0x62, 0xB3, 0x25, 0xE2, 0x98, 0x22, 0x88, 0x91, 0x10,
+ 0x7E, 0x6E, 0x48, 0xC3, 0xA3, 0xB6, 0x1E, 0x42, 0x3A, 0x6B, 0x28, 0x54, 0xFA, 0x85, 0x3D, 0xBA,
+ 0x2B, 0x79, 0x0A, 0x15, 0x9B, 0x9F, 0x5E, 0xCA, 0x4E, 0xD4, 0xAC, 0xE5, 0xF3, 0x73, 0xA7, 0x57,
+ 0xAF, 0x58, 0xA8, 0x50, 0xF4, 0xEA, 0xD6, 0x74, 0x4F, 0xAE, 0xE9, 0xD5, 0xE7, 0xE6, 0xAD, 0xE8,
+ 0x2C, 0xD7, 0x75, 0x7A, 0xEB, 0x16, 0x0B, 0xF5, 0x59, 0xCB, 0x5F, 0xB0, 0x9C, 0xA9, 0x51, 0xA0,
+ 0x7F, 0x0C, 0xF6, 0x6F, 0x17, 0xC4, 0x49, 0xEC, 0xD8, 0x43, 0x1F, 0x2D, 0xA4, 0x76, 0x7B, 0xB7,
+ 0xCC, 0xBB, 0x3E, 0x5A, 0xFB, 0x60, 0xB1, 0x86, 0x3B, 0x52, 0xA1, 0x6C, 0xAA, 0x55, 0x29, 0x9D,
+ 0x97, 0xB2, 0x87, 0x90, 0x61, 0xBE, 0xDC, 0xFC, 0xBC, 0x95, 0xCF, 0xCD, 0x37, 0x3F, 0x5B, 0xD1,
+ 0x53, 0x39, 0x84, 0x3C, 0x41, 0xA2, 0x6D, 0x47, 0x14, 0x2A, 0x9E, 0x5D, 0x56, 0xF2, 0xD3, 0xAB,
+ 0x44, 0x11, 0x92, 0xD9, 0x23, 0x20, 0x2E, 0x89, 0xB4, 0x7C, 0xB8, 0x26, 0x77, 0x99, 0xE3, 0xA5,
+ 0x67, 0x4A, 0xED, 0xDE, 0xC5, 0x31, 0xFE, 0x18, 0x0D, 0x63, 0x8C, 0x80, 0xC0, 0xF7, 0x70, 0x07};
+
+local MIXTABLE = {
+ 0x02, 0x03, 0x01, 0x01,
+ 0x01, 0x02, 0x03, 0x01,
+ 0x01, 0x01, 0x02, 0x03,
+ 0x03, 0x01, 0x01, 0x02};
+
+local IMIXTABLE = {
+ 0x0E, 0x0B, 0x0D, 0x09,
+ 0x09, 0x0E, 0x0B, 0x0D,
+ 0x0D, 0x09, 0x0E, 0x0B,
+ 0x0B, 0x0D, 0x09, 0x0E};
+
+local RCON = {
+[0] = 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,
+0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39,
+0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,
+0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef,
+0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b,
+0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,
+0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,
+0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,
+0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,
+0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63,
+0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d};
+
+
+local GMUL = function(A, B)
+ if(A == 0x01) then return B; end
+ if(B == 0x01) then return A; end
+ if(A == 0x00) then return 0; end
+ if(B == 0x00) then return 0; end
+
+ local LA = LTABLE[A];
+ local LB = LTABLE[B];
+
+ local sum = LA + LB;
+ if (sum > 0xFF) then sum = sum - 0xFF; end
+
+ return ETABLE[sum];
+end
+
+local byteSub = Array.substitute;
+
+local shiftRow = Array.permute;
+
+local mixCol = function(i, mix)
+ local out = {};
+
+ local a, b, c, d;
+
+ a = GMUL(i[ 1], mix[ 1]);
+ b = GMUL(i[ 2], mix[ 2]);
+ c = GMUL(i[ 3], mix[ 3]);
+ d = GMUL(i[ 4], mix[ 4]);
+ out[ 1] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 1], mix[ 5]);
+ b = GMUL(i[ 2], mix[ 6]);
+ c = GMUL(i[ 3], mix[ 7]);
+ d = GMUL(i[ 4], mix[ 8]);
+ out[ 2] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 1], mix[ 9]);
+ b = GMUL(i[ 2], mix[10]);
+ c = GMUL(i[ 3], mix[11]);
+ d = GMUL(i[ 4], mix[12]);
+ out[ 3] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 1], mix[13]);
+ b = GMUL(i[ 2], mix[14]);
+ c = GMUL(i[ 3], mix[15]);
+ d = GMUL(i[ 4], mix[16]);
+ out[ 4] = XOR(XOR(a, b), XOR(c, d));
+
+
+ a = GMUL(i[ 5], mix[ 1]);
+ b = GMUL(i[ 6], mix[ 2]);
+ c = GMUL(i[ 7], mix[ 3]);
+ d = GMUL(i[ 8], mix[ 4]);
+ out[ 5] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 5], mix[ 5]);
+ b = GMUL(i[ 6], mix[ 6]);
+ c = GMUL(i[ 7], mix[ 7]);
+ d = GMUL(i[ 8], mix[ 8]);
+ out[ 6] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 5], mix[ 9]);
+ b = GMUL(i[ 6], mix[10]);
+ c = GMUL(i[ 7], mix[11]);
+ d = GMUL(i[ 8], mix[12]);
+ out[ 7] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 5], mix[13]);
+ b = GMUL(i[ 6], mix[14]);
+ c = GMUL(i[ 7], mix[15]);
+ d = GMUL(i[ 8], mix[16]);
+ out[ 8] = XOR(XOR(a, b), XOR(c, d));
+
+
+ a = GMUL(i[ 9], mix[ 1]);
+ b = GMUL(i[10], mix[ 2]);
+ c = GMUL(i[11], mix[ 3]);
+ d = GMUL(i[12], mix[ 4]);
+ out[ 9] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 9], mix[ 5]);
+ b = GMUL(i[10], mix[ 6]);
+ c = GMUL(i[11], mix[ 7]);
+ d = GMUL(i[12], mix[ 8]);
+ out[10] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 9], mix[ 9]);
+ b = GMUL(i[10], mix[10]);
+ c = GMUL(i[11], mix[11]);
+ d = GMUL(i[12], mix[12]);
+ out[11] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[ 9], mix[13]);
+ b = GMUL(i[10], mix[14]);
+ c = GMUL(i[11], mix[15]);
+ d = GMUL(i[12], mix[16]);
+ out[12] = XOR(XOR(a, b), XOR(c, d));
+
+
+ a = GMUL(i[13], mix[ 1]);
+ b = GMUL(i[14], mix[ 2]);
+ c = GMUL(i[15], mix[ 3]);
+ d = GMUL(i[16], mix[ 4]);
+ out[13] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[13], mix[ 5]);
+ b = GMUL(i[14], mix[ 6]);
+ c = GMUL(i[15], mix[ 7]);
+ d = GMUL(i[16], mix[ 8]);
+ out[14] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[13], mix[ 9]);
+ b = GMUL(i[14], mix[10]);
+ c = GMUL(i[15], mix[11]);
+ d = GMUL(i[16], mix[12]);
+ out[15] = XOR(XOR(a, b), XOR(c, d));
+ a = GMUL(i[13], mix[13]);
+ b = GMUL(i[14], mix[14]);
+ c = GMUL(i[15], mix[15]);
+ d = GMUL(i[16], mix[16]);
+ out[16] = XOR(XOR(a, b), XOR(c, d));
+
+ return out;
+end
+
+local keyRound = function(key, round)
+ local i = (round - 1) * 32;
+ local out = key;
+
+ out[33 + i] = XOR(key[ 1 + i], XOR(SBOX[key[30 + i]], RCON[round]));
+ out[34 + i] = XOR(key[ 2 + i], SBOX[key[31 + i]]);
+ out[35 + i] = XOR(key[ 3 + i], SBOX[key[32 + i]]);
+ out[36 + i] = XOR(key[ 4 + i], SBOX[key[29 + i]]);
+
+ out[37 + i] = XOR(out[33 + i], key[ 5 + i]);
+ out[38 + i] = XOR(out[34 + i], key[ 6 + i]);
+ out[39 + i] = XOR(out[35 + i], key[ 7 + i]);
+ out[40 + i] = XOR(out[36 + i], key[ 8 + i]);
+
+ out[41 + i] = XOR(out[37 + i], key[ 9 + i]);
+ out[42 + i] = XOR(out[38 + i], key[10 + i]);
+ out[43 + i] = XOR(out[39 + i], key[11 + i]);
+ out[44 + i] = XOR(out[40 + i], key[12 + i]);
+
+ out[45 + i] = XOR(out[41 + i], key[13 + i]);
+ out[46 + i] = XOR(out[42 + i], key[14 + i]);
+ out[47 + i] = XOR(out[43 + i], key[15 + i]);
+ out[48 + i] = XOR(out[44 + i], key[16 + i]);
+
+
+ out[49 + i] = XOR(SBOX[out[45 + i]], key[17 + i]);
+ out[50 + i] = XOR(SBOX[out[46 + i]], key[18 + i]);
+ out[51 + i] = XOR(SBOX[out[47 + i]], key[19 + i]);
+ out[52 + i] = XOR(SBOX[out[48 + i]], key[20 + i]);
+
+ out[53 + i] = XOR(out[49 + i], key[21 + i]);
+ out[54 + i] = XOR(out[50 + i], key[22 + i]);
+ out[55 + i] = XOR(out[51 + i], key[23 + i]);
+ out[56 + i] = XOR(out[52 + i], key[24 + i]);
+
+ out[57 + i] = XOR(out[53 + i], key[25 + i]);
+ out[58 + i] = XOR(out[54 + i], key[26 + i]);
+ out[59 + i] = XOR(out[55 + i], key[27 + i]);
+ out[60 + i] = XOR(out[56 + i], key[28 + i]);
+
+ out[61 + i] = XOR(out[57 + i], key[29 + i]);
+ out[62 + i] = XOR(out[58 + i], key[30 + i]);
+ out[63 + i] = XOR(out[59 + i], key[31 + i]);
+ out[64 + i] = XOR(out[60 + i], key[32 + i]);
+
+ return out;
+end
+
+local keyExpand = function(key)
+ local bytes = Array.copy(key);
+
+ for i = 1, 7 do
+ keyRound(bytes, i);
+ end
+
+ local keys = {};
+
+ keys[ 1] = Array.slice(bytes, 1, 16);
+ keys[ 2] = Array.slice(bytes, 17, 32);
+ keys[ 3] = Array.slice(bytes, 33, 48);
+ keys[ 4] = Array.slice(bytes, 49, 64);
+ keys[ 5] = Array.slice(bytes, 65, 80);
+ keys[ 6] = Array.slice(bytes, 81, 96);
+ keys[ 7] = Array.slice(bytes, 97, 112);
+ keys[ 8] = Array.slice(bytes, 113, 128);
+ keys[ 9] = Array.slice(bytes, 129, 144);
+ keys[10] = Array.slice(bytes, 145, 160);
+ keys[11] = Array.slice(bytes, 161, 176);
+ keys[12] = Array.slice(bytes, 177, 192);
+ keys[13] = Array.slice(bytes, 193, 208);
+ keys[14] = Array.slice(bytes, 209, 224);
+ keys[15] = Array.slice(bytes, 225, 240);
+
+ return keys;
+
+end
+
+local addKey = Array.XOR;
+
+
+
+local AES = {};
+
+AES.blockSize = 16;
+
+AES.encrypt = function(key, block)
+
+ local keySchedule = keyExpand(key);
+
+ --round 0
+ block = addKey(block, keySchedule[1]);
+
+ --round 1
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[2]);
+
+ --round 2
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[3]);
+
+ --round 3
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[4]);
+
+ --round 4
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[5]);
+
+ --round 5
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[6]);
+
+ --round 6
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[7]);
+
+ --round 7
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[8]);
+
+ --round 8
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[9]);
+
+ --round 9
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[10]);
+
+ --round 10
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[11]);
+
+ --round 11
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[12]);
+
+ --round 12
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[13]);
+
+ --round 13
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = mixCol(block, MIXTABLE);
+ block = addKey(block, keySchedule[14]);
+
+ --round 14
+ block = byteSub(block, SBOX);
+ block = shiftRow(block, ROW_SHIFT);
+ block = addKey(block, keySchedule[15]);
+
+ return block;
+
+end
+
+AES.decrypt = function(key, block)
+
+ local keySchedule = keyExpand(key);
+
+ --round 0
+ block = addKey(block, keySchedule[15]);
+
+ --round 1
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[14]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 2
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[13]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 3
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[12]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 4
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[11]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 5
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[10]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 6
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[9]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 7
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[8]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 8
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[7]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 9
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[6]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 10
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[5]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 11
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[4]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 12
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[3]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 13
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[2]);
+ block = mixCol(block, IMIXTABLE);
+
+ --round 14
+ block = shiftRow(block, IROW_SHIFT);
+ block = byteSub(block, ISBOX);
+ block = addKey(block, keySchedule[1]);
+
+ return block;
+end
+
+return AES;
\ No newline at end of file
diff --git a/module/lua/crypto/cipher/init.lua b/module/lua/crypto/cipher/init.lua
new file mode 100644
index 0000000..72e8e8a
--- /dev/null
+++ b/module/lua/crypto/cipher/init.lua
@@ -0,0 +1,14 @@
+local issac = require(".crypto.cipher.issac")
+local morus = require(".crypto.cipher.morus")
+local aes = require(".crypto.cipher.aes")
+local norx = require(".crypto.cipher.norx")
+
+local cipher = {
+ _version = "0.0.1",
+ issac = issac,
+ morus = morus,
+ aes = aes,
+ norx = norx
+};
+
+return cipher
\ No newline at end of file
diff --git a/module/lua/crypto/cipher/issac.lua b/module/lua/crypto/cipher/issac.lua
new file mode 100644
index 0000000..4ec39fc
--- /dev/null
+++ b/module/lua/crypto/cipher/issac.lua
@@ -0,0 +1,204 @@
+local Hex = require(".crypto.util.hex");
+
+-- External Results
+local randRsl = {};
+local randCnt = 0;
+
+-- Internal State
+local mm = {};
+local aa,bb,cc = 0,0,0;
+
+-- Cap to maintain 32 bit maths
+local cap = 0x100000000;
+
+-- CipherMode
+local ENCRYPT = 1;
+local DECRYPT = 2;
+
+local function isaac()
+ cc = ( cc + 1 ) % cap; -- cc just gets incremented once per 256 results
+ bb = ( bb + cc ) % cap; -- then combined with bb
+
+ for i = 0,255 do
+ local x = mm[i];
+ local y;
+ local imod = i % 4;
+ if imod == 0 then aa = aa ~ (aa << 13);
+ elseif imod == 1 then aa = aa ~ (aa >> 6);
+ elseif imod == 2 then aa = aa ~ (aa << 2);
+ elseif imod == 3 then aa = aa ~ (aa >> 16);
+ end
+ aa = ( mm[(i+128)%256] + aa ) % cap;
+ y = ( mm[(x>>2) % 256] + aa + bb ) % cap;
+ mm[i] = y;
+ bb = ( mm[(y>>10)%256] + x ) % cap;
+ randRsl[i] = bb;
+ end
+
+ randCnt = 0; -- Prepare to use the first set of results.
+
+end
+
+local function mix(a)
+ a[0] = ( a[0] ~ ( a[1] << 11 ) ) % cap; a[3] = ( a[3] + a[0] ) % cap; a[1] = ( a[1] + a[2] ) % cap;
+ a[1] = ( a[1] ~ ( a[2] >> 2 ) ) % cap; a[4] = ( a[4] + a[1] ) % cap; a[2] = ( a[2] + a[3] ) % cap;
+ a[2] = ( a[2] ~ ( a[3] << 8 ) ) % cap; a[5] = ( a[5] + a[2] ) % cap; a[3] = ( a[3] + a[4] ) % cap;
+ a[3] = ( a[3] ~ ( a[4] >> 16 ) ) % cap; a[6] = ( a[6] + a[3] ) % cap; a[4] = ( a[4] + a[5] ) % cap;
+ a[4] = ( a[4] ~ ( a[5] << 10 ) ) % cap; a[7] = ( a[7] + a[4] ) % cap; a[5] = ( a[5] + a[6] ) % cap;
+ a[5] = ( a[5] ~ ( a[6] >> 4 ) ) % cap; a[0] = ( a[0] + a[5] ) % cap; a[6] = ( a[6] + a[7] ) % cap;
+ a[6] = ( a[6] ~ ( a[7] << 8 ) ) % cap; a[1] = ( a[1] + a[6] ) % cap; a[7] = ( a[7] + a[0] ) % cap;
+ a[7] = ( a[7] ~ ( a[0] >> 9 ) ) % cap; a[2] = ( a[2] + a[7] ) % cap; a[0] = ( a[0] + a[1] ) % cap;
+end
+
+local function randInit(flag)
+
+ -- The golden ratio in 32 bit
+ -- math.floor((((math.sqrt(5)+1)/2)%1)*2^32) == 2654435769 == 0x9e3779b9
+ local a = { [0] = 0x9e3779b9, 0x9e3779b9, 0x9e3779b9, 0x9e3779b9, 0x9e3779b9, 0x9e3779b9, 0x9e3779b9, 0x9e3779b9, };
+
+ aa,bb,cc = 0,0,0;
+
+ for i = 1,4 do mix(a) end -- Scramble it.
+
+ for i = 0,255,8 do -- Fill in mm[] with messy stuff.
+ if flag then -- Use all the information in the seed.
+ for j = 0,7 do
+ a[j] = ( a[j] + randRsl[i+j] ) % cap;
+ end
+ end
+ mix(a);
+ for j = 0,7 do
+ mm[i+j] = a[j];
+ end
+ end
+
+ if flag then
+ -- Do a second pass to make all of the seed affect all of mm.
+ for i = 0,255,8 do
+ for j = 0,7 do
+ a[j] = ( a[j] + mm[i+j] ) % cap;
+ end
+ mix(a);
+ for j = 0,7 do
+ mm[i+j] = a[j];
+ end
+ end
+ end
+
+ isaac(); -- Fill in the first set of results.
+ randCnt = 0; -- Prepare to use the first set of results.
+
+end
+
+--- Seeds the ISAAC random number generator with the given seed.
+--- @param seed string - The seed to use for the random number generator.
+--- @param flag? boolean - Whether to use all the information in the seed. Defaults to true.
+local function seedIsaac(seed, flag)
+ local seedLength = #seed;
+ for i = 0,255 do mm[i] = 0; end
+ for i = 0,255 do randRsl[i] = seed:byte(i+1,i+1) or 0; end
+ randInit(flag);
+end
+
+--- Retrieves a random number from the ISAAC random number generator
+--- @return number: The random number
+local function getRandom()
+ local result = randRsl[randCnt];
+ randCnt = randCnt + 1;
+ if randCnt > 255 then
+ isaac();
+ randCnt = 0;
+ end
+ return result;
+end
+
+--- Get a random 32-bit value within the specified range.
+--- @param min? number (optional) - The minimum value of the range. Defaults to 0.
+--- @param max? number (optional) - The maximum value of the range. Defaults to 2^31-1.
+--- @param seed? string (optional) - The seed to use for the random number generator.
+--- @return number: The random 32-bit value within the specified range.
+local function random(min, max, seed)
+ local min = min or 0;
+ local max = max or 2^31-1;
+ if seed then
+ seedIsaac(seed, true);
+ else
+ seedIsaac(tostring(math.random(2^31-1)), false);
+ end
+ return (getRandom() % (max - min + 1)) + min;
+end
+
+
+--- Get a random character in printable ASCII range.
+--- @return number: The random character [32, 126].
+local function getRandomChar()
+ return getRandom() % 95 + 32;
+end
+
+-- Caesar-shift a character places: Generalized Vigenere
+local function caesar(m, ch, shift, modulo, start)
+ local n
+ local si = 1
+ if m == DECRYPT then shift = shift*-1 ; end
+ n = (ch - start) + shift;
+ if n < 0 then si,n = -1,n*-1 ; end
+ n = ( n % modulo ) * si;
+ if n < 0 then n = n + modulo ; end
+ return start + n;
+end
+
+--- Encrypts a message using the ISSAC cipher algorithm.
+--- @param msg string - The message to be encrypted.
+--- @param key string - The key used for encryption.
+--- @returns table - A table containing the encrypted message in bytes, string, and hex formats.
+local function encrypt(msg, key)
+ seedIsaac(key, true);
+ local msgLength = #msg;
+ local destination = {};
+
+ for i = 1, msgLength do
+ destination[i] = string.char(caesar(1, msg:byte(i, i), getRandomChar(), 95, 32));
+ end
+
+ local encrypted = destination
+
+ local public = {}
+ public.asBytes = function()
+ return encrypted
+ end
+
+ public.asString = function()
+ return table.concat(encrypted)
+ end
+
+ public.asHex = function()
+ return Hex.stringToHex(table.concat(encrypted))
+ end
+
+ return public
+end
+
+--- Decrypts an encrypted message using the ISSAC cipher algorithm.
+--- @param encrypted string - The encrypted message to be decrypted.
+--- @param key string - The key used for encryption.
+--- @returns string - The decrypted message.
+local function decrypt(encrypted, key)
+ seedIsaac(key, true);
+ local msgLength = #encrypted;
+ local destination = {};
+
+ for i = 1, msgLength do
+ destination[i] = string.char(caesar(2, encrypted:byte(i, i), getRandomChar(), 95, 32));
+ end
+
+ return table.concat(destination);
+end
+
+return {
+ seedIsaac = seedIsaac,
+ getRandomChar = getRandomChar,
+ random = random,
+ getRandom = getRandom,
+ encrypt = encrypt,
+ decrypt = decrypt
+}
\ No newline at end of file
diff --git a/module/lua/crypto/cipher/mode/cbc.lua b/module/lua/crypto/cipher/mode/cbc.lua
new file mode 100644
index 0000000..2879072
--- /dev/null
+++ b/module/lua/crypto/cipher/mode/cbc.lua
@@ -0,0 +1,171 @@
+local Array = require(".crypto.util.array");
+local Stream = require(".crypto.util.stream");
+local Queue = require(".crypto.util.queue");
+
+local CBC = {};
+
+CBC.Cipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+ local iv;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ iv = nil;
+ return public;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ if(iv == nil) then
+ iv = block;
+ else
+ local out = Array.XOR(iv, block);
+ out = blockCipher.encrypt(key, out);
+ Array.writeToQueue(outputQueue, out);
+ iv = out;
+ end
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+
+CBC.Decipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+ local iv;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ iv = nil;
+ return public;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ if(iv == nil) then
+ iv = block;
+ else
+ local out = block;
+ out = blockCipher.decrypt(key, out);
+ out = Array.XOR(iv, out);
+ Array.writeToQueue(outputQueue, out);
+ iv = block;
+ end
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+return CBC;
diff --git a/module/lua/crypto/cipher/mode/cfb.lua b/module/lua/crypto/cipher/mode/cfb.lua
new file mode 100644
index 0000000..331e915
--- /dev/null
+++ b/module/lua/crypto/cipher/mode/cfb.lua
@@ -0,0 +1,171 @@
+local Array = require(".crypto.util.array");
+local Stream = require(".crypto.util.stream");
+local Queue = require(".crypto.util.queue");
+
+local CFB = {};
+
+CFB.Cipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+ local iv;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ iv = nil;
+ return public;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ if(iv == nil) then
+ iv = block;
+ else
+ local out = iv;
+ out = blockCipher.encrypt(key, out);
+ out = Array.XOR(out, block);
+ Array.writeToQueue(outputQueue, out);
+ iv = out;
+ end
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+CFB.Decipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+ local iv;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ iv = nil;
+ return public;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ if(iv == nil) then
+ iv = block;
+ else
+ local out = iv;
+ out = blockCipher.encrypt(key, out);
+ out = Array.XOR(out, block);
+ Array.writeToQueue(outputQueue, out);
+ iv = block;
+ end
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+return CFB;
\ No newline at end of file
diff --git a/module/lua/crypto/cipher/mode/ctr.lua b/module/lua/crypto/cipher/mode/ctr.lua
new file mode 100644
index 0000000..e999bce
--- /dev/null
+++ b/module/lua/crypto/cipher/mode/ctr.lua
@@ -0,0 +1,252 @@
+local Array = require(".crypto.util.array");
+local Stream = require(".crypto.util.stream");
+local Queue = require(".crypto.util.queue");
+
+local Bit = require(".crypto.util.bit");
+
+local AND = Bit.band;
+
+local CTR = {};
+
+CTR.Cipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+ local iv;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ iv = nil;
+ return public;
+ end
+
+ local updateIV = function()
+ iv[16] = iv[16] + 1;
+ if iv[16] <= 0xFF then return; end
+ iv[16] = AND(iv[16], 0xFF);
+
+ iv[15] = iv[15] + 1;
+ if iv[15] <= 0xFF then return; end
+ iv[15] = AND(iv[15], 0xFF);
+
+ iv[14] = iv[14] + 1;
+ if iv[14] <= 0xFF then return; end
+ iv[14] = AND(iv[14], 0xFF);
+
+ iv[13] = iv[13] + 1;
+ if iv[13] <= 0xFF then return; end
+ iv[13] = AND(iv[13], 0xFF);
+
+ iv[12] = iv[12] + 1;
+ if iv[12] <= 0xFF then return; end
+ iv[12] = AND(iv[12], 0xFF);
+
+ iv[11] = iv[11] + 1;
+ if iv[11] <= 0xFF then return; end
+ iv[11] = AND(iv[11], 0xFF);
+
+ iv[10] = iv[10] + 1;
+ if iv[10] <= 0xFF then return; end
+ iv[10] = AND(iv[10], 0xFF);
+
+ iv[9] = iv[9] + 1;
+ if iv[9] <= 0xFF then return; end
+ iv[9] = AND(iv[9], 0xFF);
+
+ return;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ if(iv == nil) then
+ iv = block;
+ else
+ local out = iv;
+ out = blockCipher.encrypt(key, out);
+
+ out = Array.XOR(out, block);
+ Array.writeToQueue(outputQueue, out);
+ updateIV();
+ end
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+
+CTR.Decipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+ local iv;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ iv = nil;
+ return public;
+ end
+
+ local updateIV = function()
+ iv[16] = iv[16] + 1;
+ if iv[16] <= 0xFF then return; end
+ iv[16] = AND(iv[16], 0xFF);
+
+ iv[15] = iv[15] + 1;
+ if iv[15] <= 0xFF then return; end
+ iv[15] = AND(iv[15], 0xFF);
+
+ iv[14] = iv[14] + 1;
+ if iv[14] <= 0xFF then return; end
+ iv[14] = AND(iv[14], 0xFF);
+
+ iv[13] = iv[13] + 1;
+ if iv[13] <= 0xFF then return; end
+ iv[13] = AND(iv[13], 0xFF);
+
+ iv[12] = iv[12] + 1;
+ if iv[12] <= 0xFF then return; end
+ iv[12] = AND(iv[12], 0xFF);
+
+ iv[11] = iv[11] + 1;
+ if iv[11] <= 0xFF then return; end
+ iv[11] = AND(iv[11], 0xFF);
+
+ iv[10] = iv[10] + 1;
+ if iv[10] <= 0xFF then return; end
+ iv[10] = AND(iv[10], 0xFF);
+
+ iv[9] = iv[9] + 1;
+ if iv[9] <= 0xFF then return; end
+ iv[9] = AND(iv[9], 0xFF);
+
+ return;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ if(iv == nil) then
+ iv = block;
+ else
+ local out = iv;
+ out = blockCipher.encrypt(key, out);
+
+ out = Array.XOR(out, block);
+ Array.writeToQueue(outputQueue, out);
+ updateIV();
+ end
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+return CTR;
diff --git a/module/lua/crypto/cipher/mode/ecb.lua b/module/lua/crypto/cipher/mode/ecb.lua
new file mode 100644
index 0000000..d0f8618
--- /dev/null
+++ b/module/lua/crypto/cipher/mode/ecb.lua
@@ -0,0 +1,156 @@
+local Array = require(".crypto.util.array");
+local Stream = require(".crypto.util.stream");
+local Queue = require(".crypto.util.queue");
+
+local ECB = {};
+
+ECB.Cipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ return public;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ block = blockCipher.encrypt(key, block);
+
+ Array.writeToQueue(outputQueue, block);
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+ECB.Decipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ return public;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ block = blockCipher.decrypt(key, block);
+
+ Array.writeToQueue(outputQueue, block);
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+
+return ECB;
\ No newline at end of file
diff --git a/module/lua/crypto/cipher/mode/ofb.lua b/module/lua/crypto/cipher/mode/ofb.lua
new file mode 100644
index 0000000..adaaed1
--- /dev/null
+++ b/module/lua/crypto/cipher/mode/ofb.lua
@@ -0,0 +1,172 @@
+local Array = require(".crypto.util.array");
+local Stream = require(".crypto.util.stream");
+local Queue = require(".crypto.util.queue");
+
+local OFB = {};
+
+OFB.Cipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+ local iv;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ iv = nil;
+ return public;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ if(iv == nil) then
+ iv = block;
+ else
+ local out = iv;
+ out = blockCipher.encrypt(key, out);
+ iv = out;
+ out = Array.XOR(out, block);
+ Array.writeToQueue(outputQueue, out);
+ end
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+OFB.Decipher = function()
+
+ local public = {};
+
+ local key;
+ local blockCipher;
+ local padding;
+ local inputQueue;
+ local outputQueue;
+ local iv;
+
+ public.setKey = function(keyBytes)
+ key = keyBytes;
+ return public;
+ end
+
+ public.setBlockCipher = function(cipher)
+ blockCipher = cipher;
+ return public;
+ end
+
+ public.setPadding = function(paddingMode)
+ padding = paddingMode;
+ return public;
+ end
+
+ public.init = function()
+ inputQueue = Queue();
+ outputQueue = Queue();
+ iv = nil;
+ return public;
+ end
+
+ public.update = function(messageStream)
+ local byte = messageStream();
+ while (byte ~= nil) do
+ inputQueue.push(byte);
+ if(inputQueue.size() >= blockCipher.blockSize) then
+ local block = Array.readFromQueue(inputQueue, blockCipher.blockSize);
+
+ if(iv == nil) then
+ iv = block;
+ else
+ local out = iv;
+ out = blockCipher.encrypt(key, out);
+ iv = out;
+ out = Array.XOR(out, block);
+ Array.writeToQueue(outputQueue, out);
+ end
+ end
+ byte = messageStream();
+ end
+ return public;
+ end
+
+ public.finish = function()
+ local paddingStream = padding(blockCipher.blockSize, inputQueue.getHead());
+ public.update(paddingStream);
+
+ return public;
+ end
+
+ public.getOutputQueue = function()
+ return outputQueue;
+ end
+
+ public.asHex = function()
+ return Stream.toHex(outputQueue.pop);
+ end
+
+ public.asBytes = function()
+ return Stream.toArray(outputQueue.pop);
+ end
+
+ public.asString = function()
+ return Stream.toString(outputQueue.pop);
+ end
+
+ return public;
+
+end
+
+
+return OFB;
\ No newline at end of file
diff --git a/module/lua/crypto/cipher/morus.lua b/module/lua/crypto/cipher/morus.lua
new file mode 100644
index 0000000..1263337
--- /dev/null
+++ b/module/lua/crypto/cipher/morus.lua
@@ -0,0 +1,398 @@
+local Hex = require(".crypto.util.hex");
+
+local function state_update(s, m0, m1, m2, m3)
+ local s00, s01, s02, s03 = s[1], s[2], s[3], s[4]
+ local s10, s11, s12, s13 = s[5], s[6], s[7], s[8]
+ local s20, s21, s22, s23 = s[9], s[10], s[11], s[12]
+ local s30, s31, s32, s33 = s[13], s[14], s[15], s[16]
+ local s40, s41, s42, s43 = s[17], s[18], s[19], s[20]
+ local temp
+
+ s00 = s00 ~ s30
+ s01 = s01 ~ s31
+ s02 = s02 ~ s32
+ s03 = s03 ~ s33
+
+ temp = s33
+ s33 = s32
+ s32 = s31
+ s31 = s30
+ s30 = temp
+
+ s00 = s00 ~ s10 & s20
+ s01 = s01 ~ s11 & s21
+ s02 = s02 ~ s12 & s22
+ s03 = s03 ~ s13 & s23
+
+ s00 = (s00 << 13) | (s00 >> (64-13)) --n1
+ s01 = (s01 << 13) | (s01 >> (64-13)) --n1
+ s02 = (s02 << 13) | (s02 >> (64-13)) --n1
+ s03 = (s03 << 13) | (s03 >> (64-13)) --n1
+
+
+ s10 = s10 ~ m0
+ s11 = s11 ~ m1
+ s12 = s12 ~ m2
+ s13 = s13 ~ m3
+
+ s10 = s10 ~ s40
+ s11 = s11 ~ s41
+ s12 = s12 ~ s42
+ s13 = s13 ~ s43
+
+ temp = s43
+ s43 = s41
+ s41 = temp
+
+ temp = s42
+ s42 = s40
+ s40 = temp
+
+ s10 = s10 ~ (s20 & s30)
+ s11 = s11 ~ (s21 & s31)
+ s12 = s12 ~ (s22 & s32)
+ s13 = s13 ~ (s23 & s33)
+
+ s10 = (s10 << 46) | (s10 >> (64-46)) --n2
+ s11 = (s11 << 46) | (s11 >> (64-46)) --n2
+ s12 = (s12 << 46) | (s12 >> (64-46)) --n2
+ s13 = (s13 << 46) | (s13 >> (64-46)) --n2
+
+
+ s20 = s20 ~ m0
+ s21 = s21 ~ m1
+ s22 = s22 ~ m2
+ s23 = s23 ~ m3
+
+ s20 = s20 ~ s00
+ s21 = s21 ~ s01
+ s22 = s22 ~ s02
+ s23 = s23 ~ s03
+
+ temp = s00
+ s00 = s01
+ s01 = s02
+ s02 = s03
+ s03 = temp
+
+ s20 = s20 ~ s30 & s40
+ s21 = s21 ~ s31 & s41
+ s22 = s22 ~ s32 & s42
+ s23 = s23 ~ s33 & s43
+
+ s20 = (s20 << 38) | (s20 >> (64-38)) --n3
+ s21 = (s21 << 38) | (s21 >> (64-38)) --n3
+ s22 = (s22 << 38) | (s22 >> (64-38)) --n3
+ s23 = (s23 << 38) | (s23 >> (64-38)) --n3
+
+
+ s30 = s30 ~ m0
+ s31 = s31 ~ m1
+ s32 = s32 ~ m2
+ s33 = s33 ~ m3
+
+ s30 = s30 ~ s10
+ s31 = s31 ~ s11
+ s32 = s32 ~ s12
+ s33 = s33 ~ s13
+
+ temp = s13
+ s13 = s11
+ s11 = temp
+
+ temp = s12
+ s12 = s10
+ s10 = temp
+
+ s30 = s30 ~ s40 & s00
+ s31 = s31 ~ s41 & s01
+ s32 = s32 ~ s42 & s02
+ s33 = s33 ~ s43 & s03
+
+ s30 = (s30 << 7) | (s30 >> (64-7)) --n4
+ s31 = (s31 << 7) | (s31 >> (64-7)) --n4
+ s32 = (s32 << 7) | (s32 >> (64-7)) --n4
+ s33 = (s33 << 7) | (s33 >> (64-7)) --n4
+
+
+ s40 = s40 ~ m0
+ s41 = s41 ~ m1
+ s42 = s42 ~ m2
+ s43 = s43 ~ m3
+
+ s40 = s40 ~ s20
+ s41 = s41 ~ s21
+ s42 = s42 ~ s22
+ s43 = s43 ~ s23
+
+ temp = s23
+ s23 = s22
+ s22 = s21
+ s21 = s20
+ s20 = temp
+
+ s40 = s40 ~ s00 & s10
+ s41 = s41 ~ s01 & s11
+ s42 = s42 ~ s02 & s12
+ s43 = s43 ~ s03 & s13
+
+ s40 = (s40 << 4) | (s40 >> (64-4)) --n5
+ s41 = (s41 << 4) | (s41 >> (64-4)) --n5
+ s42 = (s42 << 4) | (s42 >> (64-4)) --n5
+ s43 = (s43 << 4) | (s43 >> (64-4)) --n5
+
+ -- update the state array
+ s[1], s[2], s[3], s[4] = s00, s01, s02, s03
+ s[5], s[6], s[7], s[8] = s10, s11, s12, s13
+ s[9], s[10], s[11], s[12] = s20, s21, s22, s23
+ s[13], s[14], s[15], s[16] = s30, s31, s32, s33
+ s[17], s[18], s[19], s[20] = s40, s41, s42, s43
+
+end--state_update()
+
+local function enc_aut_step(s, m0, m1, m2, m3)
+ -- m0 s00 s11 s20 s30
+ local c0 = m0 ~ s[1] ~ s[6] ~ (s[9] & s[13])
+ -- m1 s01 s12 s21 s31
+ local c1 = m1 ~ s[2] ~ s[7] ~ (s[10] & s[14])
+ -- m2 s02 s13 s22 s32
+ local c2 = m2 ~ s[3] ~ s[8] ~ (s[11] & s[15])
+ -- m3 s03 s10 s23 s33
+ local c3 = m3 ~ s[4] ~ s[5] ~ (s[12] & s[16])
+ state_update(s, m0, m1, m2, m3)
+ return c0, c1, c2, c3
+end
+
+local function dec_aut_step(s, c0, c1, c2, c3, blen)
+ -- mlen is the length of a last partial block
+ -- mlen is absent/nil for full blocks
+ -- return the decrypted block
+ --
+ -- m0 s00 s11 s20 s30
+ local m0 = c0 ~ s[1] ~ s[6] ~ (s[9] & s[13])
+ -- m1 s01 s12 s21 s31
+ local m1 = c1 ~ s[2] ~ s[7] ~ (s[10] & s[14])
+ -- m2 s02 s13 s22 s32
+ local m2 = c2 ~ s[3] ~ s[8] ~ (s[11] & s[15])
+ -- m3 s03 s10 s23 s33
+ local m3 = c3 ~ s[4] ~ s[5] ~ (s[12] & s[16])
+ if blen then
+ -- partial block => must adjust (m0, ...) before
+ -- updating the state
+ local mblk = string.pack(" 0 then ad = e:sub(1, adlen) end
+ local i = 1
+ while i <= adlen - 31 do --process full blocks
+ m0, m1, m2, m3 = string.unpack("> n) | (x << (64-n)) --INLINED
+ --
+ A = (A ~ B) ~ ((A & B) << 1) -- H(A, B);
+ D = D ~ A; D = (D >> 8) | (D << (56)) --ROTR64(D, 8) --R0
+ C = (C ~ D) ~ ((C & D) << 1) -- H(C, D);
+ B = B ~ C; B = (B >> 19) | (B << (45)) --ROTR64(B, 19) --R1
+ A = (A ~ B) ~ ((A & B) << 1) -- H(A, B);
+ D = D ~ A; D = (D >> 40) | (D << (24)) --ROTR64(D, 40) --R2
+ C = (C ~ D) ~ ((C & D) << 1) -- H(C, D);
+ B = B ~ C; B = (B >> 63) | (B << (1)) --ROTR64(B, 63) --R3
+ s[a], s[b], s[c], s[d] = A, B, C, D
+end
+
+local function F(s)
+ -- The full round. s is the state: u64[16]
+ --
+ -- beware! in Lua, arrays are 1-based indexed, not 0-indexed as in C
+ -- Column step
+ G(s, 1, 5, 9, 13);
+ G(s, 2, 6, 10, 14);
+ G(s, 3, 7, 11, 15);
+ G(s, 4, 8, 12, 16);
+ -- Diagonal step
+ G(s, 1, 6, 11, 16);
+ G(s, 2, 7, 12, 13);
+ G(s, 3, 8, 9, 14);
+ G(s, 4, 5, 10, 15);
+end
+
+local function permute(s)
+ -- the core permutation (four rounds)
+ for _ = 1, 4 do F(s) end
+end
+
+local function pad(ins)
+ -- pad string ins to length 96 ("BYTES(NORX_R)")
+ local out
+ local inslen = #ins
+ if inslen == 95 then return ins .. '\x81' end -- last byte is 0x01 | 0x80
+ -- here inslen is < 95, so must pad with 96-(inslen+2) zeros
+ out = ins .. '\x01' .. string.rep('\0', 94-inslen) .. '\x80'
+ assert(#out == 96)
+ return out
+end
+
+local function absorb_block(s, ins, ini, tag)
+ -- the input string is the substring of 'ins' starting at position 'ini'
+ -- (we cannot use a char* as in C!)
+ s[16] = s[16] ~ tag
+ permute(s)
+ for i = 1, 12 do
+ s[i] = s[i] ~ string.unpack(" 0 then
+ while inlen >= 96 do
+ absorb_block(s, ins, i, tag)
+ inlen = inlen - 96
+ i = i + 96
+ end
+ absorb_lastblock(s, ins:sub(i), tag)
+ end--if
+end
+
+local function encrypt_data(s, out_table, ins)
+ local inlen = #ins
+ local i = 1
+ if inlen > 0 then
+ while inlen >= 96 do
+ encrypt_block(s, out_table, ins, i)
+ inlen = inlen - 96
+ i = i + 96
+ end
+ encrypt_lastblock(s, out_table, ins:sub(i))
+ end
+end
+
+local function decrypt_data(s, out_table, ins)
+ local inlen = #ins
+ local i = 1
+ if inlen > 0 then
+ while inlen >= 96 do
+ decrypt_block(s, out_table, ins, i)
+ inlen = inlen - 96
+ i = i + 96
+ end
+ decrypt_lastblock(s, out_table, ins:sub(i))
+ end
+end
+
+local function finalize(s, k)
+ -- return the authentication tag (32-byte string)
+ --
+ s[16] = s[16] ~ FINAL_TAG
+ permute(s)
+ --
+ local k1, k2, k3, k4 = string.unpack("= 32)
+ local out_table = {}
+ local state = init(key, nonce)
+ absorb_data(state, header, HEADER_TAG)
+ local ctag = crypted:sub(#crypted - 32 + 1)
+ local c = crypted:sub(1, #crypted - 32)
+ decrypt_data(state, out_table, c)
+ absorb_data(state, trailer, TRAILER_TAG)
+ local tag = finalize(state, key)
+ if not verify_tag(tag, ctag) then return nil, "auth failure" end
+ local plain = table.concat(out_table)
+ return plain
+end
+
+return {
+ encrypt = aead_encrypt,
+ decrypt = aead_decrypt,
+ --
+ key_size = 32,
+ nonce_size = 32,
+ variant = "NORX 64-4-1",
+}
diff --git a/module/lua/crypto/digest/blake2b.lua b/module/lua/crypto/digest/blake2b.lua
new file mode 100644
index 0000000..0b68940
--- /dev/null
+++ b/module/lua/crypto/digest/blake2b.lua
@@ -0,0 +1,190 @@
+local Hex = require(".crypto.util.hex");
+
+
+local function ROTR64(x, n)
+ return (x >> n) | (x << (64-n))
+end
+
+-- G Mixing function.
+
+local function G(v, a, b, c, d, x, y)
+ v[a] = v[a] + v[b] + x
+ v[d] = ROTR64(v[d] ~ v[a], 32)
+ v[c] = v[c] + v[d]
+ v[b] = ROTR64(v[b] ~ v[c], 24)
+ v[a] = v[a] + v[b] + y
+ v[d] = ROTR64(v[d] ~ v[a], 16)
+ v[c] = v[c] + v[d]
+ v[b] = ROTR64(v[b] ~ v[c], 63)
+end
+
+-- Initialization Vector.
+local iv = {
+ 0x6a09e667f3bcc908, 0xbb67ae8584caa73b,
+ 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
+ 0x510e527fade682d1, 0x9b05688c2b3e6c1f,
+ 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
+}
+
+local sigma = {
+ -- array index start at 1 in Lua,
+ -- => all the permutation values are incremented by one
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
+ { 15, 11, 5, 9, 10, 16, 14, 7, 2, 13, 1, 3, 12, 8, 6, 4 },
+ { 12, 9, 13, 1, 6, 3, 16, 14, 11, 15, 4, 7, 8, 2, 10, 5 },
+ { 8, 10, 4, 2, 14, 13, 12, 15, 3, 7, 6, 11, 5, 1, 16, 9 },
+ { 10, 1, 6, 8, 3, 5, 11, 16, 15, 2, 12, 13, 7, 9, 4, 14 },
+ { 3, 13, 7, 11, 1, 12, 9, 4, 5, 14, 8, 6, 16, 15, 2, 10 },
+ { 13, 6, 2, 16, 15, 14, 5, 11, 1, 8, 7, 4, 10, 3, 9, 12 },
+ { 14, 12, 8, 15, 13, 2, 4, 10, 6, 1, 16, 5, 9, 7, 3, 11 },
+ { 7, 16, 15, 10, 12, 4, 1, 9, 13, 3, 14, 8, 2, 5, 11, 6 },
+ { 11, 3, 9, 5, 8, 7, 2, 6, 16, 12, 10, 15, 4, 13, 14, 1 },
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 },
+ { 15, 11, 5, 9, 10, 16, 14, 7, 2, 13, 1, 3, 12, 8, 6, 4 }
+}
+
+
+local function compress(ctx, last)
+ -- Compression function. "last" flag indicates last block.
+ local v, m = {}, {} -- both v and m are u64[16]
+ for i = 1, 8 do
+ v[i] = ctx.h[i]
+ v[i+8] = iv[i]
+ end
+ v[13] = v[13] ~ ctx.t[1] -- low 64 bits of offset
+ v[14] = v[14] ~ ctx.t[2] -- high 64 bits
+ if last then v[15] = ~v[15] end
+ for i = 0, 15 do -- get little-endian words
+ m[i+1] = string.unpack(" 64 or (key and #key > 64) then
+ return nil, "illegal parameters"
+ end
+ local ctx = {h={}, t={}, c=1, outlen=outlen} -- the blake2 context
+ -- note: ctx.c is the index of 1st byte free in input buffer (ctx.b)
+ -- it is not used in this implementation
+ for i = 1, 8 do ctx.h[i] = iv[i] end -- state, "param block"
+ ctx.h[1] = ctx.h[1] ~ 0x01010000 ~ (keylen << 8) ~ outlen
+ ctx.t[1] = 0 --input count low word
+ ctx.t[2] = 0 --input count high word
+ -- zero input block
+ ctx.b = ""
+ if keylen > 0 then
+ update(ctx, key)
+ -- ctx.c = 128 -- pad b with zero bytes
+ ctx.b = ctx.b .. string.rep('\0', 128 - #ctx.b)
+ assert(#ctx.b == 128)
+ end
+ return ctx
+end
+
+update = function(ctx, data)
+ -- buffer mgt cannot be done the C way..
+ local bln, rln, iln
+ local i = 1 -- index of 1st byte to process in data
+ while true do
+ bln = #ctx.b -- current number of bytes in the input buffer
+ assert(bln <= 128)
+ if bln == 128 then --ctx.b is full; process it.
+ -- add counters
+ ctx.t[1] = ctx.t[1] + 128
+ -- warning: this is a signed 64bit addition
+ -- here it is assumed that the total input is less
+ -- than 2^63 bytes (this should be enough for a
+ -- pure Lua implementation!) => ctx.t[1] overflow is ignored.
+ compress(ctx, false) -- false means not last
+ ctx.b = "" -- empty buffer
+ else -- ctx.b is not full; append more bytes from data
+ rln = 128 - bln -- remaining space (in bytes) in ctx.b
+ iln = #data - i + 1 -- number of bytes yet to process in data
+ if iln < rln then
+ ctx.b = ctx.b .. data:sub(i, i + iln -1)
+ -- here, all data bytes have been processed or put in
+ -- buffer and buffer is not full. we are done.
+ break
+ else
+ ctx.b = ctx.b .. data:sub(i, i + rln -1)
+ i = i + rln
+ end
+ end
+ end
+end
+
+local function final(ctx)
+ -- finalize the hash and return the digest as a string
+ --
+ local bln = #ctx.b
+ -- add number of remaining bytes in buffer (ignore carry overflow)
+ ctx.t[1] = ctx.t[1] + bln
+ -- pad the buffer with zero bytes
+ local rln = 128 - bln -- remaining space (in bytes) in ctx.b
+ ctx.b = ctx.b .. string.rep('\0', rln)
+ compress(ctx, true) -- true means final block
+ -- extract the digest (outlen bytes long)
+ local outtbl = {}
+ for i = 0, ctx.outlen - 1 do
+ outtbl[i+1] = string.char(
+ (ctx.h[(i >> 3) + 1] >> (8 * (i & 7))) & 0xff)
+ end
+ local dig = table.concat(outtbl)
+ return outtbl
+end
+
+--- Calculates the BLAKE2b hash of the given data.
+--- @param data string - The input data to be hashed.
+--- @param outlen? number (optional) - The desired length of the hash output. Defaults to 64.
+--- @param key? string (optional) - The key to be used for the hash calculation. Defaults to an empty string.
+--- @returns table - A table containing the hash in bytes, string, and hex formats.
+local function black2b(data, outlen, key)
+ local ctx, msg = init(outlen, key)
+ if not ctx then return ctx, msg end
+ update(ctx, data)
+ local bytes = final(ctx)
+ local hash = table.concat(bytes)
+
+ local public = {}
+
+ public.asBytes = function()
+ return bytes
+ end
+
+ public.asString = function()
+ return hash
+ end
+
+ public.asHex = function()
+ return Hex.stringToHex(hash)
+ end
+
+ return public
+end
+
+return black2b
diff --git a/module/lua/crypto/digest/init.lua b/module/lua/crypto/digest/init.lua
new file mode 100644
index 0000000..0646c29
--- /dev/null
+++ b/module/lua/crypto/digest/init.lua
@@ -0,0 +1,29 @@
+local MD2 = require(".crypto.digest.md2")
+local MD4 = require(".crypto.digest.md4")
+local MD5 = require(".crypto.digest.md5")
+local SHA1 = require(".crypto.digest.sha1")
+local SHA2_256 = require(".crypto.digest.sha2_256")
+local SHA2_512 = require(".crypto.digest.sha2_512")
+local SHA3 = require(".crypto.digest.sha3")
+local Blake2b = require(".crypto.digest.blake2b")
+
+
+local digest = {
+ _version = "0.0.1",
+ md2 = MD2,
+ md4 = MD4,
+ md5 = MD5,
+ sha1 = SHA1.sha1,
+ sha2_256 = SHA2_256.sha2_256,
+ sha2_512 = SHA2_512,
+ sha3_256 = SHA3.sha3_256,
+ sha3_512 = SHA3.sha3_512,
+ keccak256 = SHA3.keccak256,
+ keccak512 = SHA3.keccak512,
+ blake2b = Blake2b
+}
+
+
+
+
+return digest
diff --git a/module/lua/crypto/digest/md2.lua b/module/lua/crypto/digest/md2.lua
new file mode 100644
index 0000000..87fede0
--- /dev/null
+++ b/module/lua/crypto/digest/md2.lua
@@ -0,0 +1,112 @@
+local Bit = require(".crypto.util.bit");
+local Queue = require(".crypto.util.queue");
+
+local SUBST = {
+ 0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36, 0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13,
+ 0x62, 0xA7, 0x05, 0xF3, 0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C, 0x82, 0xCA,
+ 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16, 0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12,
+ 0xBE, 0x4E, 0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E, 0xBB, 0x2F, 0xEE, 0x7A,
+ 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2, 0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,
+ 0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E, 0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03,
+ 0xFF, 0x19, 0x30, 0xB3, 0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56, 0xAA, 0xC6,
+ 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6, 0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1,
+ 0x45, 0x9D, 0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65, 0xE6, 0x2D, 0xA8, 0x02,
+ 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0, 0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,
+ 0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C, 0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26,
+ 0x2C, 0x53, 0x0D, 0x6E, 0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81, 0x4D, 0x52,
+ 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA, 0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A,
+ 0x78, 0x88, 0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE, 0x3B, 0x00, 0x1D, 0x39,
+ 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58, 0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,
+ 0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99, 0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14 };
+
+local XOR = Bit.bxor;
+
+local MD2 = function(stream)
+ local queue = Queue();
+ local public = {}
+
+ local X = {};
+ for i = 0, 47 do
+ X[i] = 0x00;
+ end
+
+ local C = {};
+ for i = 0, 15 do
+ C[i] = 0x00;
+ end
+
+ local processBlock = function()
+ local block = {};
+
+ for i = 0, 15 do
+ block[i] = queue.pop();
+ end
+
+ for i = 0, 15 do
+ X[i + 16] = block[i];
+ X[i + 32] = XOR(X[i], block[i]); --mix
+ end
+
+ local t;
+
+ --update block
+ t = 0;
+ for i = 0, 17 do
+ for j = 0, 47 do
+ X[j] = XOR(X[j], SUBST[t + 1]);
+ t = X[j];
+ end
+ t = (t + i) % 256;
+ end
+
+ --update checksum
+ t = C[15];
+ for i = 0, 15 do
+ C[i] = XOR(C[i], SUBST[XOR(block[i], t) + 1]);
+ t = C[i];
+ end
+
+ end
+
+ for b in stream do
+ queue.push(b);
+ if(queue.size() >= 16) then processBlock(); end
+ end
+
+ local i = 16 - queue.size();
+
+ while queue.size() < 16 do
+ queue.push(i);
+ end
+
+ processBlock();
+
+ queue.push(C[ 0]); queue.push(C[ 1]); queue.push(C[ 2]); queue.push(C[ 3]);
+ queue.push(C[ 4]); queue.push(C[ 5]); queue.push(C[ 6]); queue.push(C[ 7]);
+ queue.push(C[ 8]); queue.push(C[ 9]); queue.push(C[10]); queue.push(C[11]);
+ queue.push(C[12]); queue.push(C[13]); queue.push(C[14]); queue.push(C[15]);
+
+ processBlock();
+
+ public.asBytes = function()
+ return {X[ 0], X[ 1], X[ 2], X[ 3], X[ 4], X[ 5], X[ 6], X[ 7],
+ X[ 8], X[ 9], X[10], X[11], X[12], X[13], X[14], X[15]};
+ end
+
+ public.asHex = function()
+ return string.format("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ X[ 0], X[ 1], X[ 2], X[ 3], X[ 4], X[ 5], X[ 6], X[ 7],
+ X[ 8], X[ 9], X[10], X[11], X[12], X[13], X[14], X[15]);
+ end
+
+ public.asString = function()
+ return string.pack(string.rep('B', 16),
+ X[ 0], X[ 1], X[ 2], X[ 3], X[ 4], X[ 5], X[ 6], X[ 7],
+ X[ 8], X[ 9], X[10], X[11], X[12], X[13], X[14], X[15]);
+ end
+
+ return public;
+
+end
+
+return MD2;
\ No newline at end of file
diff --git a/module/lua/crypto/digest/md4.lua b/module/lua/crypto/digest/md4.lua
new file mode 100644
index 0000000..eee89a7
--- /dev/null
+++ b/module/lua/crypto/digest/md4.lua
@@ -0,0 +1,193 @@
+local Bit = require(".crypto.util.bit");
+local Queue = require(".crypto.util.queue");
+
+local AND = Bit.band;
+local OR = Bit.bor;
+local NOT = Bit.bnot;
+local XOR = Bit.bxor;
+local LROT = Bit.lrotate;
+local LSHIFT = Bit.lshift;
+local RSHIFT = Bit.rshift;
+
+--MD4 is little-endian
+local bytes2word = function(b0, b1, b2, b3)
+ local i = b3; i = LSHIFT(i, 8);
+ i = OR(i, b2); i = LSHIFT(i, 8);
+ i = OR(i, b1); i = LSHIFT(i, 8);
+ i = OR(i, b0);
+ return i;
+end
+
+local word2bytes = function(word)
+ local b0, b1, b2, b3;
+ b0 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b1 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b2 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b3 = AND(word, 0xFF);
+ return b0, b1, b2, b3;
+end
+
+local dword2bytes = function(i)
+ local b4, b5, b6, b7 = word2bytes(math.floor(i / 0x100000000));
+ local b0, b1, b2, b3 = word2bytes(i);
+ return b0, b1, b2, b3, b4, b5, b6, b7;
+end
+
+local F = function(x, y, z) return OR(AND(x, y), AND(NOT(x), z)); end
+local G = function(x, y, z) return OR(AND(x, y), OR(AND(x, z), AND(y, z))); end
+local H = function(x, y, z) return XOR(x, XOR(y, z)); end
+
+
+local MD4 = function(stream)
+
+ local queue = Queue();
+
+ local A = 0x67452301;
+ local B = 0xefcdab89;
+ local C = 0x98badcfe;
+ local D = 0x10325476;
+ local public = {};
+
+ local processBlock = function()
+ local a = A;
+ local b = B;
+ local c = C;
+ local d = D;
+
+ local X = {};
+
+ for i = 0, 15 do
+ X[i] = bytes2word(queue.pop(), queue.pop(), queue.pop(), queue.pop());
+ end
+
+ a = LROT(a + F(b, c, d) + X[0], 3);
+ d = LROT(d + F(a, b, c) + X[1], 7);
+ c = LROT(c + F(d, a, b) + X[2], 11);
+ b = LROT(b + F(c, d, a) + X[3], 19);
+
+ a = LROT(a + F(b, c, d) + X[4], 3);
+ d = LROT(d + F(a, b, c) + X[5], 7);
+ c = LROT(c + F(d, a, b) + X[6], 11);
+ b = LROT(b + F(c, d, a) + X[7], 19);
+
+ a = LROT(a + F(b, c, d) + X[8], 3);
+ d = LROT(d + F(a, b, c) + X[9], 7);
+ c = LROT(c + F(d, a, b) + X[10], 11);
+ b = LROT(b + F(c, d, a) + X[11], 19);
+
+ a = LROT(a + F(b, c, d) + X[12], 3);
+ d = LROT(d + F(a, b, c) + X[13], 7);
+ c = LROT(c + F(d, a, b) + X[14], 11);
+ b = LROT(b + F(c, d, a) + X[15], 19);
+
+
+ a = LROT(a + G(b, c, d) + X[0] + 0x5A827999, 3);
+ d = LROT(d + G(a, b, c) + X[4] + 0x5A827999, 5);
+ c = LROT(c + G(d, a, b) + X[8] + 0x5A827999, 9);
+ b = LROT(b + G(c, d, a) + X[12] + 0x5A827999, 13);
+
+ a = LROT(a + G(b, c, d) + X[1] + 0x5A827999, 3);
+ d = LROT(d + G(a, b, c) + X[5] + 0x5A827999, 5);
+ c = LROT(c + G(d, a, b) + X[9] + 0x5A827999, 9);
+ b = LROT(b + G(c, d, a) + X[13] + 0x5A827999, 13);
+
+ a = LROT(a + G(b, c, d) + X[2] + 0x5A827999, 3);
+ d = LROT(d + G(a, b, c) + X[6] + 0x5A827999, 5);
+ c = LROT(c + G(d, a, b) + X[10] + 0x5A827999, 9);
+ b = LROT(b + G(c, d, a) + X[14] + 0x5A827999, 13);
+
+ a = LROT(a + G(b, c, d) + X[3] + 0x5A827999, 3);
+ d = LROT(d + G(a, b, c) + X[7] + 0x5A827999, 5);
+ c = LROT(c + G(d, a, b) + X[11] + 0x5A827999, 9);
+ b = LROT(b + G(c, d, a) + X[15] + 0x5A827999, 13);
+
+
+ a = LROT(a + H(b, c, d) + X[0] + 0x6ED9EBA1, 3);
+ d = LROT(d + H(a, b, c) + X[8] + 0x6ED9EBA1, 9);
+ c = LROT(c + H(d, a, b) + X[4] + 0x6ED9EBA1, 11);
+ b = LROT(b + H(c, d, a) + X[12] + 0x6ED9EBA1, 15);
+
+ a = LROT(a + H(b, c, d) + X[2] + 0x6ED9EBA1, 3);
+ d = LROT(d + H(a, b, c) + X[10] + 0x6ED9EBA1, 9);
+ c = LROT(c + H(d, a, b) + X[6] + 0x6ED9EBA1, 11);
+ b = LROT(b + H(c, d, a) + X[14] + 0x6ED9EBA1, 15);
+
+ a = LROT(a + H(b, c, d) + X[1] + 0x6ED9EBA1, 3);
+ d = LROT(d + H(a, b, c) + X[9] + 0x6ED9EBA1, 9);
+ c = LROT(c + H(d, a, b) + X[5] + 0x6ED9EBA1, 11);
+ b = LROT(b + H(c, d, a) + X[13] + 0x6ED9EBA1, 15);
+
+ a = LROT(a + H(b, c, d) + X[3] + 0x6ED9EBA1, 3);
+ d = LROT(d + H(a, b, c) + X[11] + 0x6ED9EBA1, 9);
+ c = LROT(c + H(d, a, b) + X[7] + 0x6ED9EBA1, 11);
+ b = LROT(b + H(c, d, a) + X[15] + 0x6ED9EBA1, 15);
+
+
+ A = AND(A + a, 0xFFFFFFFF);
+ B = AND(B + b, 0xFFFFFFFF);
+ C = AND(C + c, 0xFFFFFFFF);
+ D = AND(D + d, 0xFFFFFFFF);
+ end
+
+
+ for s in stream do
+ queue.push(s);
+ if (queue.size() >= 64) then processBlock(); end
+ end
+
+ local bits = queue.getHead() * 8;
+
+ queue.push(0x80);
+ while ((queue.size() + 7) % 64) < 63 do
+ queue.push(0x00);
+ end
+
+ local b0, b1, b2, b3, b4, b5, b6, b7 = dword2bytes(bits);
+
+ queue.push(b0);
+ queue.push(b1);
+ queue.push(b2);
+ queue.push(b3);
+ queue.push(b4);
+ queue.push(b5);
+ queue.push(b6);
+ queue.push(b7);
+
+ while queue.size() > 0 do
+ processBlock();
+ end
+
+ public.asBytes = function()
+ local b0, b1, b2, b3 = word2bytes(A);
+ local b4, b5, b6, b7 = word2bytes(B);
+ local b8, b9, b10, b11 = word2bytes(C);
+ local b12, b13, b14, b15 = word2bytes(D);
+
+ return {b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15};
+ end
+
+ public.asHex = function()
+ local b0, b1, b2, b3 = word2bytes(A);
+ local b4, b5, b6, b7 = word2bytes(B);
+ local b8, b9, b10, b11 = word2bytes(C);
+ local b12, b13, b14, b15 = word2bytes(D);
+
+ return string.format("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15);
+ end
+
+ public.asString = function()
+ local b0, b1, b2, b3 = word2bytes(A);
+ local b4, b5, b6, b7 = word2bytes(B);
+ local b8, b9, b10, b11 = word2bytes(C);
+ local b12, b13, b14, b15 = word2bytes(D);
+
+ return string.pack(string.rep('B', 16),
+ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15);
+ end
+
+ return public;
+
+end
+
+return MD4;
\ No newline at end of file
diff --git a/module/lua/crypto/digest/md5.lua b/module/lua/crypto/digest/md5.lua
new file mode 100644
index 0000000..be40518
--- /dev/null
+++ b/module/lua/crypto/digest/md5.lua
@@ -0,0 +1,178 @@
+local Bit = require(".crypto.util.bit");
+local Queue = require(".crypto.util.queue");
+
+local SHIFT = {
+ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
+ 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
+ 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
+ 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21};
+
+local CONSTANTS = {
+ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
+ 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
+ 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
+ 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
+ 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
+ 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
+ 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
+ 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
+ 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
+ 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
+ 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
+ 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
+ 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
+ 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
+ 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
+ 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};
+
+local AND = Bit.band;
+local OR = Bit.bor;
+local NOT = Bit.bnot;
+local XOR = Bit.bxor;
+local LROT = Bit.lrotate;
+local LSHIFT = Bit.lshift;
+local RSHIFT = Bit.rshift;
+
+--MD5 is little-endian
+local bytes2word = function(b0, b1, b2, b3)
+ local i = b3; i = LSHIFT(i, 8);
+ i = OR(i, b2); i = LSHIFT(i, 8);
+ i = OR(i, b1); i = LSHIFT(i, 8);
+ i = OR(i, b0);
+ return i;
+end
+
+local word2bytes = function(word)
+ local b0, b1, b2, b3;
+ b0 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b1 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b2 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b3 = AND(word, 0xFF);
+ return b0, b1, b2, b3;
+end
+
+local dword2bytes = function(i)
+ local b4, b5, b6, b7 = word2bytes(math.floor(i / 0x100000000));
+ local b0, b1, b2, b3 = word2bytes(i);
+ return b0, b1, b2, b3, b4, b5, b6, b7;
+end
+
+local F = function(x, y, z) return OR(AND(x, y), AND(NOT(x), z)); end
+local G = function(x, y, z) return OR(AND(x, z), AND(y, NOT(z))); end
+local H = function(x, y, z) return XOR(x, XOR(y, z)); end
+local I = function(x, y, z) return XOR(y, OR(x, NOT(z))); end
+
+local MD5 = function(stream)
+
+ local queue = Queue();
+
+ local A = 0x67452301;
+ local B = 0xefcdab89;
+ local C = 0x98badcfe;
+ local D = 0x10325476;
+ local public = {};
+
+ local processBlock = function()
+ local a = A;
+ local b = B;
+ local c = C;
+ local d = D;
+
+ local X = {};
+
+ for i = 1, 16 do
+ X[i] = bytes2word(queue.pop(), queue.pop(), queue.pop(), queue.pop());
+ end
+
+ for i = 0, 63 do
+ local f, g, temp;
+
+ if (0 <= i) and (i <= 15) then
+ f = F(b, c, d);
+ g = i;
+ elseif (16 <= i) and (i <= 31) then
+ f = G(b, c, d);
+ g = (5 * i + 1) % 16;
+ elseif (32 <= i) and (i <= 47) then
+ f = H(b, c, d);
+ g = (3 * i + 5) % 16;
+ elseif (48 <= i) and (i <= 63) then
+ f = I(b, c, d);
+ g = (7 * i) % 16;
+ end
+ temp = d;
+ d = c;
+ c = b;
+ b = b + LROT((a + f + CONSTANTS[i + 1] + X[g + 1]), SHIFT[i + 1]);
+ a = temp;
+ end
+
+ A = AND(A + a, 0xFFFFFFFF);
+ B = AND(B + b, 0xFFFFFFFF);
+ C = AND(C + c, 0xFFFFFFFF);
+ D = AND(D + d, 0xFFFFFFFF);
+ end
+
+ for s in stream do
+ queue.push(s);
+ if (queue.size() >= 64) then processBlock(); end
+ end
+
+ local bits = queue.getHead() * 8;
+
+ queue.push(0x80);
+ while ((queue.size() + 7) % 64) < 63 do
+ queue.push(0x00);
+ end
+
+ local b0, b1, b2, b3, b4, b5, b6, b7 = dword2bytes(bits);
+
+ queue.push(b0);
+ queue.push(b1);
+ queue.push(b2);
+ queue.push(b3);
+ queue.push(b4);
+ queue.push(b5);
+ queue.push(b6);
+ queue.push(b7);
+
+ while queue.size() > 0 do
+ processBlock();
+ end
+
+ public.asBytes = function()
+ local b0, b1, b2, b3 = word2bytes(A);
+ local b4, b5, b6, b7 = word2bytes(B);
+ local b8, b9, b10, b11 = word2bytes(C);
+ local b12, b13, b14, b15 = word2bytes(D);
+
+ return {b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15};
+ end
+
+ public.asHex = function()
+ local b0, b1, b2, b3 = word2bytes(A);
+ local b4, b5, b6, b7 = word2bytes(B);
+ local b8, b9, b10, b11 = word2bytes(C);
+ local b12, b13, b14, b15 = word2bytes(D);
+
+ return string.format("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15);
+ end
+
+ public.asString = function()
+ local b0, b1, b2, b3 = word2bytes(A);
+ local b4, b5, b6, b7 = word2bytes(B);
+ local b8, b9, b10, b11 = word2bytes(C);
+ local b12, b13, b14, b15 = word2bytes(D);
+
+ return string.pack(string.rep('B', 16),
+ b0, b1, b2, b3, b4, b5, b6, b7, b8,
+ b9, b10, b11, b12, b13, b14, b15
+ )
+ end
+
+ return public;
+
+end
+
+return MD5;
\ No newline at end of file
diff --git a/module/lua/crypto/digest/sha1.lua b/module/lua/crypto/digest/sha1.lua
new file mode 100644
index 0000000..589acf8
--- /dev/null
+++ b/module/lua/crypto/digest/sha1.lua
@@ -0,0 +1,191 @@
+local Bit = require(".crypto.util.bit");
+local Queue = require(".crypto.util.queue");
+
+local AND = Bit.band;
+local OR = Bit.bor;
+local XOR = Bit.bxor;
+local LROT = Bit.lrotate;
+local LSHIFT = Bit.lshift;
+local RSHIFT = Bit.rshift;
+
+--SHA1 is big-endian
+local bytes2word = function(b0, b1, b2, b3)
+ local i = b0; i = LSHIFT(i, 8);
+ i = OR(i, b1); i = LSHIFT(i, 8);
+ i = OR(i, b2); i = LSHIFT(i, 8);
+ i = OR(i, b3);
+ return i;
+end
+
+local word2bytes = function(word)
+ local b0, b1, b2, b3;
+ b3 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b2 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b1 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b0 = AND(word, 0xFF);
+ return b0, b1, b2, b3;
+end
+
+local dword2bytes = function(i)
+ local b4, b5, b6, b7 = word2bytes(i);
+ local b0, b1, b2, b3 = word2bytes(math.floor(i / 0x100000000));
+ return b0, b1, b2, b3, b4, b5, b6, b7;
+end
+
+local F = function(x, y, z) return XOR(z, AND(x, XOR(y, z))); end
+local G = function(x, y, z) return XOR(x, XOR(y, z)); end
+local H = function(x, y, z) return OR(AND(x, OR(y, z)), AND(y, z)); end
+local I = function(x, y, z) return XOR(x, XOR(y, z)); end
+
+local SHA1 = function()
+
+ local queue = Queue();
+
+ local h0 = 0x67452301;
+ local h1 = 0xEFCDAB89;
+ local h2 = 0x98BADCFE;
+ local h3 = 0x10325476;
+ local h4 = 0xC3D2E1F0;
+
+ local public = {};
+
+ local processBlock = function()
+ local a = h0;
+ local b = h1;
+ local c = h2;
+ local d = h3;
+ local e = h4;
+ local temp;
+ local k;
+
+ local w = {};
+ for i = 0, 15 do
+ w[i] = bytes2word(queue.pop(), queue.pop(), queue.pop(), queue.pop());
+ end
+
+ for i = 16, 79 do
+ w[i] = LROT((XOR(XOR(w[i - 3], w[i - 8]), XOR(w[i - 14], w[i - 16]))), 1);
+ end
+
+ for i = 0, 79 do
+ if (i <= 19) then
+ temp = F(b, c, d);
+ k = 0x5A827999;
+ elseif (i <= 39) then
+ temp = G(b, c, d);
+ k = 0x6ED9EBA1;
+ elseif (i <= 59) then
+ temp = H(b, c, d);
+ k = 0x8F1BBCDC;
+ else
+ temp = I(b, c, d);
+ k = 0xCA62C1D6;
+ end
+ temp = LROT(a, 5) + temp + e + k + w[i];
+ e = d;
+ d = c;
+ c = LROT(b, 30);
+ b = a;
+ a = temp;
+ end
+
+ h0 = AND(h0 + a, 0xFFFFFFFF);
+ h1 = AND(h1 + b, 0xFFFFFFFF);
+ h2 = AND(h2 + c, 0xFFFFFFFF);
+ h3 = AND(h3 + d, 0xFFFFFFFF);
+ h4 = AND(h4 + e, 0xFFFFFFFF);
+ end
+
+ public.init = function()
+ queue.reset();
+ h0 = 0x67452301;
+ h1 = 0xEFCDAB89;
+ h2 = 0x98BADCFE;
+ h3 = 0x10325476;
+ h4 = 0xC3D2E1F0;
+ return public;
+ end
+
+
+ public.update = function(bytes)
+ for b in bytes do
+ queue.push(b);
+ if queue.size() >= 64 then processBlock(); end
+ end
+
+ return public;
+ end
+
+ public.finish = function()
+ local bits = queue.getHead() * 8;
+
+ queue.push(0x80);
+ while ((queue.size() + 7) % 64) < 63 do
+ queue.push(0x00);
+ end
+
+ local b0, b1, b2, b3, b4, b5, b6, b7 = dword2bytes(bits);
+
+ queue.push(b0);
+ queue.push(b1);
+ queue.push(b2);
+ queue.push(b3);
+ queue.push(b4);
+ queue.push(b5);
+ queue.push(b6);
+ queue.push(b7);
+
+ while queue.size() > 0 do
+ processBlock();
+ end
+
+ return public;
+ end
+
+ public.asBytes = function()
+ local b0, b1, b2, b3 = word2bytes(h0);
+ local b4, b5, b6, b7 = word2bytes(h1);
+ local b8, b9, b10, b11 = word2bytes(h2);
+ local b12, b13, b14, b15 = word2bytes(h3);
+ local b16, b17, b18, b19 = word2bytes(h4);
+
+ return {b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19};
+ end
+
+ public.asHex = function()
+ local b0, b1, b2, b3 = word2bytes(h0);
+ local b4, b5, b6, b7 = word2bytes(h1);
+ local b8, b9, b10, b11 = word2bytes(h2);
+ local b12, b13, b14, b15 = word2bytes(h3);
+ local b16, b17, b18, b19 = word2bytes(h4);
+
+ return string.format("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19);
+ end
+
+ public.asString = function()
+ local b0, b1, b2, b3 = word2bytes(h0);
+ local b4, b5, b6, b7 = word2bytes(h1);
+ local b8, b9, b10, b11 = word2bytes(h2);
+ local b12, b13, b14, b15 = word2bytes(h3);
+ local b16, b17, b18, b19 = word2bytes(h4);
+
+ return string.pack(string.rep('B', 20),
+ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15, b16, b17, b18, b19);
+ end
+
+ return public;
+end
+
+
+local sha1 = function(stream)
+ local result = SHA1()
+ .update(stream)
+ .finish()
+ return result
+end
+
+return {
+ sha1 = sha1,
+ SHA1 = SHA1
+}
\ No newline at end of file
diff --git a/module/lua/crypto/digest/sha2_256.lua b/module/lua/crypto/digest/sha2_256.lua
new file mode 100644
index 0000000..64be951
--- /dev/null
+++ b/module/lua/crypto/digest/sha2_256.lua
@@ -0,0 +1,230 @@
+local Bit = require(".crypto.util.bit");
+local Queue = require(".crypto.util.queue");
+local Stream = require(".crypto.util.stream");
+
+local CONSTANTS = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 };
+
+local fmt = "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x" ..
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
+
+local AND = Bit.band;
+local OR = Bit.bor;
+local NOT = Bit.bnot;
+local XOR = Bit.bxor;
+local RROT = Bit.rrotate;
+local LSHIFT = Bit.lshift;
+local RSHIFT = Bit.rshift;
+
+--SHA2 is big-endian
+local bytes2word = function(b0, b1, b2, b3)
+ local i = b0; i = LSHIFT(i, 8);
+ i = OR(i, b1); i = LSHIFT(i, 8);
+ i = OR(i, b2); i = LSHIFT(i, 8);
+ i = OR(i, b3);
+ return i;
+end
+
+local word2bytes = function(word)
+ local b0, b1, b2, b3;
+ b3 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b2 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b1 = AND(word, 0xFF); word = RSHIFT(word, 8);
+ b0 = AND(word, 0xFF);
+ return b0, b1, b2, b3;
+end
+
+local dword2bytes = function(i)
+ local b4, b5, b6, b7 = word2bytes(i);
+ local b0, b1, b2, b3 = word2bytes(math.floor(i / 0x100000000));
+ return b0, b1, b2, b3, b4, b5, b6, b7;
+end
+
+
+local SHA2_256 = function()
+
+ local queue = Queue();
+
+ local h0 = 0x6a09e667;
+ local h1 = 0xbb67ae85;
+ local h2 = 0x3c6ef372;
+ local h3 = 0xa54ff53a;
+ local h4 = 0x510e527f;
+ local h5 = 0x9b05688c;
+ local h6 = 0x1f83d9ab;
+ local h7 = 0x5be0cd19;
+
+ local public = {};
+
+ local processBlock = function()
+ local a = h0;
+ local b = h1;
+ local c = h2;
+ local d = h3;
+ local e = h4;
+ local f = h5;
+ local g = h6;
+ local h = h7;
+
+ local w = {};
+
+ for i = 0, 15 do
+ w[i] = bytes2word(queue.pop(), queue.pop(), queue.pop(), queue.pop());
+ end
+
+ for i = 16, 63 do
+ local s0 = XOR(RROT(w[i - 15], 7), XOR(RROT(w[i - 15], 18), RSHIFT(w[i - 15], 3)));
+ local s1 = XOR(RROT(w[i - 2], 17), XOR(RROT(w[i - 2], 19), RSHIFT(w[i - 2], 10)));
+ w[i] = AND(w[i - 16] + s0 + w[i - 7] + s1, 0xFFFFFFFF);
+ end
+
+ for i = 0, 63 do
+ local s1 = XOR(RROT(e, 6), XOR(RROT(e, 11), RROT(e, 25)));
+ local ch = XOR(AND(e, f), AND(NOT(e), g));
+ local temp1 = h + s1 + ch + CONSTANTS[i + 1] + w[i];
+ local s0 = XOR(RROT(a, 2), XOR(RROT(a, 13), RROT(a, 22)));
+ local maj = XOR(AND(a, b), XOR(AND(a, c), AND(b, c)));
+ local temp2 = s0 + maj;
+
+ h = g;
+ g = f;
+ f = e;
+ e = d + temp1;
+ d = c;
+ c = b;
+ b = a;
+ a = temp1 + temp2;
+ end
+
+ h0 = AND(h0 + a, 0xFFFFFFFF);
+ h1 = AND(h1 + b, 0xFFFFFFFF);
+ h2 = AND(h2 + c, 0xFFFFFFFF);
+ h3 = AND(h3 + d, 0xFFFFFFFF);
+ h4 = AND(h4 + e, 0xFFFFFFFF);
+ h5 = AND(h5 + f, 0xFFFFFFFF);
+ h6 = AND(h6 + g, 0xFFFFFFFF);
+ h7 = AND(h7 + h, 0xFFFFFFFF);
+ end
+
+ public.init = function()
+ queue.reset();
+
+ h0 = 0x6a09e667;
+ h1 = 0xbb67ae85;
+ h2 = 0x3c6ef372;
+ h3 = 0xa54ff53a;
+ h4 = 0x510e527f;
+ h5 = 0x9b05688c;
+ h6 = 0x1f83d9ab;
+ h7 = 0x5be0cd19;
+
+ return public;
+ end
+
+ public.update = function(bytes)
+ for b in bytes do
+ queue.push(b);
+ if queue.size() >= 64 then processBlock(); end
+ end
+
+ return public;
+ end
+
+ public.finish = function()
+ local bits = queue.getHead() * 8;
+
+ queue.push(0x80);
+ while ((queue.size() + 7) % 64) < 63 do
+ queue.push(0x00);
+ end
+
+ local b0, b1, b2, b3, b4, b5, b6, b7 = dword2bytes(bits);
+
+ queue.push(b0);
+ queue.push(b1);
+ queue.push(b2);
+ queue.push(b3);
+ queue.push(b4);
+ queue.push(b5);
+ queue.push(b6);
+ queue.push(b7);
+
+ while queue.size() > 0 do
+ processBlock();
+ end
+
+ return public;
+ end
+
+ public.asBytes = function()
+ local b0, b1, b2, b3 = word2bytes(h0);
+ local b4, b5, b6, b7 = word2bytes(h1);
+ local b8, b9, b10, b11 = word2bytes(h2);
+ local b12, b13, b14, b15 = word2bytes(h3);
+ local b16, b17, b18, b19 = word2bytes(h4);
+ local b20, b21, b22, b23 = word2bytes(h5);
+ local b24, b25, b26, b27 = word2bytes(h6);
+ local b28, b29, b30, b31 = word2bytes(h7);
+
+
+ return { b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15
+ , b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31};
+ end
+
+ public.asHex = function()
+ local b0, b1, b2, b3 = word2bytes(h0);
+ local b4, b5, b6, b7 = word2bytes(h1);
+ local b8, b9, b10, b11 = word2bytes(h2);
+ local b12, b13, b14, b15 = word2bytes(h3);
+ local b16, b17, b18, b19 = word2bytes(h4);
+ local b20, b21, b22, b23 = word2bytes(h5);
+ local b24, b25, b26, b27 = word2bytes(h6);
+ local b28, b29, b30, b31 = word2bytes(h7);
+
+ return string.format(fmt, b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15
+ , b16, b17, b18, b19, b20, b21, b22, b23, b24, b25, b26, b27, b28, b29, b30, b31);
+ end
+
+ public.asString = function()
+ local b0, b1, b2, b3 = word2bytes(h0);
+ local b4, b5, b6, b7 = word2bytes(h1);
+ local b8, b9, b10, b11 = word2bytes(h2);
+ local b12, b13, b14, b15 = word2bytes(h3);
+ local b16, b17, b18, b19 = word2bytes(h4);
+ local b20, b21, b22, b23 = word2bytes(h5);
+ local b24, b25, b26, b27 = word2bytes(h6);
+ local b28, b29, b30, b31 = word2bytes(h7);
+
+ return string.pack(string.rep('B', 32),
+ b0, b1, b2, b3, b4, b5, b6, b7, b8,
+ b9, b10, b11, b12, b13, b14, b15,
+ b16, b17, b18, b19, b20, b21, b22, b23, b24,
+ b25, b26, b27, b28, b29, b30, b31);
+ end
+
+ return public;
+
+end
+
+--- @class Stream : table
+
+--- @param stream (Stream) - A function that returns the next byte of the stream, or nil if the stream has ended.
+--- @returns table - A table containing the hash in bytes, string, and hex formats.
+local sha2_256 = function(stream)
+ local result = SHA2_256()
+ .update(stream)
+ .finish()
+ return result
+end
+
+return {
+ sha2_256 = sha2_256,
+ SHA2_256 = SHA2_256
+};
diff --git a/module/lua/crypto/digest/sha2_512.lua b/module/lua/crypto/digest/sha2_512.lua
new file mode 100644
index 0000000..56298c7
--- /dev/null
+++ b/module/lua/crypto/digest/sha2_512.lua
@@ -0,0 +1,107 @@
+local Hex = require(".crypto.util.hex")
+
+local k512 = {
+0x428a2f98d728ae22,0x7137449123ef65cd,0xb5c0fbcfec4d3b2f,0xe9b5dba58189dbbc,
+0x3956c25bf348b538,0x59f111f1b605d019,0x923f82a4af194f9b,0xab1c5ed5da6d8118,
+0xd807aa98a3030242,0x12835b0145706fbe,0x243185be4ee4b28c,0x550c7dc3d5ffb4e2,
+0x72be5d74f27b896f,0x80deb1fe3b1696b1,0x9bdc06a725c71235,0xc19bf174cf692694,
+0xe49b69c19ef14ad2,0xefbe4786384f25e3,0x0fc19dc68b8cd5b5,0x240ca1cc77ac9c65,
+0x2de92c6f592b0275,0x4a7484aa6ea6e483,0x5cb0a9dcbd41fbd4,0x76f988da831153b5,
+0x983e5152ee66dfab,0xa831c66d2db43210,0xb00327c898fb213f,0xbf597fc7beef0ee4,
+0xc6e00bf33da88fc2,0xd5a79147930aa725,0x06ca6351e003826f,0x142929670a0e6e70,
+0x27b70a8546d22ffc,0x2e1b21385c26c926,0x4d2c6dfc5ac42aed,0x53380d139d95b3df,
+0x650a73548baf63de,0x766a0abb3c77b2a8,0x81c2c92e47edaee6,0x92722c851482353b,
+0xa2bfe8a14cf10364,0xa81a664bbc423001,0xc24b8b70d0f89791,0xc76c51a30654be30,
+0xd192e819d6ef5218,0xd69906245565a910,0xf40e35855771202a,0x106aa07032bbd1b8,
+0x19a4c116b8d2d0c8,0x1e376c085141ab53,0x2748774cdf8eeb99,0x34b0bcb5e19b48a8,
+0x391c0cb3c5c95a63,0x4ed8aa4ae3418acb,0x5b9cca4f7763e373,0x682e6ff3d6b2b8a3,
+0x748f82ee5defb2fc,0x78a5636f43172f60,0x84c87814a1f0ab72,0x8cc702081a6439ec,
+0x90befffa23631e28,0xa4506cebde82bde9,0xbef9a3f7b2c67915,0xc67178f2e372532b,
+0xca273eceea26619c,0xd186b8c721c0c207,0xeada7dd6cde0eb1e,0xf57d4f7fee6ed178,
+0x06f067aa72176fba,0x0a637dc5a2c898a6,0x113f9804bef90dae,0x1b710b35131c471b,
+0x28db77f523047d84,0x32caab7b40c72493,0x3c9ebe0a15c9bebc,0x431d67c49c100d4c,
+0x4cc5d4becb3e42b6,0x597f299cfc657e2a,0x5fcb6fab3ad6faec,0x6c44198c4a475817
+}
+
+local function pad128(msg, len)
+ local extra = 128 - ((len + 1 + 8) % 128)
+ len = string.pack(">I8", len * 8)
+ msg = msg .. "\128" .. string.rep("\0", extra) .. len
+ assert(#msg % 128 == 0)
+ return msg
+end
+
+local ww512 = {}
+
+--- SHA-512 hash function.
+--- @param msg string - The message to hash.
+--- @returns table - A table containing the hash in bytes, string, and hex formats.
+local function sha512 (msg)
+ msg = pad128(msg, #msg)
+ local h1, h2, h3, h4, h5, h6, h7, h8 =
+ 0x6a09e667f3bcc908, 0xbb67ae8584caa73b,
+ 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
+ 0x510e527fade682d1, 0x9b05688c2b3e6c1f,
+ 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
+ local k = k512
+ local w = ww512
+ local mlen = #msg
+
+ for i = 1, mlen, 128 do
+ w[1], w[2], w[3], w[4], w[5], w[6], w[7], w[8],
+ w[9], w[10], w[11], w[12], w[13], w[14], w[15], w[16]
+ = string.unpack(">i8i8i8i8i8i8i8i8i8i8i8i8i8i8i8i8", msg, i)
+ -- mix msg block in state
+
+ for j = 17, 80 do
+ local a = w[j-15]
+ local b = w[j-2]
+ w[j] = (a >> 1 ~ a >> 7 ~ a >> 8 ~ a << 56 ~ a << 63)
+ + (b >> 6 ~ b >> 19 ~ b >> 61 ~ b << 3 ~ b << 45)
+ + w[j-7] + w[j-16]
+ end
+ local a, b, c, d, e, f, g, h = h1, h2, h3, h4, h5, h6, h7, h8
+ -- main state permutation
+ for j = 1, 80 do
+ local z = (e >> 14 ~ e >> 18 ~ e >> 41 ~ e << 23
+ ~ e << 46 ~ e << 50)
+ + (g ~ e & (f ~ g)) + h + k[j] + w[j]
+ h = g
+ g = f
+ f = e
+ e = z + d
+ d = c
+ c = b
+ b = a
+ a = z + ((a ~ c) & d ~ a & c)
+ + (a >> 28 ~ a >> 34 ~ a >> 39 ~ a << 25
+ ~ a << 30 ~ a << 36)
+ end
+ h1 = h1 + a
+ h2 = h2 + b
+ h3 = h3 + c
+ h4 = h4 + d
+ h5 = h5 + e
+ h6 = h6 + f
+ h7 = h7 + g
+ h8 = h8 + h
+ end
+
+ local public = {}
+
+ public.asBytes = function()
+ return { h1, h2, h3, h4, h5, h6, h7, h8}
+ end
+
+ public.asString = function()
+ return string.pack(">i8i8i8i8i8i8i8i8", h1, h2, h3, h4, h5, h6, h7, h8)
+ end
+
+ public.asHex = function()
+ return Hex.stringToHex(string.pack(">i8i8i8i8i8i8i8i8", h1, h2, h3, h4, h5, h6, h7, h8))
+ end
+
+ return public
+end
+
+return sha512
diff --git a/module/lua/crypto/digest/sha3.lua b/module/lua/crypto/digest/sha3.lua
new file mode 100644
index 0000000..bef4656
--- /dev/null
+++ b/module/lua/crypto/digest/sha3.lua
@@ -0,0 +1,235 @@
+local Hex = require(".crypto.util.hex");
+
+local ROUNDS = 24
+
+local roundConstants = {
+0x0000000000000001,
+0x0000000000008082,
+0x800000000000808A,
+0x8000000080008000,
+0x000000000000808B,
+0x0000000080000001,
+0x8000000080008081,
+0x8000000000008009,
+0x000000000000008A,
+0x0000000000000088,
+0x0000000080008009,
+0x000000008000000A,
+0x000000008000808B,
+0x800000000000008B,
+0x8000000000008089,
+0x8000000000008003,
+0x8000000000008002,
+0x8000000000000080,
+0x000000000000800A,
+0x800000008000000A,
+0x8000000080008081,
+0x8000000000008080,
+0x0000000080000001,
+0x8000000080008008
+}
+
+local rotationOffsets = {
+-- ordered for [x][y] dereferencing, so appear flipped here:
+{0, 36, 3, 41, 18},
+{1, 44, 10, 45, 2},
+{62, 6, 43, 15, 61},
+{28, 55, 25, 21, 56},
+{27, 20, 39, 8, 14}
+}
+
+
+
+-- the full permutation function
+local function keccakF(st)
+ local permuted = st.permuted
+ local parities = st.parities
+ for round = 1, ROUNDS do
+ -- theta()
+ for x = 1,5 do
+ parities[x] = 0
+ local sx = st[x]
+ for y = 1,5 do parities[x] = parities[x] ~ sx[y] end
+ end
+ --
+ -- unroll the following loop
+ --for x = 1,5 do
+ -- local p5 = parities[(x)%5 + 1]
+ -- local flip = parities[(x-2)%5 + 1] ~ ( p5 << 1 | p5 >> 63)
+ -- for y = 1,5 do st[x][y] = st[x][y] ~ flip end
+ --end
+ local p5, flip, s
+ --x=1
+ p5 = parities[2]
+ flip = parities[5] ~ (p5 << 1 | p5 >> 63)
+ s = st[1]
+ for y = 1,5 do s[y] = s[y] ~ flip end
+ --x=2
+ p5 = parities[3]
+ flip = parities[1] ~ (p5 << 1 | p5 >> 63)
+ s = st[2]
+ for y = 1,5 do s[y] = s[y] ~ flip end
+ --x=3
+ p5 = parities[4]
+ flip = parities[2] ~ (p5 << 1 | p5 >> 63)
+ s = st[3]
+ for y = 1,5 do s[y] = s[y] ~ flip end
+ --x=4
+ p5 = parities[5]
+ flip = parities[3] ~ (p5 << 1 | p5 >> 63)
+ s = st[4]
+ for y = 1,5 do s[y] = s[y] ~ flip end
+ --x=5
+ p5 = parities[1]
+ flip = parities[4] ~ (p5 << 1 | p5 >> 63)
+ s = st[5]
+ for y = 1,5 do s[y] = s[y] ~ flip end
+
+ -- rhopi()
+ for y = 1,5 do
+ local py = permuted[y]
+ local r
+ for x = 1,5 do
+ s, r = st[x][y], rotationOffsets[x][y]
+ py[(2*x + 3*y)%5 + 1] = (s << r | s >> (64-r))
+ end
+ end
+
+ -- chi() - unroll the loop
+ --for x = 1,5 do
+ -- for y = 1,5 do
+ -- local combined = (~ permuted[(x)%5 +1][y]) & permuted[(x+1)%5 +1][y]
+ -- st[x][y] = permuted[x][y] ~ combined
+ -- end
+ --end
+
+ local p, p1, p2
+ --x=1
+ s, p, p1, p2 = st[1], permuted[1], permuted[2], permuted[3]
+ for y = 1,5 do s[y] = p[y] ~ (~ p1[y]) & p2[y] end
+ --x=2
+ s, p, p1, p2 = st[2], permuted[2], permuted[3], permuted[4]
+ for y = 1,5 do s[y] = p[y] ~ (~ p1[y]) & p2[y] end
+ --x=3
+ s, p, p1, p2 = st[3], permuted[3], permuted[4], permuted[5]
+ for y = 1,5 do s[y] = p[y] ~ (~ p1[y]) & p2[y] end
+ --x=4
+ s, p, p1, p2 = st[4], permuted[4], permuted[5], permuted[1]
+ for y = 1,5 do s[y] = p[y] ~ (~ p1[y]) & p2[y] end
+ --x=5
+ s, p, p1, p2 = st[5], permuted[5], permuted[1], permuted[2]
+ for y = 1,5 do s[y] = p[y] ~ (~ p1[y]) & p2[y] end
+
+ -- iota()
+ st[1][1] = st[1][1] ~ roundConstants[round]
+ end
+end
+
+
+local function absorb(st, buffer, algorithm)
+
+ local blockBytes = st.rate / 8
+ local blockWords = blockBytes / 8
+
+ -- append 0x01 byte and pad with zeros to block size (rate/8 bytes)
+ local totalBytes = #buffer + 1
+ -- for keccak (2012 submission), the padding is byte 0x01 followed by zeros
+ -- for SHA3 (NIST, 2015), the padding is byte 0x06 followed by zeros
+
+ if algorithm == "keccak" then
+ buffer = buffer .. ( '\x01' .. string.char(0):rep(blockBytes - (totalBytes % blockBytes)))
+ end
+
+ if algorithm == "sha3" then
+ buffer = buffer .. ( '\x06' .. string.char(0):rep(blockBytes - (totalBytes % blockBytes)))
+ end
+
+ totalBytes = #buffer
+
+ --convert data to an array of u64
+ local words = {}
+ for i = 1, totalBytes - (totalBytes % 8), 8 do
+ words[#words + 1] = string.unpack(' 1) then
+ out = Array.XOR(out, s);
+ else
+ out = s;
+ end
+ end
+
+ return out;
+ end
+
+ public.finish = function()
+ local blocks = math.ceil(dKeyLen / blockLen);
+
+ dKey = {};
+
+ for b = 1, blocks do
+ local block = buildBlock(b);
+ dKey = Array.concat(dKey, block);
+ end
+
+ if(Array.size(dKey) > dKeyLen) then dKey = Array.truncate(dKey, dKeyLen); end
+
+ return public;
+ end
+
+ public.asBytes = function()
+ return dKey;
+ end
+
+ public.asHex = function()
+ return Array.toHex(dKey);
+ end
+
+ public.asString = function()
+ return Array.toString(dKey);
+ end
+
+ return public;
+end
+
+--- @class Array : table
+
+--- PBKDF2 key derivation function
+--- @param password (Array) - The password to derive the key from
+--- @param salt (Array) - The salt to use
+--- @param iterations number - The number of iterations to perform
+--- @param keyLen number - The length of the key to derive
+--- @param digest? string - The digest algorithm to use (sha1, sha256). Defaults to sha1.
+--- @returns string - The derived key
+local pbkdf2 = function(password, salt, iterations, keyLen, digest)
+ local Digest = nil
+ if digest == "sha1" then
+ Digest = SHA1.SHA1
+ elseif digest == "sha256" then
+ Digest = SHA2_256.SHA2_256
+ elseif digest == nil then
+ Digest = SHA1.SHA1
+ else
+ error("Unsupported algorithm: " .. digest)
+ end
+
+ local prf = HMAC.HMAC().setBlockSize(64).setDigest(Digest);
+
+ local res = PBKDF2()
+ .setPRF(prf)
+ .setBlockLen(16)
+ .setDKeyLen(keyLen)
+ .setIterations(iterations)
+ .setSalt(salt)
+ .setPassword(password)
+ .finish()
+
+ return res
+end
+
+return {
+ PBKDF2 = PBKDF2,
+ pbkdf2 = pbkdf2
+};
\ No newline at end of file
diff --git a/module/lua/crypto/mac/hmac.lua b/module/lua/crypto/mac/hmac.lua
new file mode 100644
index 0000000..470c4bf
--- /dev/null
+++ b/module/lua/crypto/mac/hmac.lua
@@ -0,0 +1,126 @@
+local Bit = require(".crypto.util.bit");
+local Stream = require(".crypto.util.stream");
+local Array = require(".crypto.util.array");
+
+local SHA1 = require(".crypto.digest.sha1");
+local SHA2_256 = require(".crypto.digest.sha2_256");
+
+local XOR = Bit.bxor;
+
+local HMAC = function()
+ local public = {};
+ local blockSize = 64;
+ local Digest = nil;
+ local outerPadding = {};
+ local innerPadding = {}
+ local digest;
+
+ public.setBlockSize = function(bytes)
+ blockSize = bytes;
+ return public;
+ end
+
+ public.setDigest = function(digestModule)
+ Digest = digestModule;
+ digest = Digest();
+ return public;
+ end
+
+ public.setKey = function(key)
+ local keyStream;
+ if Digest == nil then
+ error("Digest not set");
+ end
+ if (Array.size(key) > blockSize) then
+ keyStream = Stream.fromArray(Digest()
+ .update(Stream.fromArray(key))
+ .finish()
+ .asBytes());
+ else
+ keyStream = Stream.fromArray(key);
+ end
+
+ outerPadding = {};
+ innerPadding = {};
+
+ for i = 1, blockSize do
+ local byte = keyStream();
+ if byte == nil then byte = 0x00; end
+ outerPadding[i] = XOR(0x5C, byte);
+ innerPadding[i] = XOR(0x36, byte);
+ end
+
+ return public;
+ end
+
+ public.init = function()
+ digest.init()
+ .update(Stream.fromArray(innerPadding));
+ return public;
+ end
+
+ public.update = function(messageStream)
+ digest.update(messageStream);
+ return public;
+ end
+
+ public.finish = function()
+ local inner = digest.finish().asBytes();
+ digest.init()
+ .update(Stream.fromArray(outerPadding))
+ .update(Stream.fromArray(inner))
+ .finish();
+
+ return public;
+ end
+
+ public.asBytes = function()
+ return digest.asBytes();
+ end
+
+ public.asHex = function()
+ return digest.asHex();
+ end
+
+ public.asString = function()
+ return digest.asString();
+ end
+
+ return public;
+end
+
+--- @class Array : table
+--- @class Stream : table
+
+--- HMAC function for generating a hash-based message authentication code
+--- @param data (Stream) - The data to hash and authenticate
+--- @param key (Array) - The key to use for the HMAC
+--- @param algorithm? (string) - The algorithm to use for the HMAC (sha1, sha256). Defaults to "sha1"
+--- @returns table - A table containing the HMAC in bytes, string, and hex formats.
+local hmac = function(data, key, algorithm)
+ local digest = nil
+ if algorithm == "sha1" then
+ digest = SHA1.SHA1
+ elseif algorithm == "sha256" then
+ digest = SHA2_256.SHA2_256
+ elseif algorithm == nil then
+ digest = SHA1.SHA1
+ else
+ error("Unsupported algorithm: " .. algorithm)
+ end
+
+ local res = HMAC()
+ .setBlockSize(32)
+ .setDigest(digest)
+ .setKey(key)
+ .init()
+ .update(data)
+ .finish()
+
+ return res
+end
+
+return {
+ hmac = hmac,
+ HMAC = HMAC
+};
\ No newline at end of file
diff --git a/module/lua/crypto/mac/init.lua b/module/lua/crypto/mac/init.lua
new file mode 100644
index 0000000..65a507d
--- /dev/null
+++ b/module/lua/crypto/mac/init.lua
@@ -0,0 +1,8 @@
+local Hmac = require(".crypto.mac.hmac")
+
+local mac = {
+ _version = "0.0.1",
+ createHmac = Hmac.hmac,
+};
+
+return mac
\ No newline at end of file
diff --git a/module/lua/crypto/padding/zero.lua b/module/lua/crypto/padding/zero.lua
new file mode 100644
index 0000000..0a4f614
--- /dev/null
+++ b/module/lua/crypto/padding/zero.lua
@@ -0,0 +1,17 @@
+local ZeroPadding = function(blockSize, byteCount)
+
+ local paddingCount = blockSize - ((byteCount -1) % blockSize) + 1;
+ local bytesLeft = paddingCount;
+
+ local stream = function()
+ if bytesLeft > 0 then
+ bytesLeft = bytesLeft - 1;
+ return 0x00;
+ else
+ return nil;
+ end
+ end
+ return stream;
+end
+
+return ZeroPadding;
\ No newline at end of file
diff --git a/module/lua/crypto/util/array.lua b/module/lua/crypto/util/array.lua
new file mode 100644
index 0000000..4c0be04
--- /dev/null
+++ b/module/lua/crypto/util/array.lua
@@ -0,0 +1,222 @@
+
+local Bit = require(".crypto.util.bit");
+local Queue = require(".crypto.util.queue");
+
+local XOR = Bit.bxor;
+
+local Array = {};
+
+Array.size = function(array)
+ return #array;
+end
+
+Array.fromString = function(string)
+ local bytes = {};
+
+ local i = 1;
+ local byte = string.byte(string, i);
+ while byte ~= nil do
+ bytes[i] = byte;
+ i = i + 1;
+ byte = string.byte(string, i);
+ end
+
+ return bytes;
+
+end
+
+Array.toString = function(bytes)
+ local chars = {};
+ local i = 1;
+
+ local byte = bytes[i];
+ while byte ~= nil do
+ chars[i] = string.char(byte);
+ i = i + 1;
+ byte = bytes[i];
+ end
+
+ return table.concat(chars, "");
+end
+
+Array.fromStream = function(stream)
+ local array = {};
+ local i = 1;
+
+ local byte = stream();
+ while byte ~= nil do
+ array[i] = byte;
+ i = i + 1;
+ byte = stream();
+ end
+
+ return array;
+end
+
+Array.readFromQueue = function(queue, size)
+ local array = {};
+
+ for i = 1, size do
+ array[i] = queue.pop();
+ end
+
+ return array;
+end
+
+Array.writeToQueue = function(queue, array)
+ local size = Array.size(array);
+
+ for i = 1, size do
+ queue.push(array[i]);
+ end
+end
+
+Array.toStream = function(array)
+ local queue = Queue();
+ local i = 1;
+
+ local byte = array[i];
+ while byte ~= nil do
+ queue.push(byte);
+ i = i + 1;
+ byte = array[i];
+ end
+
+ return queue.pop;
+end
+
+
+local fromHexTable = {};
+for i = 0, 255 do
+ fromHexTable[string.format("%02X", i)] = i;
+ fromHexTable[string.format("%02x", i)] = i;
+end
+
+Array.fromHex = function(hex)
+ local array = {};
+
+ for i = 1, string.len(hex) / 2 do
+ local h = string.sub(hex, i * 2 - 1, i * 2);
+ array[i] = fromHexTable[h];
+ end
+
+ return array;
+end
+
+
+local toHexTable = {};
+for i = 0, 255 do
+ toHexTable[i] = string.format("%02X", i);
+end
+
+Array.toHex = function(array)
+ local hex = {};
+ local i = 1;
+
+ local byte = array[i];
+ while byte ~= nil do
+ hex[i] = toHexTable[byte];
+ i = i + 1;
+ byte = array[i];
+ end
+
+ return table.concat(hex, "");
+
+end
+
+Array.concat = function(a, b)
+ local concat = {};
+ local out = 1;
+
+ local i = 1;
+ local byte = a[i];
+ while byte ~= nil do
+ concat[out] = byte;
+ i = i + 1;
+ out = out + 1;
+ byte = a[i];
+ end
+
+ i = 1;
+ byte = b[i];
+ while byte ~= nil do
+ concat[out] = byte;
+ i = i + 1;
+ out = out + 1;
+ byte = b[i];
+ end
+
+ return concat;
+end
+
+Array.truncate = function(a, newSize)
+ local x = {};
+
+ for i = 1, newSize do
+ x[i] = a[i];
+ end
+
+ return x;
+end
+
+Array.XOR = function(a, b)
+ local x = {};
+
+ for k, v in pairs(a) do
+ x[k] = XOR(v, b[k]);
+ end
+
+ return x;
+end
+
+Array.substitute = function(input, sbox)
+ local out = {};
+
+ for k, v in pairs(input) do
+ out[k] = sbox[v];
+ end
+
+ return out;
+end
+
+Array.permute = function(input, pbox)
+ local out = {};
+
+ for k, v in pairs(pbox) do
+ out[k] = input[v];
+ end
+
+ return out;
+end
+
+Array.copy = function(input)
+ local out = {};
+
+ for k, v in pairs(input) do
+ out[k] = v;
+ end
+ return out;
+end
+
+Array.slice = function(input, start, stop)
+ local out = {};
+
+ if start == nil then
+ start = 1
+ elseif start < 0 then
+ start = #input + start + 1
+ end
+ if stop == nil then
+ stop = #input
+ elseif stop < 0 then
+ stop = #input + stop + 1
+ end
+
+ for i = start, stop do
+ table.insert(out, input[i])
+ end
+
+ return out;
+end
+
+return Array;
\ No newline at end of file
diff --git a/module/lua/crypto/util/bit.lua b/module/lua/crypto/util/bit.lua
new file mode 100644
index 0000000..0bbe448
--- /dev/null
+++ b/module/lua/crypto/util/bit.lua
@@ -0,0 +1,44 @@
+local ok, e
+ok = nil
+if not ok then
+ ok, e = pcall(require, "bit") -- the LuaJIT one ?
+end
+if not ok then
+ ok, e = pcall(require, "bit32") -- Lua 5.2
+end
+if not ok then
+ ok, e = pcall(require, "bit.numberlua") -- for Lua 5.1, https://github.com/tst2005/lua-bit-numberlua/
+end
+if not ok then
+ error("no bitwise support found", 2)
+end
+assert(type(e) == "table", "invalid bit module")
+
+-- Workaround to support Lua 5.2 bit32 API with the LuaJIT bit one
+if e.rol and not e.lrotate then
+ e.lrotate = e.rol
+end
+if e.ror and not e.rrotate then
+ e.rrotate = e.ror
+end
+
+-- Workaround to support incomplete bit operations set
+if not e.ror and not e.rrotate then
+ local ror = function(b, n)
+ return e.bor(e.rshift(b, n), e.lshift(b, 32 - n))
+ end
+
+ e.ror = ror
+ e.rrotate = ror
+end
+
+if not e.rol and not e.lrotate then
+ local rol = function(b, n)
+ return e.bor(e.lshift(b, n), e.rshift(b, 32 - n))
+ end
+
+ e.rol = rol
+ e.lrotate = rol
+end
+
+return e
\ No newline at end of file
diff --git a/module/lua/crypto/util/hex.lua b/module/lua/crypto/util/hex.lua
new file mode 100644
index 0000000..bcc7f2a
--- /dev/null
+++ b/module/lua/crypto/util/hex.lua
@@ -0,0 +1,46 @@
+
+--- Converts a string to its hexadecimal representation.
+--- @param s string The input string.
+--- @param ln? number - The number of characters per line. If not provided, the output will be a single line.
+--- @param sep? string - The separator between each pair of hexadecimal characters. Defaults to an empty string.
+--- @return string The - hexadecimal representation of the input string.
+local function stringToHex(s, ln, sep)
+ if #s == 0 then return "" end
+ if not ln then
+ return (s:gsub('.',
+ function(c) return string.format('%02x', string.byte(c)) end
+ ))
+ end
+ sep = sep or ""
+ local t = {}
+ for i = 1, #s - 1 do
+ t[#t + 1] = string.format("%02x%s", s:byte(i),
+ (i % ln == 0) and '\n' or sep)
+ end
+ t[#t + 1] = string.format("%02x", s:byte(#s))
+ return table.concat(t)
+end
+
+--- Converts a hex encoded string to its corresponding decoded string.
+--- If the optional parameter `unsafe` is defined, it assumes that the hex string is well-formed
+--- (no checks, no whitespace removal). By default, it removes whitespace (including newlines)
+--- and checks that the hex string is well-formed.
+--- @param hs (string) The hex encoded string to be decoded.
+--- @param unsafe (boolean) [optional] If true, assumes the hex string is well-formed.
+--- @return (string) The decoded string.
+local function hexToString(hs, unsafe)
+ local tonumber = tonumber
+ if not unsafe then
+ hs = string.gsub(hs, "%s+", "") -- remove whitespaces
+ if string.find(hs, '[^0-9A-Za-z]') or #hs % 2 ~= 0 then
+ error("invalid hex string")
+ end
+ end
+ local count = string.gsub(hs, '(%x%x)',function(c) return string.char(tonumber(c, 16)) end)
+ return count
+end
+
+return {
+ stringToHex = stringToHex,
+ hexToString = hexToString,
+}
\ No newline at end of file
diff --git a/module/lua/crypto/util/init.lua b/module/lua/crypto/util/init.lua
new file mode 100644
index 0000000..80afdda
--- /dev/null
+++ b/module/lua/crypto/util/init.lua
@@ -0,0 +1,16 @@
+local Bit = require(".crypto.util.bit")
+local Queue = require(".crypto.util.queue")
+local Stream = require(".crypto.util.stream")
+local Hex = require(".crypto.util.hex")
+local Array = require(".crypto.util.array")
+
+local util = {
+ _version = "0.0.1",
+ bit = Bit,
+ queue = Queue,
+ stream = Stream,
+ hex = Hex,
+ array = Array,
+}
+
+return util
diff --git a/module/lua/crypto/util/queue.lua b/module/lua/crypto/util/queue.lua
new file mode 100644
index 0000000..4818192
--- /dev/null
+++ b/module/lua/crypto/util/queue.lua
@@ -0,0 +1,47 @@
+local Queue = function()
+ local queue = {};
+ local tail = 0;
+ local head = 0;
+
+ local public = {};
+
+ public.push = function(obj)
+ queue[head] = obj;
+ head = head + 1;
+ return;
+ end
+
+ public.pop = function()
+ if tail < head
+ then
+ local obj = queue[tail];
+ queue[tail] = nil;
+ tail = tail + 1;
+ return obj;
+ else
+ return nil;
+ end
+ end
+
+ public.size = function()
+ return head - tail;
+ end
+
+ public.getHead = function()
+ return head;
+ end
+
+ public.getTail = function()
+ return tail;
+ end
+
+ public.reset = function()
+ queue = {};
+ head = 0;
+ tail = 0;
+ end
+
+ return public;
+end
+
+return Queue;
\ No newline at end of file
diff --git a/module/lua/crypto/util/stream.lua b/module/lua/crypto/util/stream.lua
new file mode 100644
index 0000000..49d52f5
--- /dev/null
+++ b/module/lua/crypto/util/stream.lua
@@ -0,0 +1,98 @@
+local Queue = require(".crypto.util.queue");
+
+local Stream = {};
+
+
+Stream.fromString = function(string)
+ local i = 0;
+ return function()
+ i = i + 1;
+ return string.byte(string, i);
+ end
+end
+
+
+Stream.toString = function(stream)
+ local array = {};
+ local i = 1;
+
+ local byte = stream();
+ while byte ~= nil do
+ array[i] = string.char(byte);
+ i = i + 1;
+ byte = stream();
+ end
+
+ return table.concat(array);
+end
+
+
+Stream.fromArray = function(array)
+ local queue = Queue();
+ local i = 1;
+
+ local byte = array[i];
+ while byte ~= nil do
+ queue.push(byte);
+ i = i + 1;
+ byte = array[i];
+ end
+
+ return queue.pop;
+end
+
+
+Stream.toArray = function(stream)
+ local array = {};
+ local i = 1;
+
+ local byte = stream();
+ while byte ~= nil do
+ array[i] = byte;
+ i = i + 1;
+ byte = stream();
+ end
+
+ return array;
+end
+
+
+local fromHexTable = {};
+for i = 0, 255 do
+ fromHexTable[string.format("%02X", i)] = i;
+ fromHexTable[string.format("%02x", i)] = i;
+end
+
+Stream.fromHex = function(hex)
+ local queue = Queue();
+
+ for i = 1, string.len(hex) / 2 do
+ local h = string.sub(hex, i * 2 - 1, i * 2);
+ queue.push(fromHexTable[h]);
+ end
+
+ return queue.pop;
+end
+
+
+
+local toHexTable = {};
+for i = 0, 255 do
+ toHexTable[i] = string.format("%02X", i);
+end
+
+Stream.toHex = function(stream)
+ local hex = {};
+ local i = 1;
+
+ local byte = stream();
+ while byte ~= nil do
+ hex[i] = toHexTable[byte];
+ i = i + 1;
+ byte = stream();
+ end
+
+ return table.concat(hex);
+end
+
+return Stream;
\ No newline at end of file
diff --git a/module/lua/default.lua b/module/lua/default.lua
new file mode 100644
index 0000000..54b935a
--- /dev/null
+++ b/module/lua/default.lua
@@ -0,0 +1,22 @@
+-- default handler for aos
+return function (insertInbox)
+ return function (msg)
+ -- Add Message to Inbox
+ insertInbox(msg)
+
+ local txt = Colors.gray .. "New Message From " .. Colors.green ..
+ (msg.From and (msg.From:sub(1,3) .. "..." .. msg.From:sub(-3)) or "unknown") .. Colors.gray .. ": "
+ if msg.Action then
+ txt = txt .. Colors.gray .. (msg.Action and ("Action = " .. Colors.blue .. msg.Action:sub(1,20)) or "") .. Colors.reset
+ else
+ local data = msg.Data
+ if type(data) == 'table' then
+ data = require('json').encode(data)
+ end
+ txt = txt .. Colors.gray .. "Data = " .. Colors.blue .. (data and data:sub(1,20) or "") .. Colors.reset
+ end
+ -- Print to Output
+ print(txt)
+ end
+
+end
\ No newline at end of file
diff --git a/module/lua/dump.lua b/module/lua/dump.lua
new file mode 100644
index 0000000..d59e22f
--- /dev/null
+++ b/module/lua/dump.lua
@@ -0,0 +1,297 @@
+--
+-- Copyright (C) 2018 Masatoshi Teruya
+--
+-- Permission is hereby granted, free of charge, to any person obtaining a copy
+-- of this software and associated documentation files (the "Software"), to deal
+-- in the Software without restriction, including without limitation the rights
+-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+-- copies of the Software, and to permit persons to whom the Software is
+-- furnished to do so, subject to the following conditions:
+--
+-- The above copyright notice and this permission notice shall be included in
+-- all copies or substantial portions of the Software.
+--
+-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+-- THE SOFTWARE.
+--
+-- dump.lua
+-- lua-dump
+-- Created by Masatoshi Teruya on 18/04/22.
+--
+--- file-scope variables
+local type = type
+local floor = math.floor
+local tostring = tostring
+local tblsort = table.sort
+local tblconcat = table.concat
+local strmatch = string.match
+local strformat = string.format
+--- constants
+local INFINITE_POS = math.huge
+local LUA_FIELDNAME_PAT = '^[a-zA-Z_][a-zA-Z0-9_]*$'
+local FOR_KEY = 'key'
+local FOR_VAL = 'val'
+local FOR_CIRCULAR = 'circular'
+local RESERVED_WORD = {
+ -- primitive data
+ ['nil'] = true,
+ ['true'] = true,
+ ['false'] = true,
+ -- declaraton
+ ['local'] = true,
+ ['function'] = true,
+ -- boolean logic
+ ['and'] = true,
+ ['or'] = true,
+ ['not'] = true,
+ -- conditional statement
+ ['if'] = true,
+ ['elseif'] = true,
+ ['else'] = true,
+ -- iteration statement
+ ['for'] = true,
+ ['in'] = true,
+ ['while'] = true,
+ ['until'] = true,
+ ['repeat'] = true,
+ -- jump statement
+ ['break'] = true,
+ ['goto'] = true,
+ ['return'] = true,
+ -- block scope statement
+ ['then'] = true,
+ ['do'] = true,
+ ['end'] = true,
+}
+local DEFAULT_INDENT = 4
+
+--- filter function for dump
+--- @param val any
+--- @param depth integer
+--- @param vtype string
+--- @param use string
+--- @param key any
+--- @param udata any
+--- @return any val
+--- @return boolean nodump
+local function DEFAULT_FILTER(val)
+ return val
+end
+
+--- sort_index
+--- @param a table
+--- @param b table
+local function sort_index(a, b)
+ if a.typ == b.typ then
+ if a.typ == 'boolean' then
+ return b.key
+ end
+
+ return a.key < b.key
+ end
+
+ return a.typ == 'number'
+end
+
+--- dumptbl
+--- @param tbl table
+--- @param depth integer
+--- @param indent string
+--- @param nestIndent string
+--- @param ctx table
+--- @return string
+local function dumptbl(tbl, depth, indent, nestIndent, ctx)
+ local ref = tostring(tbl)
+
+ -- circular reference
+ if ctx.circular[ref] then
+ local val, nodump = ctx.filter(tbl, depth, type(tbl), FOR_CIRCULAR, tbl,
+ ctx.udata)
+
+ if val ~= nil and val ~= tbl then
+ local t = type(val)
+
+ if t == 'table' then
+ -- dump table value
+ if not nodump then
+ return dumptbl(val, depth + 1, indent, nestIndent, ctx)
+ end
+ return tostring(val)
+ elseif t == 'string' then
+ return strformat('%q', val)
+ elseif t == 'number' or t == 'boolean' then
+ return tostring(val)
+ end
+
+ return strformat('%q', tostring(val))
+ end
+
+ return '""'
+ end
+
+ local res = {}
+ local arr = {}
+ local narr = 0
+ local fieldIndent = indent .. nestIndent
+
+ -- save reference
+ ctx.circular[ref] = true
+
+ for k, v in pairs(tbl) do
+ -- check key
+ local key, nokdump = ctx.filter(k, depth, type(k), FOR_KEY, nil,
+ ctx.udata)
+
+ if key ~= nil then
+ -- check val
+ local val, novdump = ctx.filter(v, depth, type(v), FOR_VAL, key,
+ ctx.udata)
+ local kv
+
+ if val ~= nil then
+ local kt = type(key)
+ local vt = type(val)
+
+ -- convert key to suitable to be safely read back
+ -- by the Lua interpreter
+ if kt == 'number' or kt == 'boolean' then
+ k = key
+ key = '[' .. tostring(key) .. ']'
+ -- dump table value
+ elseif kt == 'table' and not nokdump then
+ key = '[' ..
+ dumptbl(key, depth + 1, fieldIndent, nestIndent,
+ ctx) .. ']'
+ k = key
+ kt = 'string'
+ elseif kt ~= 'string' or RESERVED_WORD[key] or
+ not strmatch(key, LUA_FIELDNAME_PAT) then
+ key = strformat("[%q]", tostring(key), v)
+ k = key
+ kt = 'string'
+ end
+
+ -- convert key-val pair to suitable to be safely read back
+ -- by the Lua interpreter
+ if vt == 'number' or vt == 'boolean' then
+ kv = strformat('%s%s = %s', fieldIndent, key, tostring(val))
+ elseif vt == 'string' then
+ -- dump a string-value
+ if not novdump then
+ kv = strformat('%s%s = %q', fieldIndent, key, val)
+ else
+ kv = strformat('%s%s = %s', fieldIndent, key, val)
+ end
+ elseif vt == 'table' and not novdump then
+ kv = strformat('%s%s = %s', fieldIndent, key, dumptbl(val,
+ depth +
+ 1,
+ fieldIndent,
+ nestIndent,
+ ctx))
+ else
+ kv = strformat('%s%s = %q', fieldIndent, key, tostring(val))
+ end
+
+ -- add to array
+ narr = narr + 1
+ arr[narr] = {
+ typ = kt,
+ key = k,
+ val = kv,
+ }
+ end
+ end
+ end
+
+ -- remove reference
+ ctx.circular[ref] = nil
+ -- concat result
+ if narr > 0 then
+ tblsort(arr, sort_index)
+
+ for i = 1, narr do
+ res[i] = arr[i].val
+ end
+ res[1] = '{' .. ctx.LF .. res[1]
+ res = tblconcat(res, ',' .. ctx.LF) .. ctx.LF .. indent .. '}'
+ else
+ res = '{}'
+ end
+
+ return res
+end
+
+--- is_uint
+--- @param v any
+--- @return boolean ok
+local function is_uint(v)
+ return type(v) == 'number' and v < INFINITE_POS and v >= 0 and floor(v) == v
+end
+
+--- dump
+--- @param val any
+--- @param indent integer
+--- @param padding integer
+--- @param filter function
+--- @param udata
+--- @return string
+local function dump(val, indent, padding, filter, udata)
+ local t = type(val)
+
+ -- check indent
+ if indent == nil then
+ indent = DEFAULT_INDENT
+ elseif not is_uint(indent) then
+ error('indent must be unsigned integer', 2)
+ end
+
+ -- check padding
+ if padding == nil then
+ padding = 0
+ elseif not is_uint(padding) then
+ error('padding must be unsigned integer', 2)
+ end
+
+ -- check filter
+ if filter == nil then
+ filter = DEFAULT_FILTER
+ elseif type(filter) ~= 'function' then
+ error('filter must be function', 2)
+ end
+
+ -- dump table
+ if t == 'table' then
+ local ispace = ''
+ local pspace = ''
+
+ if indent > 0 then
+ ispace = strformat('%' .. tostring(indent) .. 's', '')
+ end
+
+ if padding > 0 then
+ pspace = strformat('%' .. tostring(padding) .. 's', '')
+ end
+
+ return dumptbl(val, 1, pspace, ispace, {
+ LF = ispace == '' and ' ' or '\n',
+ circular = {},
+ filter = filter,
+ udata = udata,
+ })
+ end
+
+ -- dump value
+ local v, nodump = filter(val, 0, t, FOR_VAL, nil, udata)
+ if nodump == true then
+ return tostring(v)
+ end
+ return strformat('%q', tostring(v))
+end
+
+return dump
\ No newline at end of file
diff --git a/module/lua/eval.lua b/module/lua/eval.lua
new file mode 100644
index 0000000..957f3e4
--- /dev/null
+++ b/module/lua/eval.lua
@@ -0,0 +1,48 @@
+--- The Eval module provides a handler for evaluating Lua expressions. Returns the eval function.
+-- @module eval
+
+local stringify = require(".stringify")
+
+--- The eval function.
+-- Handler for executing and evaluating Lua expressions.
+-- After execution, the result is stringified and placed in ao.outbox.Output.
+-- @function eval
+-- @tparam {table} ao The ao environment object
+-- @treturn {function} The handler function, which takes a message as an argument.
+-- @see stringify
+return function (ao)
+ return function (msg)
+ -- exec expression
+ local expr = msg.Data
+ local func, err = load("return " .. expr, 'aos', 't', _G)
+ local output = ""
+ local e = nil
+ if err then
+ func, err = load(expr, 'aos', 't', _G)
+ end
+ if func then
+ output, e = func()
+ else
+ ao.outbox.Error = err
+ return
+ end
+ if e then
+ ao.outbox.Error = e
+ return
+ end
+ if HANDLER_PRINT_LOGS and output then
+ table.insert(HANDLER_PRINT_LOGS, type(output) == "table" and stringify.format(output) or tostring(output))
+ else
+ -- set result in outbox.Output (Left for backwards compatibility)
+ ao.outbox.Output = {
+ json = type(output) == "table" and pcall(function () return json.encode(output) end) and output or "undefined",
+ data = {
+ output = type(output) == "table" and stringify.format(output) or output,
+ prompt = Prompt()
+ },
+ prompt = Prompt()
+ }
+
+ end
+ end
+end
diff --git a/module/lua/handlers-utils.lua b/module/lua/handlers-utils.lua
new file mode 100644
index 0000000..3f4b89c
--- /dev/null
+++ b/module/lua/handlers-utils.lua
@@ -0,0 +1,91 @@
+--- The Handler Utils module is a lightweight Lua utility library designed to provide common functionalities for handling and processing messages within the AOS computer system. It offers a set of functions to check message attributes and send replies, simplifying the development of more complex scripts and modules. This document will guide you through the module's functionalities, installation, and usage. Returns the _utils table.
+-- @module handlers-utils
+
+--- The _utils table
+-- @table _utils
+-- @field _version The version number of the _utils module
+-- @field hasMatchingTag The hasMatchingTag function
+-- @field hasMatchingTagOf The hasMatchingTagOf function
+-- @field hasMatchingData The hasMatchingData function
+-- @field reply The reply function
+-- @field continue The continue function
+local _utils = { _version = "0.0.2" }
+
+local _ = require('.utils')
+local ao = require(".ao")
+
+--- Checks if a given message has a tag that matches the specified name and value.
+-- @function hasMatchingTag
+-- @tparam {string} name The tag name to check
+-- @tparam {string} value The value to match for in the tag
+-- @treturn {function} A function that takes a message and returns whether there is a tag match (-1 if matches, 0 otherwise)
+function _utils.hasMatchingTag(name, value)
+ assert(type(name) == 'string' and type(value) == 'string', 'invalid arguments: (name : string, value : string)')
+
+ return function (msg)
+ return msg.Tags[name] == value
+ end
+end
+
+--- Checks if a given message has a tag that matches the specified name and one of the specified values.
+-- @function hasMatchingTagOf
+-- @tparam {string} name The tag name to check
+-- @tparam {string[]} values The list of values of which one should match
+-- @treturn {function} A function that takes a message and returns whether there is a tag match (-1 if matches, 0 otherwise)
+function _utils.hasMatchingTagOf(name, values)
+ assert(type(name) == 'string' and type(values) == 'table', 'invalid arguments: (name : string, values : string[])')
+ return function (msg)
+ for _, value in ipairs(values) do
+ local patternResult = Handlers.utils.hasMatchingTag(name, value)(msg)
+
+ if patternResult ~= 0 and patternResult ~= false and patternResult ~= "skip" then
+ return patternResult
+ end
+ end
+
+ return 0
+ end
+end
+
+--- Checks if a given message has data that matches the specified value.
+-- @function hasMatchingData
+-- @tparam {string} value The value to match against the message data
+-- @treturn {function} A function that takes a message and returns whether the data matches the value (-1 if matches, 0 otherwise)
+function _utils.hasMatchingData(value)
+ assert(type(value) == 'string', 'invalid arguments: (value : string)')
+ return function (msg)
+ return msg.Data == value
+ end
+end
+
+--- Given an input, returns a function that takes a message and replies to it.
+-- @function reply
+-- @tparam {table | string} input The content to send back. If a string, it sends it as data. If a table, it assumes a structure with `Tags`.
+-- @treturn {function} A function that takes a message and replies to it
+function _utils.reply(input)
+ assert(type(input) == 'table' or type(input) == 'string', 'invalid arguments: (input : table or string)')
+ return function (msg)
+ if type(input) == 'string' then
+ msg.reply({ Data = input })
+ return
+ end
+ msg.reply(input)
+ end
+end
+
+--- Inverts the provided pattern's result if it matches, so that it continues execution with the next matching handler.
+-- @function continue
+-- @tparam {table | function} pattern The pattern to check for in the message
+-- @treturn {function} Function that executes the pattern matching function and returns `1` (continue), so that the execution of handlers continues.
+function _utils.continue(pattern)
+ return function (msg)
+ local match = _.matchesSpec(msg, pattern)
+
+ if not match or match == 0 or match == "skip" then
+ return match
+ end
+ return 1
+ end
+end
+
+return _utils
\ No newline at end of file
diff --git a/module/lua/handlers.lua b/module/lua/handlers.lua
new file mode 100644
index 0000000..81fb3d8
--- /dev/null
+++ b/module/lua/handlers.lua
@@ -0,0 +1,384 @@
+--- The Handlers library provides a flexible way to manage and execute a series of handlers based on patterns. Each handler consists of a pattern function, a handle function, and a name. This library is suitable for scenarios where different actions need to be taken based on varying input criteria. Returns the handlers table.
+-- @module handlers
+
+--- The handlers table
+-- @table handlers
+-- @field _version The version number of the handlers module
+-- @field list The list of handlers
+-- @field coroutines The coroutines of the handlers
+-- @field onceNonce The nonce for the once handlers
+-- @field utils The handlers-utils module
+-- @field generateResolver The generateResolver function
+-- @field receive The receive function
+-- @field once The once function
+-- @field add The add function
+-- @field append The append function
+-- @field prepend The prepend function
+-- @field remove The remove function
+-- @field evaluate The evaluate function
+local handlers = { _version = "0.0.5" }
+local coroutine = require('coroutine')
+local utils = require('.utils')
+
+handlers.utils = require('.handlers-utils')
+-- if update we need to keep defined handlers
+if Handlers then
+ handlers.list = Handlers.list or {}
+ handlers.coroutines = Handlers.coroutines or {}
+else
+ handlers.list = {}
+ handlers.coroutines = {}
+
+end
+handlers.onceNonce = 0
+
+--- Given an array, a property name, and a value, returns the index of the object in the array that has the property with the value.
+-- @lfunction findIndexByProp
+-- @tparam {table[]} array The array to search through
+-- @tparam {string} prop The property name to check
+-- @tparam {any} value The value to check for in the property
+-- @treturn {number | nil} The index of the object in the array that has the property with the value, or nil if no such object is found
+local function findIndexByProp(array, prop, value)
+ for index, object in ipairs(array) do
+ if object[prop] == value then
+ return index
+ end
+ end
+ return nil
+end
+
+--- Given a name, a pattern, and a handle, asserts that the arguments are valid.
+-- @lfunction assertAddArgs
+-- @tparam {string} name The name of the handler
+-- @tparam {table | function | string} pattern The pattern to check for in the message
+-- @tparam {function} handle The function to call if the pattern matches
+-- @tparam {number | string | nil} maxRuns The maximum number of times the handler should run, or nil if there is no limit
+local function assertAddArgs(name, pattern, handle, maxRuns)
+ assert(
+ type(name) == 'string' and
+ (type(pattern) == 'function' or type(pattern) == 'table' or type(pattern) == 'string'),
+ 'Invalid arguments given. Expected: \n' ..
+ '\tname : string, ' ..
+ '\tpattern : Action : string | MsgMatch : table,\n' ..
+ '\t\tfunction(msg: Message) : {-1 = break, 0 = skip, 1 = continue},\n' ..
+ '\thandle(msg : Message) : void) | Resolver,\n' ..
+ '\tMaxRuns? : number | "inf" | nil')
+end
+
+--- Given a resolver specification, returns a resolver function.
+-- @function generateResolver
+-- @tparam {table | function} resolveSpec The resolver specification
+-- @treturn {function} A resolver function
+function handlers.generateResolver(resolveSpec)
+ return function(msg)
+ -- If the resolver is a single function, call it.
+ -- Else, find the first matching pattern (by its matchSpec), and exec.
+ if type(resolveSpec) == "function" then
+ return resolveSpec(msg)
+ else
+ for matchSpec, func in pairs(resolveSpec) do
+ if utils.matchesSpec(msg, matchSpec) then
+ return func(msg)
+ end
+ end
+ end
+ end
+end
+
+--- Given a pattern, returns the next message that matches the pattern.
+-- This function uses Lua's coroutines under-the-hood to add a handler, pause,
+-- and then resume the current coroutine. This allows us to effectively block
+-- processing of one message until another is received that matches the pattern.
+-- @function receive
+-- @tparam {table | function} pattern The pattern to check for in the message
+function handlers.receive(pattern)
+ local self = coroutine.running()
+ handlers.once(pattern, function (msg)
+ -- If the result of the resumed coroutine is an error then we should bubble it up to the process
+ local _, success, errmsg = coroutine.resume(self, msg)
+ if not success then
+ error(errmsg)
+ end
+ end)
+ return coroutine.yield(pattern)
+end
+
+--- Given a name, a pattern, and a handle, adds a handler to the list.
+-- If name is not provided, "_once_" prefix plus onceNonce will be used as the name.
+-- Adds handler with maxRuns of 1 such that it will only be called once then removed from the list.
+-- @function once
+-- @tparam {string} name The name of the handler
+-- @tparam {table | function | string} pattern The pattern to check for in the message
+-- @tparam {function} handle The function to call if the pattern matches
+function handlers.once(...)
+ local name, pattern, handle
+ if select("#", ...) == 3 then
+ name = select(1, ...)
+ pattern = select(2, ...)
+ handle = select(3, ...)
+ else
+ name = "_once_" .. tostring(handlers.onceNonce)
+ handlers.onceNonce = handlers.onceNonce + 1
+ pattern = select(1, ...)
+ handle = select(2, ...)
+ end
+ handlers.prepend(name, pattern, handle, 1)
+end
+
+--- Given a name, a pattern, and a handle, adds a handler to the list.
+-- @function add
+-- @tparam {string} name The name of the handler
+-- @tparam {table | function | string} pattern The pattern to check for in the message
+-- @tparam {function} handle The function to call if the pattern matches
+-- @tparam {number | string | nil} maxRuns The maximum number of times the handler should run, or nil if there is no limit
+function handlers.add(...)
+ local name, pattern, handle, maxRuns
+ local args = select("#", ...)
+ if args == 2 then
+ name = select(1, ...)
+ pattern = select(1, ...)
+ handle = select(2, ...)
+ maxRuns = nil
+ elseif args == 3 then
+ name = select(1, ...)
+ pattern = select(2, ...)
+ handle = select(3, ...)
+ maxRuns = nil
+ else
+ name = select(1, ...)
+ pattern = select(2, ...)
+ handle = select(3, ...)
+ maxRuns = select(4, ...)
+ end
+ assertAddArgs(name, pattern, handle, maxRuns)
+
+ handle = handlers.generateResolver(handle)
+
+ -- update existing handler by name
+ local idx = findIndexByProp(handlers.list, "name", name)
+ if idx ~= nil and idx > 0 then
+ -- found update
+ handlers.list[idx].pattern = pattern
+ handlers.list[idx].handle = handle
+ handlers.list[idx].maxRuns = maxRuns
+ else
+ -- not found then add
+ table.insert(handlers.list, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns })
+
+ end
+ return #handlers.list
+end
+
+--- Appends a new handler to the end of the handlers list.
+-- @function append
+-- @tparam {string} name The name of the handler
+-- @tparam {table | function | string} pattern The pattern to check for in the message
+-- @tparam {function} handle The function to call if the pattern matches
+-- @tparam {number | string | nil} maxRuns The maximum number of times the handler should run, or nil if there is no limit
+function handlers.append(...)
+ local name, pattern, handle, maxRuns
+ local args = select("#", ...)
+ if args == 2 then
+ name = select(1, ...)
+ pattern = select(1, ...)
+ handle = select(2, ...)
+ maxRuns = nil
+ elseif args == 3 then
+ name = select(1, ...)
+ pattern = select(2, ...)
+ handle = select(3, ...)
+ maxRuns = nil
+ else
+ name = select(1, ...)
+ pattern = select(2, ...)
+ handle = select(3, ...)
+ maxRuns = select(4, ...)
+ end
+ assertAddArgs(name, pattern, handle, maxRuns)
+
+ handle = handlers.generateResolver(handle)
+ -- update existing handler by name
+ local idx = findIndexByProp(handlers.list, "name", name)
+ if idx ~= nil and idx > 0 then
+ -- found update
+ handlers.list[idx].pattern = pattern
+ handlers.list[idx].handle = handle
+ handlers.list[idx].maxRuns = maxRuns
+ else
+
+ table.insert(handlers.list, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns })
+ end
+
+
+end
+
+--- Prepends a new handler to the beginning of the handlers list.
+-- @function prepend
+-- @tparam {string} name The name of the handler
+-- @tparam {table | function | string} pattern The pattern to check for in the message
+-- @tparam {function} handle The function to call if the pattern matches
+-- @tparam {number | string | nil} maxRuns The maximum number of times the handler should run, or nil if there is no limit
+function handlers.prepend(...)
+ local name, pattern, handle, maxRuns
+ local args = select("#", ...)
+ if args == 2 then
+ name = select(1, ...)
+ pattern = select(1, ...)
+ handle = select(2, ...)
+ maxRuns = nil
+ elseif args == 3 then
+ name = select(1, ...)
+ pattern = select(2, ...)
+ handle = select(3, ...)
+ maxRuns = nil
+ else
+ name = select(1, ...)
+ pattern = select(2, ...)
+ handle = select(3, ...)
+ maxRuns = select(4, ...)
+ end
+ assertAddArgs(name, pattern, handle, maxRuns)
+
+ handle = handlers.generateResolver(handle)
+
+ -- update existing handler by name
+ local idx = findIndexByProp(handlers.list, "name", name)
+ if idx ~= nil and idx > 0 then
+ -- found update
+ handlers.list[idx].pattern = pattern
+ handlers.list[idx].handle = handle
+ handlers.list[idx].maxRuns = maxRuns
+ else
+ table.insert(handlers.list, 1, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns })
+ end
+
+
+end
+
+--- Returns an object that allows adding a new handler before a specified handler.
+-- @function before
+-- @tparam {string} handleName The name of the handler before which the new handler will be added
+-- @treturn {table} An object with an `add` method to insert the new handler
+function handlers.before(handleName)
+ assert(type(handleName) == 'string', 'Handler name MUST be a string')
+
+ local idx = findIndexByProp(handlers.list, "name", handleName)
+ return {
+ add = function (name, pattern, handle, maxRuns)
+ assertAddArgs(name, pattern, handle, maxRuns)
+
+ handle = handlers.generateResolver(handle)
+
+ if idx then
+ table.insert(handlers.list, idx, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns })
+ end
+
+ end
+ }
+end
+
+--- Returns an object that allows adding a new handler after a specified handler.
+-- @function after
+-- @tparam {string} handleName The name of the handler after which the new handler will be added
+-- @treturn {table} An object with an `add` method to insert the new handler
+function handlers.after(handleName)
+ assert(type(handleName) == 'string', 'Handler name MUST be a string')
+ local idx = findIndexByProp(handlers.list, "name", handleName)
+ return {
+ add = function (name, pattern, handle, maxRuns)
+ assertAddArgs(name, pattern, handle, maxRuns)
+
+ handle = handlers.generateResolver(handle)
+
+ if idx then
+ table.insert(handlers.list, idx + 1, { pattern = pattern, handle = handle, name = name, maxRuns = maxRuns })
+ end
+
+ end
+ }
+
+end
+
+--- Removes a handler from the handlers list by name.
+-- @function remove
+-- @tparam {string} name The name of the handler to be removed
+function handlers.remove(name)
+ assert(type(name) == 'string', 'name MUST be string')
+ if #handlers.list == 1 and handlers.list[1].name == name then
+ handlers.list = {}
+
+ end
+
+ local idx = findIndexByProp(handlers.list, "name", name)
+ if idx ~= nil and idx > 0 then
+ table.remove(handlers.list, idx)
+ end
+
+end
+
+--- Evaluates each handler against a given message and environment. Handlers are called in the order they appear in the handlers list.
+-- Return 0 to not call handler, -1 to break after handler is called, 1 to continue
+-- @function evaluate
+-- @tparam {table} msg The message to be processed by the handlers.
+-- @tparam {table} env The environment in which the handlers are executed.
+-- @treturn The response from the handler(s). Returns a default message if no handler matches.
+function handlers.evaluate(msg, env)
+ local handled = false
+ assert(type(msg) == 'table', 'msg is not valid')
+ assert(type(env) == 'table', 'env is not valid')
+
+ for _, o in ipairs(handlers.list) do
+ if o.name ~= "_default" then
+ local match = utils.matchesSpec(msg, o.pattern)
+ if not (type(match) == 'number' or type(match) == 'string' or type(match) == 'boolean') then
+ error("Pattern result is not valid, it MUST be string, number, or boolean")
+ end
+
+ -- handle boolean returns
+ if type(match) == "boolean" and match == true then
+ match = -1
+ elseif type(match) == "boolean" and match == false then
+ match = 0
+ end
+
+ -- handle string returns
+ if type(match) == "string" then
+ if match == "continue" then
+ match = 1
+ elseif match == "break" then
+ match = -1
+ else
+ match = 0
+ end
+ end
+
+ if match ~= 0 then
+ if match < 0 then
+ handled = true
+ end
+ -- each handle function can accept, the msg, env
+ local status, err = pcall(o.handle, msg, env)
+ if not status then
+ error(err)
+ end
+ -- remove handler if maxRuns is reached. maxRuns can be either a number or "inf"
+ if o.maxRuns ~= nil and o.maxRuns ~= "inf" then
+ o.maxRuns = o.maxRuns - 1
+ if o.maxRuns == 0 then
+ handlers.remove(o.name)
+ end
+ end
+ end
+ if match < 0 then
+ return handled
+ end
+ end
+ end
+ -- do default
+ if not handled then
+ local idx = findIndexByProp(handlers.list, "name", "_default")
+ handlers.list[idx].handle(msg,env)
+ end
+end
+
+return handlers
diff --git a/module/lua/pretty.lua b/module/lua/pretty.lua
new file mode 100644
index 0000000..57cbee7
--- /dev/null
+++ b/module/lua/pretty.lua
@@ -0,0 +1,32 @@
+--- The Pretty module provides a utility for printing Lua tables in a more readable format.
+-- @module pretty
+
+--- The pretty module
+-- @table pretty
+-- @field _version The version number of the pretty module
+-- @field tprint The tprint function
+local pretty = { _version = "0.0.1" }
+
+--- Prints a table with indentation for better readability.
+-- @function tprint
+-- @tparam {table} tbl The table to print
+-- @tparam {number} indent The indentation level (default is 0)
+-- @treturn {string} A string representation of the table with indentation
+pretty.tprint = function (tbl, indent)
+ if not indent then indent = 0 end
+ local output = ""
+ for k, v in pairs(tbl) do
+ local formatting = string.rep(" ", indent) .. k .. ": "
+ if type(v) == "table" then
+ output = output .. formatting .. "\n"
+ output = output .. pretty.tprint(v, indent+1)
+ elseif type(v) == 'boolean' then
+ output = output .. formatting .. tostring(v) .. "\n"
+ else
+ output = output .. formatting .. v .. "\n"
+ end
+ end
+ return output
+end
+
+return pretty
\ No newline at end of file
diff --git a/module/lua/process.lua b/module/lua/process.lua
new file mode 100644
index 0000000..a4ed0c9
--- /dev/null
+++ b/module/lua/process.lua
@@ -0,0 +1,489 @@
+if not _G.package.loaded['weavedb'] then _G.package.loaded['weavedb'] = require('.weavedb') end
+
+--- The Process library provides an environment for managing and executing processes on the AO network. It includes capabilities for handling messages, spawning processes, and customizing the environment with programmable logic and handlers. Returns the process table.
+-- @module process
+
+-- @dependencies
+local pretty = require('.pretty')
+local base64 = require('.base64')
+local json = require('json')
+local chance = require('.chance')
+local crypto = require('.crypto.init')
+local coroutine = require('coroutine')
+-- set alias ao for .ao library
+if not _G.package.loaded['ao'] then _G.package.loaded['ao'] = require('.ao') end
+
+Colors = {
+ red = "\27[31m",
+ green = "\27[32m",
+ blue = "\27[34m",
+ reset = "\27[0m",
+ gray = "\27[90m"
+}
+
+Bell = "\x07"
+
+Dump = require('.dump')
+Utils = require('.utils')
+Handlers = require('.handlers')
+local stringify = require(".stringify")
+local assignment = require('.assignment')
+ao = nil
+if _G.package.loaded['.ao'] then
+ ao = require('.ao')
+elseif _G.package.loaded['ao'] then
+ ao = require('ao')
+end
+-- Implement assignable polyfills on _ao
+assignment.init(ao)
+
+--- The process table
+-- @table process
+-- @field _version The version number of the process
+
+local process = { _version = "2.0.1" }
+-- The maximum number of messages to store in the inbox
+local maxInboxCount = 10000
+
+-- wrap ao.send and ao.spawn for magic table
+local aosend = ao.send
+local aospawn = ao.spawn
+
+ao.send = function (msg)
+ if msg.Data and type(msg.Data) == 'table' then
+ msg['Content-Type'] = 'application/json'
+ msg.Data = require('json').encode(msg.Data)
+ end
+ return aosend(msg)
+end
+ao.spawn = function (module, msg)
+ if msg.Data and type(msg.Data) == 'table' then
+ msg['Content-Type'] = 'application/json'
+ msg.Data = require('json').encode(msg.Data)
+ end
+ return aospawn(module, msg)
+end
+
+--- Remove the last three lines from a string
+-- @lfunction removeLastThreeLines
+-- @tparam {string} input The string to remove the last three lines from
+-- @treturn {string} The string with the last three lines removed
+local function removeLastThreeLines(input)
+ local lines = {}
+ for line in input:gmatch("([^\n]*)\n?") do
+ table.insert(lines, line)
+ end
+
+ -- Remove the last three lines
+ for i = 1, 3 do
+ table.remove(lines)
+ end
+
+ -- Concatenate the remaining lines
+ return table.concat(lines, "\n")
+end
+
+--- Insert a message into the inbox and manage overflow
+-- @lfunction insertInbox
+-- @tparam {table} msg The message to insert into the inbox
+local function insertInbox(msg)
+ table.insert(Inbox, msg)
+ if #Inbox > maxInboxCount then
+ local overflow = #Inbox - maxInboxCount
+ for i = 1,overflow do
+ table.remove(Inbox, 1)
+ end
+ end
+end
+
+--- Find an object in an array by a given key and value
+-- @lfunction findObject
+-- @tparam {table} array The array to search through
+-- @tparam {string} key The key to search for
+-- @tparam {any} value The value to search for
+local function findObject(array, key, value)
+ for i, object in ipairs(array) do
+ if object[key] == value then
+ return object
+ end
+ end
+ return nil
+end
+
+--- Convert a message's tags to a table of key-value pairs
+-- @function Tab
+-- @tparam {table} msg The message containing tags
+-- @treturn {table} A table with tag names as keys and their values
+function Tab(msg)
+ local inputs = {}
+ for _, o in ipairs(msg.Tags) do
+ if not inputs[o.name] then
+ inputs[o.name] = o.value
+ end
+ end
+ return inputs
+end
+
+--- Generate a prompt string for the current process
+-- @function Prompt
+-- @treturn {string} The custom command prompt string
+function Prompt()
+ return Colors.green .. Name .. Colors.gray
+ .. "@" .. Colors.blue .. "aos-" .. process._version .. Colors.gray
+ .. "[Inbox:" .. Colors.red .. tostring(#Inbox) .. Colors.gray
+ .. "]" .. Colors.reset .. "> "
+end
+
+--- Print a value, formatting tables and converting non-string types
+-- @function print
+-- @tparam {any} a The value to print
+function print(a)
+ if type(a) == "table" then
+ a = stringify.format(a)
+ end
+ --[[
+In order to print non string types we need to convert to string
+ ]]
+ if type(a) == "boolean" then
+ a = Colors.blue .. tostring(a) .. Colors.reset
+ end
+ if type(a) == "nil" then
+ a = Colors.red .. tostring(a) .. Colors.reset
+ end
+ if type(a) == "number" then
+ a = Colors.green .. tostring(a) .. Colors.reset
+ end
+
+ local data = a
+ if ao.outbox.Output.data then
+ data = ao.outbox.Output.data .. "\n" .. a
+ end
+ ao.outbox.Output = { data = data, prompt = Prompt(), print = true }
+
+ -- Only supported for newer version of AOS
+ if HANDLER_PRINT_LOGS then
+ table.insert(HANDLER_PRINT_LOGS, a)
+ return nil
+ end
+
+ return tostring(a)
+end
+
+--- Send a message to a target process
+-- @function Send
+-- @tparam {table} msg The message to send
+function Send(msg)
+ if not msg.Target then
+ print("WARN: No target specified for message. Data will be stored, but no process will receive it.")
+ end
+ local result = ao.send(msg)
+ return {
+ output = "Message added to outbox",
+ receive = result.receive,
+ onReply = result.onReply
+ }
+end
+
+--- Spawn a new process
+-- @function Spawn
+-- @tparam {...any} args The arguments to pass to the spawn function
+function Spawn(...)
+ local module, spawnMsg
+
+ if select("#", ...) == 1 then
+ spawnMsg = select(1, ...)
+ module = ao._module
+ else
+ module = select(1, ...)
+ spawnMsg = select(2, ...)
+ end
+
+ if not spawnMsg then
+ spawnMsg = {}
+ end
+ local result = ao.spawn(module, spawnMsg)
+ return {
+ output = "Spawn process request added to outbox",
+ after = result.after,
+ receive = result.receive
+ }
+end
+
+--- Calls Handlers.receive with the provided pattern criteria, awaiting a message that matches the criteria.
+-- @function Receive
+-- @tparam {table} match The pattern criteria for the message
+-- @treturn {any} The result of the message handling
+function Receive(match)
+ return Handlers.receive(match)
+end
+
+--- Assigns based on the assignment passed.
+-- @function Assign
+-- @tparam {table} assignment The assignment to be made
+function Assign(assignment)
+ if not ao.assign then
+ print("Assign is not implemented.")
+ return "Assign is not implemented."
+ end
+ ao.assign(assignment)
+ print("Assignment added to outbox.")
+ return 'Assignment added to outbox.'
+end
+
+Seeded = Seeded or false
+
+--- Converts a string to a seed value
+-- @lfunction stringToSeed
+-- @tparam {string} s The string to convert to a seed
+-- @treturn {number} The seed value
+-- this is a temporary approach...
+local function stringToSeed(s)
+ local seed = 0
+ for i = 1, #s do
+ local char = string.byte(s, i)
+ seed = seed + char
+ end
+ return seed
+end
+
+--- Initializes or updates the state of the process based on the incoming message and environment.
+-- @lfunction initializeState
+-- @tparam {table} msg The message to initialize the state with
+-- @tparam {table} env The environment to initialize the state with
+local function initializeState(msg, env)
+ if not Seeded then
+ chance.seed(tonumber(msg['Block-Height'] .. stringToSeed(msg.Owner .. msg.Module .. msg.Id)))
+ math.random = function (...)
+ local args = {...}
+ local n = #args
+ if n == 0 then
+ return chance.random()
+ end
+ if n == 1 then
+ return chance.integer(1, args[1])
+ end
+ if n == 2 then
+ return chance.integer(args[1], args[2])
+ end
+ return chance.random()
+ end
+ Seeded = true
+ end
+ Errors = Errors or {}
+ Inbox = Inbox or {}
+
+ -- temporary fix for Spawn
+ if not Owner then
+ local _from = findObject(env.Process.Tags, "name", "From-Process")
+ if _from then
+ Owner = _from.value
+ else
+ Owner = msg.From
+ end
+ end
+
+ if not Name then
+ local aosName = findObject(env.Process.Tags, "name", "Name")
+ if aosName then
+ Name = aosName.value
+ else
+ Name = 'aos'
+ end
+ end
+
+end
+
+--- Prints the version of the process
+-- @function Version
+function Version()
+ print("version: " .. process._version)
+end
+
+--- Main handler for processing incoming messages. It initializes the state, processes commands, and handles message evaluation and inbox management.
+-- @function handle
+-- @tparam {table} msg The message to handle
+-- @tparam {table} _ The environment to handle the message in
+function process.handle(msg, _)
+ local env = nil
+ if _.Process then
+ env = _
+ else
+ env = _.env
+ end
+
+ ao.init(env)
+ -- relocate custom tags to root message
+ msg = ao.normalize(msg)
+ -- set process id
+ ao.id = ao.env.Process.Id
+ initializeState(msg, ao.env)
+ HANDLER_PRINT_LOGS = {}
+
+ -- set os.time to return msg.Timestamp
+ os.time = function () return msg.Timestamp end
+
+ -- tagify msg
+ msg.TagArray = msg.Tags
+ msg.Tags = Tab(msg)
+ -- tagify Process
+ ao.env.Process.TagArray = ao.env.Process.Tags
+ ao.env.Process.Tags = Tab(ao.env.Process)
+ -- magic table - if Content-Type == application/json - decode msg.Data to a Table
+ if msg.Tags['Content-Type'] and msg.Tags['Content-Type'] == 'application/json' then
+ msg.Data = require('json').decode(msg.Data or "{}")
+ end
+ -- init Errors
+ Errors = Errors or {}
+ -- clear Outbox
+ ao.clearOutbox()
+
+ -- Only trust messages from a signed owner or an Authority
+ if msg.From ~= msg.Owner and not ao.isTrusted(msg) then
+ if msg.From ~= ao.id then
+ Send({Target = msg.From, Data = "Message is not trusted by this process!"})
+ end
+ print('Message is not trusted! From: ' .. msg.From .. ' - Owner: ' .. msg.Owner)
+ return ao.result({ })
+ end
+
+ if ao.isAssignment(msg) and not ao.isAssignable(msg) then
+ if msg.From ~= ao.id then
+ Send({Target = msg.From, Data = "Assignment is not trusted by this process!"})
+ end
+ print('Assignment is not trusted! From: ' .. msg.From .. ' - Owner: ' .. msg.Owner)
+ return ao.result({ })
+ end
+
+ Handlers.add("_eval",
+ function (msg)
+ return msg.Action == "Eval" and Owner == msg.From
+ end,
+ require('.eval')(ao)
+ )
+
+ -- Added for aop6 boot loader
+ -- See: https://github.com/permaweb/aos/issues/342
+ Handlers.once("_boot",
+ function (msg)
+ return msg.Tags.Type == "Process" and Owner == msg.From
+ end,
+ require('.boot')(ao)
+ )
+
+ Handlers.append("_default", function () return true end, require('.default')(insertInbox))
+
+ -- call evaluate from handlers passing env
+ msg.reply =
+ function(replyMsg)
+ replyMsg.Target = msg["Reply-To"] or (replyMsg.Target or msg.From)
+ replyMsg["X-Reference"] = msg["X-Reference"] or msg.Reference
+ replyMsg["X-Origin"] = msg["X-Origin"] or nil
+
+ return ao.send(replyMsg)
+ end
+
+ msg.forward =
+ function(target, forwardMsg)
+ -- Clone the message and add forwardMsg tags
+ local newMsg = ao.sanitize(msg)
+ forwardMsg = forwardMsg or {}
+
+ for k,v in pairs(forwardMsg) do
+ newMsg[k] = v
+ end
+
+ -- Set forward-specific tags
+ newMsg.Target = target
+ newMsg["Reply-To"] = msg["Reply-To"] or msg.From
+ newMsg["X-Reference"] = msg["X-Reference"] or msg.Reference
+ newMsg["X-Origin"] = msg["X-Origin"] or msg.From
+ -- clear functions
+ newMsg.reply = nil
+ newMsg.forward = nil
+
+ ao.send(newMsg)
+ end
+
+ local co = coroutine.create(
+ function()
+ return pcall(Handlers.evaluate, msg, env)
+ end
+ )
+ local _, status, result = coroutine.resume(co)
+
+ -- Make sure we have a reference to the coroutine if it will wake up.
+ -- Simultaneously, prune any dead coroutines so that they can be
+ -- freed by the garbage collector.
+ table.insert(Handlers.coroutines, co)
+ for i, x in ipairs(Handlers.coroutines) do
+ if coroutine.status(x) == "dead" then
+ table.remove(Handlers.coroutines, i)
+ end
+ end
+
+ if not status then
+ if (msg.Action == "Eval") then
+ table.insert(Errors, result)
+ local printData = table.concat(HANDLER_PRINT_LOGS, "\n")
+ return { Error = printData .. '\n\n' .. Colors.red .. 'error:\n' .. Colors.reset .. result }
+ end
+ --table.insert(Errors, result)
+ --ao.outbox.Output.data = ""
+ if msg.Action then
+ print(Colors.red .. "Error" .. Colors.gray .. " handling message with Action = " .. msg.Action .. Colors.reset)
+ else
+ print(Colors.red .. "Error" .. Colors.gray .. " handling message " .. Colors.reset)
+ end
+ print(Colors.green .. result .. Colors.reset)
+ print("\n" .. Colors.gray .. removeLastThreeLines(debug.traceback()) .. Colors.reset)
+ local printData = table.concat(HANDLER_PRINT_LOGS, "\n")
+ return ao.result({Error = printData .. '\n\n' .. Colors.red .. 'error:\n' .. Colors.reset .. result, Messages = {}, Spawns = {}, Assignments = {} })
+ end
+
+ if msg.Action == "Eval" then
+ local response = ao.result({
+ Output = {
+ data = table.concat(HANDLER_PRINT_LOGS, "\n"),
+ prompt = Prompt(),
+ test = Dump(HANDLER_PRINT_LOGS)
+ }
+ })
+ HANDLER_PRINT_LOGS = {} -- clear logs
+ return response
+ elseif msg.Tags.Type == "Process" and Owner == msg.From then
+ local response = ao.result({
+ Output = {
+ data = table.concat(HANDLER_PRINT_LOGS, "\n"),
+ prompt = Prompt(),
+ print = true
+ }
+ })
+ HANDLER_PRINT_LOGS = {} -- clear logs
+ return response
+
+ -- local response = nil
+
+ -- -- detect if there was any output from the boot loader call
+ -- for _, value in pairs(HANDLER_PRINT_LOGS) do
+ -- if value ~= "" then
+ -- -- there was output from the Boot Loader eval so we want to print it
+ -- response = ao.result({ Output = { data = table.concat(HANDLER_PRINT_LOGS, "\n"), prompt = Prompt(), print = true } })
+ -- break
+ -- end
+ -- end
+
+ -- if response == nil then
+ -- -- there was no output from the Boot Loader eval, so we shouldn't print it
+ -- response = ao.result({ Output = { data = "", prompt = Prompt() } })
+ -- end
+
+ -- HANDLER_PRINT_LOGS = {} -- clear logs
+ -- return response
+ else
+ local response = ao.result({ Output = { data = table.concat(HANDLER_PRINT_LOGS, "\n"), prompt = Prompt(), print = true } })
+ HANDLER_PRINT_LOGS = {} -- clear logs
+ return response
+ end
+end
+
+return process
diff --git a/module/lua/stringify.lua b/module/lua/stringify.lua
new file mode 100644
index 0000000..e3c46fb
--- /dev/null
+++ b/module/lua/stringify.lua
@@ -0,0 +1,103 @@
+--- The Stringify module provides utilities for formatting and displaying Lua tables in a more readable manner. Returns the stringify table.
+-- @module stringify
+
+--- The stringify table
+-- @table stringify
+-- @field _version The version number of the stringify module
+-- @field isSimpleArray The isSimpleArray function
+-- @field format The format function
+local stringify = { _version = "0.0.1" }
+
+-- ANSI color codes
+local colors = {
+ red = "\27[31m",
+ green = "\27[32m",
+ blue = "\27[34m",
+ reset = "\27[0m"
+}
+
+--- Checks if a table is a simple array (i.e., an array with consecutive numeric keys starting from 1).
+-- @function isSimpleArray
+-- @tparam {table} tbl The table to check
+-- @treturn {boolean} Whether the table is a simple array
+function stringify.isSimpleArray(tbl)
+ local arrayIndex = 1
+ for k, v in pairs(tbl) do
+ if k ~= arrayIndex or (type(v) ~= "number" and type(v) ~= "string") then
+ return false
+ end
+ arrayIndex = arrayIndex + 1
+ end
+ return true
+end
+
+--- Formats a table for display, handling circular references and formatting strings and tables recursively.
+-- @function format
+-- @tparam {table} tbl The table to format
+-- @tparam {number} indent The indentation level (default is 0)
+-- @tparam {table} visited A table to track visited tables and detect circular references (optional)
+-- @treturn {string} A string representation of the table
+function stringify.format(tbl, indent, visited)
+ indent = indent or 0
+ local toIndent = string.rep(" ", indent)
+ local toIndentChild = string.rep(" ", indent + 2)
+
+ local result = {}
+ local isArray = true
+ local arrayIndex = 1
+
+ if stringify.isSimpleArray(tbl) then
+ for _, v in ipairs(tbl) do
+ if type(v) == "string" then
+ v = colors.green .. '"' .. v .. '"' .. colors.reset
+ else
+ v = colors.blue .. tostring(v) .. colors.reset
+ end
+ table.insert(result, v)
+ end
+ return "{ " .. table.concat(result, ", ") .. " }"
+ end
+
+ for k, v in pairs(tbl) do
+ if isArray then
+ if k == arrayIndex then
+ arrayIndex = arrayIndex + 1
+ if type(v) == "table" then
+ v = stringify.format(v, indent + 2)
+ elseif type(v) == "string" then
+ v = colors.green .. '"' .. v .. '"' .. colors.reset
+ else
+ v = colors.blue .. tostring(v) .. colors.reset
+ end
+ table.insert(result, toIndentChild .. v)
+ else
+ isArray = false
+ result = {}
+ end
+ end
+ if not isArray then
+ if type(v) == "table" then
+ visited = visited or {}
+ if visited[v] then
+ return ""
+ end
+ visited[v] = true
+
+ v = stringify.format(v, indent + 2, visited)
+ elseif type(v) == "string" then
+ v = colors.green .. '"' .. v .. '"' .. colors.reset
+ else
+ v = colors.blue .. tostring(v) .. colors.reset
+ end
+ k = colors.red .. k .. colors.reset
+ table.insert(result, toIndentChild .. k .. " = " .. v)
+ end
+ end
+
+ local prefix = isArray and "{\n" or "{\n "
+ local suffix = isArray and "\n" .. toIndent .. " }" or "\n" .. toIndent .. "}"
+ local separator = isArray and ",\n" or ",\n "
+ return prefix .. table.concat(result, separator) .. suffix
+end
+
+return stringify
diff --git a/module/lua/utils.lua b/module/lua/utils.lua
new file mode 100644
index 0000000..eed82c0
--- /dev/null
+++ b/module/lua/utils.lua
@@ -0,0 +1,367 @@
+--- The Utils module provides a collection of utility functions for functional programming in Lua. It includes functions for array manipulation such as concatenation, mapping, reduction, filtering, and finding elements, as well as a property equality checker.
+-- @module utils
+
+--- The utils table
+-- @table utils
+-- @field _version The version number of the utils module
+-- @field matchesPattern The matchesPattern function
+-- @field matchesSpec The matchesSpec function
+-- @field curry The curry function
+-- @field concat The concat function
+-- @field reduce The reduce function
+-- @field map The map function
+-- @field filter The filter function
+-- @field find The find function
+-- @field propEq The propEq function
+-- @field reverse The reverse function
+-- @field compose The compose function
+-- @field prop The prop function
+-- @field includes The includes function
+-- @field keys The keys function
+-- @field values The values function
+local utils = { _version = "0.0.5" }
+
+--- Given a pattern, a value, and a message, returns whether there is a pattern match.
+-- @usage utils.matchesPattern(pattern, value, msg)
+-- @param pattern The pattern to match
+-- @param value The value to check for in the pattern
+-- @param msg The message to check for the pattern
+-- @treturn {boolean} Whether there is a pattern match
+function utils.matchesPattern(pattern, value, msg)
+ -- If the key is not in the message, then it does not match
+ if (not pattern) then
+ return false
+ end
+ -- if the patternMatchSpec is a wildcard, then it always matches
+ if pattern == '_' then
+ return true
+ end
+ -- if the patternMatchSpec is a function, then it is executed on the tag value
+ if type(pattern) == "function" then
+ if pattern(value, msg) then
+ return true
+ else
+ return false
+ end
+ end
+
+ -- if the patternMatchSpec is a string, check it for special symbols (less `-` alone)
+ -- and exact string match mode
+ if (type(pattern) == 'string') then
+ if string.match(pattern, "[%^%$%(%)%%%.%[%]%*%+%?]") then
+ if string.match(value, pattern) then
+ return true
+ end
+ else
+ if value == pattern then
+ return true
+ end
+ end
+ end
+
+ -- if the pattern is a table, recursively check if any of its sub-patterns match
+ if type(pattern) == 'table' then
+ for _, subPattern in pairs(pattern) do
+ if utils.matchesPattern(subPattern, value, msg) then
+ return true
+ end
+ end
+ end
+
+ return false
+end
+
+--- Given a message and a spec, returns whether there is a spec match.
+-- @usage utils.matchesSpec(msg, spec)
+-- @param msg The message to check for the spec
+-- @param spec The spec to check for in the message
+-- @treturn {boolean} Whether there is a spec match
+function utils.matchesSpec(msg, spec)
+ if type(spec) == 'function' then
+ return spec(msg)
+ -- If the spec is a table, step through every key/value pair in the pattern and check if the msg matches
+ -- Supported pattern types:
+ -- - Exact string match
+ -- - Lua gmatch string
+ -- - '_' (wildcard: Message has tag, but can be any value)
+ -- - Function execution on the tag, optionally using the msg as the second argument
+ -- - Table of patterns, where ANY of the sub-patterns matching the tag will result in a match
+ end
+ if type(spec) == 'table' then
+ for key, pattern in pairs(spec) do
+ -- The key can either be in the top level of the 'msg' object or within the 'Tags'
+
+ local msgValue = msg[key]
+ local msgTagValue = msg['Tags'] and msg['Tags'][key]
+
+ if not msgValue and not msgTagValue then
+ return false
+ end
+
+ local matchesMsgValue = utils.matchesPattern(pattern, msgValue, msg)
+ local matchesMsgTagValue = utils.matchesPattern(pattern, msgTagValue, msg)
+
+ if not matchesMsgValue and not matchesMsgTagValue then
+ return false
+ end
+ end
+ return true
+ end
+
+ if type(spec) == 'string' and msg.Action and msg.Action == spec then
+ return true
+ end
+ return false
+end
+
+--- Given a table, returns whether it is an array.
+-- An 'array' is defined as a table with integer keys starting from 1 and
+-- having no gaps between the keys.
+-- @lfunction isArray
+-- @param table The table to check
+-- @treturn {boolean} Whether the table is an array
+local function isArray(table)
+ if type(table) == "table" then
+ local maxIndex = 0
+ for k, v in pairs(table) do
+ if type(k) ~= "number" or k < 1 or math.floor(k) ~= k then
+ return false -- If there's a non-integer key, it's not an array
+ end
+ maxIndex = math.max(maxIndex, k)
+ end
+ -- If the highest numeric index is equal to the number of elements, it's an array
+ return maxIndex == #table
+ end
+ return false
+end
+
+--- Curries a function.
+-- @tparam {function} fn The function to curry
+-- @tparam {number} arity The arity of the function
+-- @treturn {function} The curried function
+utils.curry = function (fn, arity)
+ assert(type(fn) == "function", "function is required as first argument")
+ arity = arity or debug.getinfo(fn, "u").nparams
+ if arity < 2 then return fn end
+
+ return function (...)
+ local args = {...}
+
+ if #args >= arity then
+ return fn(table.unpack(args))
+ else
+ return utils.curry(function (...)
+ return fn(table.unpack(args), ...)
+ end, arity - #args)
+ end
+ end
+end
+
+--- Concat two Array Tables
+-- @function concat
+-- @usage utils.concat(a)(b)
+-- @usage utils.concat({1, 2})({3, 4}) --> {1, 2, 3, 4}
+-- @tparam {table} a The first array
+-- @tparam {table} b The second array
+-- @treturn {table} The concatenated array
+utils.concat = utils.curry(function (a, b)
+ assert(type(a) == "table", "first argument should be a table that is an array")
+ assert(type(b) == "table", "second argument should be a table that is an array")
+ assert(isArray(a), "first argument should be a table")
+ assert(isArray(b), "second argument should be a table")
+
+ local result = {}
+ for i = 1, #a do
+ result[#result + 1] = a[i]
+ end
+ for i = 1, #b do
+ result[#result + 1] = b[i]
+ end
+ return result
+end, 2)
+
+--- Applies a function to each element of a table, reducing it to a single value.
+-- @function utils.reduce
+-- @usage utils.reduce(fn)(initial)(t)
+-- @usage utils.reduce(function(acc, x) return acc + x end)(0)({1, 2, 3}) --> 6
+-- @tparam {function} fn The function to apply
+-- @param initial The initial value
+-- @tparam {table} t The table to reduce
+-- @return The reduced value
+utils.reduce = utils.curry(function (fn, initial, t)
+ assert(type(fn) == "function", "first argument should be a function that accepts (result, value, key)")
+ assert(type(t) == "table" and isArray(t), "third argument should be a table that is an array")
+ local result = initial
+ for k, v in pairs(t) do
+ if result == nil then
+ result = v
+ else
+ result = fn(result, v, k)
+ end
+ end
+ return result
+end, 3)
+
+--- Applies a function to each element of an array table, mapping it to a new value.
+-- @function utils.map
+-- @usage utils.map(fn)(t)
+-- @usage utils.map(function(x) return x * 2 end)({1, 2, 3}) --> {2, 4, 6}
+-- @tparam {function} fn The function to apply to each element
+-- @tparam {table} data The table to map over
+-- @treturn {table} The mapped table
+utils.map = utils.curry(function (fn, data)
+ assert(type(fn) == "function", "first argument should be a unary function")
+ assert(type(data) == "table" and isArray(data), "second argument should be an Array")
+
+ local function map (result, v, k)
+ result[k] = fn(v, k)
+ return result
+ end
+
+ return utils.reduce(map, {}, data)
+end, 2)
+
+--- Filters an array table based on a predicate function.
+-- @function utils.filter
+-- @usage utils.filter(fn)(t)
+-- @usage utils.filter(function(x) return x > 1 end)({1, 2, 3}) --> {2,3}
+-- @tparam {function} fn The predicate function to determine if an element should be included.
+-- @tparam {table} data The array to filter
+-- @treturn {table} The filtered table
+utils.filter = utils.curry(function (fn, data)
+ assert(type(fn) == "function", "first argument should be a unary function")
+ assert(type(data) == "table" and isArray(data), "second argument should be an Array")
+
+ local function filter (result, v, _k)
+ if fn(v) then
+ table.insert(result, v)
+ end
+ return result
+ end
+
+ return utils.reduce(filter,{}, data)
+end, 2)
+
+--- Finds the first element in an array table that satisfies a predicate function.
+-- @function utils.find
+-- @usage utils.find(fn)(t)
+-- @usage utils.find(function(x) return x > 1 end)({1, 2, 3}) --> 2
+-- @tparam {function} fn The predicate function to determine if an element should be included.
+-- @tparam {table} t The array table to search
+-- @treturn The first element that satisfies the predicate function
+utils.find = utils.curry(function (fn, t)
+ assert(type(fn) == "function", "first argument should be a unary function")
+ assert(type(t) == "table", "second argument should be a table that is an array")
+ for _, v in pairs(t) do
+ if fn(v) then
+ return v
+ end
+ end
+end, 2)
+
+--- Checks if a property of an object is equal to a value.
+-- @function utils.propEq
+-- @usage utils.propEq(propName)(value)(object)
+-- @usage utils.propEq("name")("Lua")({name = "Lua"}) --> true
+-- @tparam {string} propName The property name to check
+-- @tparam {string} value The value to check against
+-- @tparam {table} object The object to check
+-- @treturn {boolean} Whether the property is equal to the value
+utils.propEq = utils.curry(function (propName, value, object)
+ assert(type(propName) == "string", "first argument should be a string")
+ assert(type(value) == "string", "second argument should be a string")
+ assert(type(object) == "table", "third argument should be a table