From cc2be88ef568d756e37b0851c3fb5cf01004fc15 Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Fri, 28 Mar 2025 20:30:47 -0400 Subject: [PATCH 01/25] feat(cli): install pinned nightly toolchain automatically (#1541) `cargo openvm build` will use `rustup` to check if the required nightly toolchain and `rust-src` component are installed, and will install them if they are not. If this step fails, then the entire build process errors (I wasn't sure if this was the preferred behavior or if we should let the rest of the cargo build attempt continue, but it felt like for earlier stopping and debugging it's better to fail the process). Updated only the cli workflow because in multithreaded tests, I don't want it to try to install the toolchain in multiple threads simultaneously. closes INT-2911 --- .github/workflows/cli.yml | 4 -- crates/toolchain/build/src/lib.rs | 83 +++++++++++++++++++++++++++++-- 2 files changed, 79 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml index 9cf0443e8d..1447bdcf83 100644 --- a/.github/workflows/cli.yml +++ b/.github/workflows/cli.yml @@ -39,10 +39,6 @@ jobs: - name: Install solc # svm should support arm64 linux run: (hash svm 2>/dev/null || cargo install --version 0.2.23 svm-rs) && svm install 0.8.19 && solc --version - - name: Install tools - run: | - rustup component add rust-src --toolchain nightly-2025-02-14 - - name: Install cargo-openvm working-directory: crates/cli run: | diff --git a/crates/toolchain/build/src/lib.rs b/crates/toolchain/build/src/lib.rs index e4450e7d41..ce8844f3df 100644 --- a/crates/toolchain/build/src/lib.rs +++ b/crates/toolchain/build/src/lib.rs @@ -269,6 +269,13 @@ pub fn build_guest_package( return Err(None); } + // Check if the required toolchain and rust-src component are installed, and if not, install them. + // This requires that `rustup` is installed. + if let Err(code) = ensure_toolchain_installed(RUSTUP_TOOLCHAIN_NAME, &["rust-src"]) { + eprintln!("rustup toolchain commands failed. Please ensure rustup is installed (https://www.rust-lang.org/tools/install)"); + return Err(Some(code)); + } + let target_dir = guest_opts .target_dir .clone() @@ -414,10 +421,78 @@ pub fn detect_toolchain(name: &str) { let stdout = String::from_utf8(result.stdout).unwrap(); if !stdout.lines().any(|line| line.trim().starts_with(name)) { eprintln!("The '{name}' toolchain could not be found."); - // eprintln!("To install the risc0 toolchain, use rzup."); - // eprintln!("For example:"); - // eprintln!(" curl -L https://risczero.com/install | bash"); - // eprintln!(" rzup install"); std::process::exit(-1); } } + +/// Ensures the required toolchain and components are installed. +fn ensure_toolchain_installed(toolchain: &str, components: &[&str]) -> Result<(), i32> { + // Check if toolchain is installed + let output = Command::new("rustup") + .args(["toolchain", "list"]) + .output() + .map_err(|e| { + tty_println(&format!("Failed to check toolchains: {}", e)); + e.raw_os_error().unwrap_or(1) + })?; + + let toolchain_installed = String::from_utf8_lossy(&output.stdout) + .lines() + .any(|line| line.trim().starts_with(toolchain)); + + // Install toolchain if missing + if !toolchain_installed { + tty_println(&format!("Installing required toolchain: {}", toolchain)); + let status = Command::new("rustup") + .args(["toolchain", "install", toolchain]) + .status() + .map_err(|e| { + tty_println(&format!("Failed to install toolchain: {}", e)); + e.raw_os_error().unwrap_or(1) + })?; + + if !status.success() { + tty_println(&format!("Failed to install toolchain {}", toolchain)); + return Err(status.code().unwrap_or(1)); + } + } + + // Check and install missing components + for component in components { + let output = Command::new("rustup") + .args(["component", "list", "--toolchain", toolchain]) + .output() + .map_err(|e| { + tty_println(&format!("Failed to check components: {}", e)); + e.raw_os_error().unwrap_or(1) + })?; + + let is_installed = String::from_utf8_lossy(&output.stdout) + .lines() + .any(|line| line.contains(component) && line.contains("(installed)")); + + if !is_installed { + tty_println(&format!( + "Installing component {} for toolchain {}", + component, toolchain + )); + let status = Command::new("rustup") + .args(["component", "add", component, "--toolchain", toolchain]) + .status() + .map_err(|e| { + tty_println(&format!("Failed to install component: {}", e)); + e.raw_os_error().unwrap_or(1) + })?; + + if !status.success() { + tty_println(&format!( + "Failed to install component {} for toolchain {}", + component, toolchain + )); + return Err(status.code().unwrap_or(1)); + } + } + } + + Ok(()) +} From ac89432e661a3eea88d27a5c6e8e4e80b93ea696 Mon Sep 17 00:00:00 2001 From: Yi Sun Date: Sat, 29 Mar 2025 01:17:21 -0400 Subject: [PATCH 02/25] chore: fix book lints (#1543) --- book/.markdownlint.json | 6 +- book/Justfile | 12 +- book/package.json | 23 +- book/pnpm-lock.yaml | 2383 +++++++--------------- book/src/advanced-usage/new-extension.md | 2 +- book/src/advanced-usage/sdk.md | 1 - book/src/custom-extensions/ecc.md | 2 +- book/src/writing-apps/overview.md | 1 + book/src/writing-apps/verify.md | 12 +- book/src/writing-apps/write-program.md | 5 + book/words.txt | 28 + 11 files changed, 806 insertions(+), 1669 deletions(-) diff --git a/book/.markdownlint.json b/book/.markdownlint.json index 2489b3699d..385ff1b06f 100644 --- a/book/.markdownlint.json +++ b/book/.markdownlint.json @@ -14,5 +14,7 @@ "single-title": false, "no-emphasis-as-heading": false, "no-duplicate-header": false, - "no-inline-html": false -} + "no-inline-html": false, + "MD013": false, + "MD029": false + } diff --git a/book/Justfile b/book/Justfile index 8904e6c7c4..313c8c929d 100644 --- a/book/Justfile +++ b/book/Justfile @@ -11,10 +11,10 @@ deps: pnpm i --frozen-lockfile # Lint the workspace for all available targets -lint: lint-book-md-check lint-book-toc-check lint-filenames lint-book-spelling +lint: lint-book-md-check lint-filenames lint-book-spelling # Updates all files to fix linting issues -lint-fix: lint-book-md-fix lint-book-toc +lint-fix: lint-book-md-fix # Validates markdown file formatting lint-book-md-check: @@ -24,14 +24,6 @@ lint-book-md-check: lint-book-md-fix: npx markdownlint-cli2 --fix "./src/**/*.md" -# Validates Table of Content Sections with doctoc -lint-book-toc-check: - npx doctoc '--title=**Table of Contents**' ./src && git diff --exit-code ./src - -# Updates Table of Content Sections with doctoc -lint-book-toc: - npx doctoc '--title=**Table of Contents**' ./src - # Validates spelling using cspell lint-book-spelling: npx cspell "./**/*.md" diff --git a/book/package.json b/book/package.json index 052df9876d..5dd7388530 100644 --- a/book/package.json +++ b/book/package.json @@ -1,14 +1,13 @@ { - "name": "specs", - "version": "1.0.0", - "private": true, - "engines": { - "node": ">=16", - "pnpm": ">=9" - }, - "dependencies": { - "doctoc": "^2.2.1", - "markdownlint-cli2": "0.4.0", - "cspell": "^8.1.3" - } + "name": "specs", + "version": "1.0.0", + "private": true, + "engines": { + "node": ">=16", + "pnpm": ">=9" + }, + "dependencies": { + "cspell": "^8.18.0", + "markdownlint-cli2": "0.17.2" + } } diff --git a/book/pnpm-lock.yaml b/book/pnpm-lock.yaml index 11bc452c5c..43baeacfc0 100644 --- a/book/pnpm-lock.yaml +++ b/book/pnpm-lock.yaml @@ -9,228 +9,231 @@ importers: .: dependencies: cspell: - specifier: ^8.1.3 - version: 8.16.0 - doctoc: - specifier: ^2.2.1 - version: 2.2.1 + specifier: ^8.18.0 + version: 8.18.0 markdownlint-cli2: - specifier: 0.4.0 - version: 0.4.0 + specifier: 0.17.2 + version: 0.17.2 packages: - '@cspell/cspell-bundled-dicts@8.16.0': - resolution: {integrity: sha512-R0Eqq5kTZnmZ0elih5uY3TWjMqqAeMl7ciU7maUs+m1FNjCEdJXtJ9wrQxNgjmXi0tX8cvahZRO3O558tEz/KA==} + '@cspell/cspell-bundled-dicts@8.18.0': + resolution: {integrity: sha512-c7OkDgtYYg0rvj49YS/QzjKeGg/l/d+DjMDqP8BProhKDhAghCsvc6l3SHCGnvyw42+YSTVdL5uLBIaA1OKBlQ==} engines: {node: '>=18'} - '@cspell/cspell-json-reporter@8.16.0': - resolution: {integrity: sha512-KLjPK94gA3JNuWy70LeenJ6EL3SFk2ejERKYJ6SVV/cVOKIvVd2qe42yX3/A/DkF2xzuZ2LD4z0sfoqQL1BaqA==} + '@cspell/cspell-json-reporter@8.18.0': + resolution: {integrity: sha512-glUYtRJ/xIgvCvFqgcF04RJiTFhL95wl1uirP+Qa+oqxvg/zP9zxsZupLD3aeMFhyDpgYwtBiebUmhSqrLDyaw==} engines: {node: '>=18'} - '@cspell/cspell-pipe@8.16.0': - resolution: {integrity: sha512-WoCgrv/mrtwCY4lhc6vEcqN3AQ7lT6K0NW5ShoSo116U2tRaW0unApIYH4Va8u7T9g3wyspFEceQRR1xD9qb9w==} + '@cspell/cspell-pipe@8.18.0': + resolution: {integrity: sha512-bSFncsV16B9nhHJdSMTCzdC0Su/TKs+JGTuCq2UiNi6vWxvsL/S1ueiRb+HT0WYKROwtAeHEKnjlw0G3OBBuFw==} engines: {node: '>=18'} - '@cspell/cspell-resolver@8.16.0': - resolution: {integrity: sha512-b+99bph43ptkXlQHgPXSkN/jK6LQHy2zL1Fm9up7+x6Yr64bxAzWzoeqJAPtnrPvFuOrFN0jZasZzKBw8CvrrQ==} + '@cspell/cspell-resolver@8.18.0': + resolution: {integrity: sha512-kNQJtYYJg6WpLoDUZW8VodovOtKLiDrb+GXmcee01qQmrEPCuub9gwoiRuka0sHI2logz0S8l9eAittClpxReg==} engines: {node: '>=18'} - '@cspell/cspell-service-bus@8.16.0': - resolution: {integrity: sha512-+fn763JKA4EYCOv+1VShFq015UMEBAFRDr+rlCnesgLE0fv9TSFVLsjOfh9/g6GuGQLCRLUqKztwwuueeErstQ==} + '@cspell/cspell-service-bus@8.18.0': + resolution: {integrity: sha512-yGnb59tUadd1q9dSIvg+Q8yZc7N2ZloZ8Sc5lAfxKOJWUh91ugu2UizmL4lm82vDrOevL3kryiauVTsjoS+UOg==} engines: {node: '>=18'} - '@cspell/cspell-types@8.16.0': - resolution: {integrity: sha512-bGrIK7p4NVsK+QX/CYWmjax+FkzfSIZaIaoiBESGV5gmwgXDVRMJ3IP6tQVAmTtckOYHCmtT5CZgI8zXWr8dHQ==} + '@cspell/cspell-types@8.18.0': + resolution: {integrity: sha512-z7ETwulTCAHpSNBqwD5d3Uoui4ClD+tfREoD0cKd9uMbLtN9W/WMVQAGDWJpOCUFrWsGYYM3/3/ob2oZhwdQag==} engines: {node: '>=18'} - '@cspell/dict-ada@4.0.5': - resolution: {integrity: sha512-6/RtZ/a+lhFVmrx/B7bfP7rzC4yjEYe8o74EybXcvu4Oue6J4Ey2WSYj96iuodloj1LWrkNCQyX5h4Pmcj0Iag==} + '@cspell/dict-ada@4.1.0': + resolution: {integrity: sha512-7SvmhmX170gyPd+uHXrfmqJBY5qLcCX8kTGURPVeGxmt8XNXT75uu9rnZO+jwrfuU2EimNoArdVy5GZRGljGNg==} - '@cspell/dict-al@1.0.3': - resolution: {integrity: sha512-V1HClwlfU/qwSq2Kt+MkqRAsonNu3mxjSCDyGRecdLGIHmh7yeEeaxqRiO/VZ4KP+eVSiSIlbwrb5YNFfxYZbw==} + '@cspell/dict-al@1.1.0': + resolution: {integrity: sha512-PtNI1KLmYkELYltbzuoztBxfi11jcE9HXBHCpID2lou/J4VMYKJPNqe4ZjVzSI9NYbMnMnyG3gkbhIdx66VSXg==} - '@cspell/dict-aws@4.0.7': - resolution: {integrity: sha512-PoaPpa2NXtSkhGIMIKhsJUXB6UbtTt6Ao3x9JdU9kn7fRZkwD4RjHDGqulucIOz7KeEX/dNRafap6oK9xHe4RA==} + '@cspell/dict-aws@4.0.9': + resolution: {integrity: sha512-bDYdnnJGwSkIZ4gzrauu7qzOs/ZAY/FnU4k11LgdMI8BhwMfsbsy2EI1iS+sD/BI5ZnNT9kU5YR3WADeNOmhRg==} - '@cspell/dict-bash@4.1.8': - resolution: {integrity: sha512-I2CM2pTNthQwW069lKcrVxchJGMVQBzru2ygsHCwgidXRnJL/NTjAPOFTxN58Jc1bf7THWghfEDyKX/oyfc0yg==} + '@cspell/dict-bash@4.2.0': + resolution: {integrity: sha512-HOyOS+4AbCArZHs/wMxX/apRkjxg6NDWdt0jF9i9XkvJQUltMwEhyA2TWYjQ0kssBsnof+9amax2lhiZnh3kCg==} - '@cspell/dict-companies@3.1.7': - resolution: {integrity: sha512-ncVs/efuAkP1/tLDhWbXukBjgZ5xOUfe03neHMWsE8zvXXc5+Lw6TX5jaJXZLOoES/f4j4AhRE20jsPCF5pm+A==} + '@cspell/dict-companies@3.1.14': + resolution: {integrity: sha512-iqo1Ce4L7h0l0GFSicm2wCLtfuymwkvgFGhmu9UHyuIcTbdFkDErH+m6lH3Ed+QuskJlpQ9dM7puMIGqUlVERw==} - '@cspell/dict-cpp@6.0.2': - resolution: {integrity: sha512-yw5eejWvY4bAnc6LUA44m4WsFwlmgPt2uMSnO7QViGMBDuoeopMma4z9XYvs4lSjTi8fIJs/A1YDfM9AVzb8eg==} + '@cspell/dict-cpp@6.0.6': + resolution: {integrity: sha512-HMV1chsExuZt5IL9rYBW7GmhNZDVdQJEd1WtFgOO6jqiNxbpTG3Is3Pkldl7FpusBQQZr4BdjMit5bnPpVRy3A==} - '@cspell/dict-cryptocurrencies@5.0.3': - resolution: {integrity: sha512-bl5q+Mk+T3xOZ12+FG37dB30GDxStza49Rmoax95n37MTLksk9wBo1ICOlPJ6PnDUSyeuv4SIVKgRKMKkJJglA==} + '@cspell/dict-cryptocurrencies@5.0.4': + resolution: {integrity: sha512-6iFu7Abu+4Mgqq08YhTKHfH59mpMpGTwdzDB2Y8bbgiwnGFCeoiSkVkgLn1Kel2++hYcZ8vsAW/MJS9oXxuMag==} - '@cspell/dict-csharp@4.0.5': - resolution: {integrity: sha512-c/sFnNgtRwRJxtC3JHKkyOm+U3/sUrltFeNwml9VsxKBHVmvlg4tk4ar58PdpW9/zTlGUkWi2i85//DN1EsUCA==} + '@cspell/dict-csharp@4.0.6': + resolution: {integrity: sha512-w/+YsqOknjQXmIlWDRmkW+BHBPJZ/XDrfJhZRQnp0wzpPOGml7W0q1iae65P2AFRtTdPKYmvSz7AL5ZRkCnSIw==} - '@cspell/dict-css@4.0.16': - resolution: {integrity: sha512-70qu7L9z/JR6QLyJPk38fNTKitlIHnfunx0wjpWQUQ8/jGADIhMCrz6hInBjqPNdtGpYm8d1dNFyF8taEkOgrQ==} + '@cspell/dict-css@4.0.17': + resolution: {integrity: sha512-2EisRLHk6X/PdicybwlajLGKF5aJf4xnX2uuG5lexuYKt05xV/J/OiBADmi8q9obhxf1nesrMQbqAt+6CsHo/w==} - '@cspell/dict-dart@2.2.4': - resolution: {integrity: sha512-of/cVuUIZZK/+iqefGln8G3bVpfyN6ZtH+LyLkHMoR5tEj+2vtilGNk9ngwyR8L4lEqbKuzSkOxgfVjsXf5PsQ==} + '@cspell/dict-dart@2.3.0': + resolution: {integrity: sha512-1aY90lAicek8vYczGPDKr70pQSTQHwMFLbmWKTAI6iavmb1fisJBS1oTmMOKE4ximDf86MvVN6Ucwx3u/8HqLg==} - '@cspell/dict-data-science@2.0.5': - resolution: {integrity: sha512-nNSILXmhSJox9/QoXICPQgm8q5PbiSQP4afpbkBqPi/u/b3K9MbNH5HvOOa6230gxcGdbZ9Argl2hY/U8siBlg==} + '@cspell/dict-data-science@2.0.7': + resolution: {integrity: sha512-XhAkK+nSW6zmrnWzusmZ1BpYLc62AWYHZc2p17u4nE2Z9XG5DleG55PCZxXQTKz90pmwlhFM9AfpkJsYaBWATA==} - '@cspell/dict-django@4.1.3': - resolution: {integrity: sha512-yBspeL3roJlO0a1vKKNaWABURuHdHZ9b1L8d3AukX0AsBy9snSggc8xCavPmSzNfeMDXbH+1lgQiYBd3IW03fg==} + '@cspell/dict-django@4.1.4': + resolution: {integrity: sha512-fX38eUoPvytZ/2GA+g4bbdUtCMGNFSLbdJJPKX2vbewIQGfgSFJKY56vvcHJKAvw7FopjvgyS/98Ta9WN1gckg==} - '@cspell/dict-docker@1.1.11': - resolution: {integrity: sha512-s0Yhb16/R+UT1y727ekbR/itWQF3Qz275DR1ahOa66wYtPjHUXmhM3B/LT3aPaX+hD6AWmK23v57SuyfYHUjsw==} + '@cspell/dict-docker@1.1.12': + resolution: {integrity: sha512-6d25ZPBnYZaT9D9An/x6g/4mk542R8bR3ipnby3QFCxnfdd6xaWiTcwDPsCgwN2aQZIQ1jX/fil9KmBEqIK/qA==} - '@cspell/dict-dotnet@5.0.8': - resolution: {integrity: sha512-MD8CmMgMEdJAIPl2Py3iqrx3B708MbCIXAuOeZ0Mzzb8YmLmiisY7QEYSZPg08D7xuwARycP0Ki+bb0GAkFSqg==} + '@cspell/dict-dotnet@5.0.9': + resolution: {integrity: sha512-JGD6RJW5sHtO5lfiJl11a5DpPN6eKSz5M1YBa1I76j4dDOIqgZB6rQexlDlK1DH9B06X4GdDQwdBfnpAB0r2uQ==} - '@cspell/dict-elixir@4.0.6': - resolution: {integrity: sha512-TfqSTxMHZ2jhiqnXlVKM0bUADtCvwKQv2XZL/DI0rx3doG8mEMS8SGPOmiyyGkHpR/pGOq18AFH3BEm4lViHIw==} + '@cspell/dict-elixir@4.0.7': + resolution: {integrity: sha512-MAUqlMw73mgtSdxvbAvyRlvc3bYnrDqXQrx5K9SwW8F7fRYf9V4vWYFULh+UWwwkqkhX9w03ZqFYRTdkFku6uA==} - '@cspell/dict-en-common-misspellings@2.0.7': - resolution: {integrity: sha512-qNFo3G4wyabcwnM+hDrMYKN9vNVg/k9QkhqSlSst6pULjdvPyPs1mqz1689xO/v9t8e6sR4IKc3CgUXDMTYOpA==} + '@cspell/dict-en-common-misspellings@2.0.10': + resolution: {integrity: sha512-80mXJLtr0tVEtzowrI7ycVae/ULAYImZUlr0kUTpa8i57AUk7Zy3pYBs44EYIKW7ZC9AHu4Qjjfq4vriAtyTDQ==} '@cspell/dict-en-gb@1.1.33': resolution: {integrity: sha512-tKSSUf9BJEV+GJQAYGw5e+ouhEe2ZXE620S7BLKe3ZmpnjlNG9JqlnaBhkIMxKnNFkLY2BP/EARzw31AZnOv4g==} - '@cspell/dict-en_us@4.3.28': - resolution: {integrity: sha512-BN1PME7cOl7DXRQJ92pEd1f0Xk5sqjcDfThDGkKcsgwbSOY7KnTc/czBW6Pr3WXIchIm6cT12KEfjNqx7U7Rrw==} + '@cspell/dict-en_us@4.3.35': + resolution: {integrity: sha512-HF6QNyPHkxeo/SosaZXRQlnKDUTjIzrGKyqfbw/fPPlPYrXefAZZ40ofheb5HnbUicR7xqV/lsc/HQfqYshGIw==} - '@cspell/dict-filetypes@3.0.8': - resolution: {integrity: sha512-D3N8sm/iptzfVwsib/jvpX+K/++rM8SRpLDFUaM4jxm8EyGmSIYRbKZvdIv5BkAWmMlTWoRqlLn7Yb1b11jKJg==} + '@cspell/dict-filetypes@3.0.11': + resolution: {integrity: sha512-bBtCHZLo7MiSRUqx5KEiPdGOmXIlDGY+L7SJEtRWZENpAKE+96rT7hj+TUUYWBbCzheqHr0OXZJFEKDgsG/uZg==} - '@cspell/dict-flutter@1.0.3': - resolution: {integrity: sha512-52C9aUEU22ptpgYh6gQyIdA4MP6NPwzbEqndfgPh3Sra191/kgs7CVqXiO1qbtZa9gnYHUoVApkoxRE7mrXHfg==} + '@cspell/dict-flutter@1.1.0': + resolution: {integrity: sha512-3zDeS7zc2p8tr9YH9tfbOEYfopKY/srNsAa+kE3rfBTtQERAZeOhe5yxrnTPoufctXLyuUtcGMUTpxr3dO0iaA==} - '@cspell/dict-fonts@4.0.3': - resolution: {integrity: sha512-sPd17kV5qgYXLteuHFPn5mbp/oCHKgitNfsZLFC3W2fWEgZlhg4hK+UGig3KzrYhhvQ8wBnmZrAQm0TFKCKzsA==} + '@cspell/dict-fonts@4.0.4': + resolution: {integrity: sha512-cHFho4hjojBcHl6qxidl9CvUb492IuSk7xIf2G2wJzcHwGaCFa2o3gRcxmIg1j62guetAeDDFELizDaJlVRIOg==} - '@cspell/dict-fsharp@1.0.4': - resolution: {integrity: sha512-G5wk0o1qyHUNi9nVgdE1h5wl5ylq7pcBjX8vhjHcO4XBq20D5eMoXjwqMo/+szKAqzJ+WV3BgAL50akLKrT9Rw==} + '@cspell/dict-fsharp@1.1.0': + resolution: {integrity: sha512-oguWmHhGzgbgbEIBKtgKPrFSVAFtvGHaQS0oj+vacZqMObwkapcTGu7iwf4V3Bc2T3caf0QE6f6rQfIJFIAVsw==} - '@cspell/dict-fullstack@3.2.3': - resolution: {integrity: sha512-62PbndIyQPH11mAv0PyiyT0vbwD0AXEocPpHlCHzfb5v9SspzCCbzQ/LIBiFmyRa+q5LMW35CnSVu6OXdT+LKg==} + '@cspell/dict-fullstack@3.2.6': + resolution: {integrity: sha512-cSaq9rz5RIU9j+0jcF2vnKPTQjxGXclntmoNp4XB7yFX2621PxJcekGjwf/lN5heJwVxGLL9toR0CBlGKwQBgA==} - '@cspell/dict-gaming-terms@1.0.8': - resolution: {integrity: sha512-7OL0zTl93WFWhhtpXFrtm9uZXItC3ncAs8d0iQDMMFVNU1rBr6raBNxJskxE5wx2Ant12fgI66ZGVagXfN+yfA==} + '@cspell/dict-gaming-terms@1.1.0': + resolution: {integrity: sha512-46AnDs9XkgJ2f1Sqol1WgfJ8gOqp60fojpc9Wxch7x+BA63g4JfMV5/M5x0sI0TLlLY8EBSglcr8wQF/7C80AQ==} - '@cspell/dict-git@3.0.3': - resolution: {integrity: sha512-LSxB+psZ0qoj83GkyjeEH/ZViyVsGEF/A6BAo8Nqc0w0HjD2qX/QR4sfA6JHUgQ3Yi/ccxdK7xNIo67L2ScW5A==} + '@cspell/dict-git@3.0.4': + resolution: {integrity: sha512-C44M+m56rYn6QCsLbiKiedyPTMZxlDdEYAsPwwlL5bhMDDzXZ3Ic8OCQIhMbiunhCOJJT+er4URmOmM+sllnjg==} - '@cspell/dict-golang@6.0.17': - resolution: {integrity: sha512-uDDLEJ/cHdLiqPw4+5BnmIo2i/TSR+uDvYd6JlBjTmjBKpOCyvUgYRztH7nv5e7virsN5WDiUWah4/ATQGz4Pw==} + '@cspell/dict-golang@6.0.19': + resolution: {integrity: sha512-VS+oinB2/CbgmHE06kMJlj52OVMZM0S2EEXph3oaroNTgTuclSwdFylQmOEjquZi55kW+n3FM9MyWXiitB7Dtg==} - '@cspell/dict-google@1.0.4': - resolution: {integrity: sha512-JThUT9eiguCja1mHHLwYESgxkhk17Gv7P3b1S7ZJzXw86QyVHPrbpVoMpozHk0C9o+Ym764B7gZGKmw9uMGduQ==} + '@cspell/dict-google@1.0.8': + resolution: {integrity: sha512-BnMHgcEeaLyloPmBs8phCqprI+4r2Jb8rni011A8hE+7FNk7FmLE3kiwxLFrcZnnb7eqM0agW4zUaNoB0P+z8A==} - '@cspell/dict-haskell@4.0.4': - resolution: {integrity: sha512-EwQsedEEnND/vY6tqRfg9y7tsnZdxNqOxLXSXTsFA6JRhUlr8Qs88iUUAfsUzWc4nNmmzQH2UbtT25ooG9x4nA==} + '@cspell/dict-haskell@4.0.5': + resolution: {integrity: sha512-s4BG/4tlj2pPM9Ha7IZYMhUujXDnI0Eq1+38UTTCpatYLbQqDwRFf2KNPLRqkroU+a44yTUAe0rkkKbwy4yRtQ==} '@cspell/dict-html-symbol-entities@4.0.3': resolution: {integrity: sha512-aABXX7dMLNFdSE8aY844X4+hvfK7977sOWgZXo4MTGAmOzR8524fjbJPswIBK7GaD3+SgFZ2yP2o0CFvXDGF+A==} - '@cspell/dict-html@4.0.10': - resolution: {integrity: sha512-I9uRAcdtHbh0wEtYZlgF0TTcgH0xaw1B54G2CW+tx4vHUwlde/+JBOfIzird4+WcMv4smZOfw+qHf7puFUbI5g==} + '@cspell/dict-html@4.0.11': + resolution: {integrity: sha512-QR3b/PB972SRQ2xICR1Nw/M44IJ6rjypwzA4jn+GH8ydjAX9acFNfc+hLZVyNe0FqsE90Gw3evLCOIF0vy1vQw==} - '@cspell/dict-java@5.0.10': - resolution: {integrity: sha512-pVNcOnmoGiNL8GSVq4WbX/Vs2FGS0Nej+1aEeGuUY9CU14X8yAVCG+oih5ZoLt1jaR8YfR8byUF8wdp4qG4XIw==} + '@cspell/dict-java@5.0.11': + resolution: {integrity: sha512-T4t/1JqeH33Raa/QK/eQe26FE17eUCtWu+JsYcTLkQTci2dk1DfcIKo8YVHvZXBnuM43ATns9Xs0s+AlqDeH7w==} - '@cspell/dict-julia@1.0.4': - resolution: {integrity: sha512-bFVgNX35MD3kZRbXbJVzdnN7OuEqmQXGpdOi9jzB40TSgBTlJWA4nxeAKV4CPCZxNRUGnLH0p05T/AD7Aom9/w==} + '@cspell/dict-julia@1.1.0': + resolution: {integrity: sha512-CPUiesiXwy3HRoBR3joUseTZ9giFPCydSKu2rkh6I2nVjXnl5vFHzOMLXpbF4HQ1tH2CNfnDbUndxD+I+7eL9w==} - '@cspell/dict-k8s@1.0.9': - resolution: {integrity: sha512-Q7GELSQIzo+BERl2ya/nBEnZeQC+zJP19SN1pI6gqDYraM51uYJacbbcWLYYO2Y+5joDjNt/sd/lJtLaQwoSlA==} + '@cspell/dict-k8s@1.0.10': + resolution: {integrity: sha512-313haTrX9prep1yWO7N6Xw4D6tvUJ0Xsx+YhCP+5YrrcIKoEw5Rtlg8R4PPzLqe6zibw6aJ+Eqq+y76Vx5BZkw==} + + '@cspell/dict-kotlin@1.1.0': + resolution: {integrity: sha512-vySaVw6atY7LdwvstQowSbdxjXG6jDhjkWVWSjg1XsUckyzH1JRHXe9VahZz1i7dpoFEUOWQrhIe5B9482UyJQ==} '@cspell/dict-latex@4.0.3': resolution: {integrity: sha512-2KXBt9fSpymYHxHfvhUpjUFyzrmN4c4P8mwIzweLyvqntBT3k0YGZJSriOdjfUjwSygrfEwiuPI1EMrvgrOMJw==} - '@cspell/dict-lorem-ipsum@4.0.3': - resolution: {integrity: sha512-WFpDi/PDYHXft6p0eCXuYnn7mzMEQLVeqpO+wHSUd+kz5ADusZ4cpslAA4wUZJstF1/1kMCQCZM6HLZic9bT8A==} + '@cspell/dict-lorem-ipsum@4.0.4': + resolution: {integrity: sha512-+4f7vtY4dp2b9N5fn0za/UR0kwFq2zDtA62JCbWHbpjvO9wukkbl4rZg4YudHbBgkl73HRnXFgCiwNhdIA1JPw==} - '@cspell/dict-lua@4.0.6': - resolution: {integrity: sha512-Jwvh1jmAd9b+SP9e1GkS2ACbqKKRo9E1f9GdjF/ijmooZuHU0hPyqvnhZzUAxO1egbnNjxS/J2T6iUtjAUK2KQ==} + '@cspell/dict-lua@4.0.7': + resolution: {integrity: sha512-Wbr7YSQw+cLHhTYTKV6cAljgMgcY+EUAxVIZW3ljKswEe4OLxnVJ7lPqZF5JKjlXdgCjbPSimsHqyAbC5pQN/Q==} - '@cspell/dict-makefile@1.0.3': - resolution: {integrity: sha512-R3U0DSpvTs6qdqfyBATnePj9Q/pypkje0Nj26mQJ8TOBQutCRAJbr2ZFAeDjgRx5EAJU/+8txiyVF97fbVRViw==} + '@cspell/dict-makefile@1.0.4': + resolution: {integrity: sha512-E4hG/c0ekPqUBvlkrVvzSoAA+SsDA9bLi4xSV3AXHTVru7Y2bVVGMPtpfF+fI3zTkww/jwinprcU1LSohI3ylw==} - '@cspell/dict-markdown@2.0.7': - resolution: {integrity: sha512-F9SGsSOokFn976DV4u/1eL4FtKQDSgJHSZ3+haPRU5ki6OEqojxKa8hhj4AUrtNFpmBaJx/WJ4YaEzWqG7hgqg==} + '@cspell/dict-markdown@2.0.9': + resolution: {integrity: sha512-j2e6Eg18BlTb1mMP1DkyRFMM/FLS7qiZjltpURzDckB57zDZbUyskOFdl4VX7jItZZEeY0fe22bSPOycgS1Z5A==} peerDependencies: - '@cspell/dict-css': ^4.0.16 - '@cspell/dict-html': ^4.0.10 + '@cspell/dict-css': ^4.0.17 + '@cspell/dict-html': ^4.0.11 '@cspell/dict-html-symbol-entities': ^4.0.3 - '@cspell/dict-typescript': ^3.1.11 + '@cspell/dict-typescript': ^3.2.0 + + '@cspell/dict-monkeyc@1.0.10': + resolution: {integrity: sha512-7RTGyKsTIIVqzbvOtAu6Z/lwwxjGRtY5RkKPlXKHEoEAgIXwfDxb5EkVwzGQwQr8hF/D3HrdYbRT8MFBfsueZw==} - '@cspell/dict-monkeyc@1.0.9': - resolution: {integrity: sha512-Jvf6g5xlB4+za3ThvenYKREXTEgzx5gMUSzrAxIiPleVG4hmRb/GBSoSjtkGaibN3XxGx5x809gSTYCA/IHCpA==} + '@cspell/dict-node@5.0.6': + resolution: {integrity: sha512-CEbhPCpxGvRNByGolSBTrXXW2rJA4bGqZuTx1KKO85mwR6aadeOmUE7xf/8jiCkXSy+qvr9aJeh+jlfXcsrziQ==} - '@cspell/dict-node@5.0.5': - resolution: {integrity: sha512-7NbCS2E8ZZRZwlLrh2sA0vAk9n1kcTUiRp/Nia8YvKaItGXLfxYqD2rMQ3HpB1kEutal6hQLVic3N2Yi1X7AaA==} + '@cspell/dict-npm@5.1.31': + resolution: {integrity: sha512-Oh9nrhgNV4UD1hlbgO3TFQqQRKziwc7qXKoQiC4oqOYIhMs2WL9Ezozku7FY1e7o5XbCIZX9nRH0ymNx/Rwj6w==} - '@cspell/dict-npm@5.1.14': - resolution: {integrity: sha512-7VV/rrRlxOwy5j0bpw6/Uci+nx/rwSgx45FJdeKq++nHsBx/nEXMFNODknm4Mi6i7t7uOVHExpifrR6w6xTWww==} + '@cspell/dict-php@4.0.14': + resolution: {integrity: sha512-7zur8pyncYZglxNmqsRycOZ6inpDoVd4yFfz1pQRe5xaRWMiK3Km4n0/X/1YMWhh3e3Sl/fQg5Axb2hlN68t1g==} - '@cspell/dict-php@4.0.13': - resolution: {integrity: sha512-P6sREMZkhElzz/HhXAjahnICYIqB/HSGp1EhZh+Y6IhvC15AzgtDP8B8VYCIsQof6rPF1SQrFwunxOv8H1e2eg==} + '@cspell/dict-powershell@5.0.14': + resolution: {integrity: sha512-ktjjvtkIUIYmj/SoGBYbr3/+CsRGNXGpvVANrY0wlm/IoGlGywhoTUDYN0IsGwI2b8Vktx3DZmQkfb3Wo38jBA==} - '@cspell/dict-powershell@5.0.13': - resolution: {integrity: sha512-0qdj0XZIPmb77nRTynKidRJKTU0Fl+10jyLbAhFTuBWKMypVY06EaYFnwhsgsws/7nNX8MTEQuewbl9bWFAbsg==} + '@cspell/dict-public-licenses@2.0.13': + resolution: {integrity: sha512-1Wdp/XH1ieim7CadXYE7YLnUlW0pULEjVl9WEeziZw3EKCAw8ZI8Ih44m4bEa5VNBLnuP5TfqC4iDautAleQzQ==} - '@cspell/dict-public-licenses@2.0.11': - resolution: {integrity: sha512-rR5KjRUSnVKdfs5G+gJ4oIvQvm8+NJ6cHWY2N+GE69/FSGWDOPHxulCzeGnQU/c6WWZMSimG9o49i9r//lUQyA==} + '@cspell/dict-python@4.2.16': + resolution: {integrity: sha512-LkQssFt1hPOWXIQiD8ScTkz/41RL7Ti0V/2ytUzEW82dc0atIEksrBg8MuOjWXktp0Dk5tDwRLgmIvhV3CFFOA==} - '@cspell/dict-python@4.2.12': - resolution: {integrity: sha512-U25eOFu+RE0aEcF2AsxZmq3Lic7y9zspJ9SzjrC0mfJz+yr3YmSCw4E0blMD3mZoNcf7H/vMshuKIY5AY36U+Q==} + '@cspell/dict-r@2.1.0': + resolution: {integrity: sha512-k2512wgGG0lTpTYH9w5Wwco+lAMf3Vz7mhqV8+OnalIE7muA0RSuD9tWBjiqLcX8zPvEJr4LdgxVju8Gk3OKyA==} - '@cspell/dict-r@2.0.4': - resolution: {integrity: sha512-cBpRsE/U0d9BRhiNRMLMH1PpWgw+N+1A2jumgt1if9nBGmQw4MUpg2u9I0xlFVhstTIdzXiLXMxP45cABuiUeQ==} + '@cspell/dict-ruby@5.0.8': + resolution: {integrity: sha512-ixuTneU0aH1cPQRbWJvtvOntMFfeQR2KxT8LuAv5jBKqQWIHSxzGlp+zX3SVyoeR0kOWiu64/O5Yn836A5yMcQ==} - '@cspell/dict-ruby@5.0.7': - resolution: {integrity: sha512-4/d0hcoPzi5Alk0FmcyqlzFW9lQnZh9j07MJzPcyVO62nYJJAGKaPZL2o4qHeCS/od/ctJC5AHRdoUm0ktsw6Q==} + '@cspell/dict-rust@4.0.11': + resolution: {integrity: sha512-OGWDEEzm8HlkSmtD8fV3pEcO2XBpzG2XYjgMCJCRwb2gRKvR+XIm6Dlhs04N/K2kU+iH8bvrqNpM8fS/BFl0uw==} - '@cspell/dict-rust@4.0.10': - resolution: {integrity: sha512-6o5C8566VGTTctgcwfF3Iy7314W0oMlFFSQOadQ0OEdJ9Z9ERX/PDimrzP3LGuOrvhtEFoK8pj+BLnunNwRNrw==} + '@cspell/dict-scala@5.0.7': + resolution: {integrity: sha512-yatpSDW/GwulzO3t7hB5peoWwzo+Y3qTc0pO24Jf6f88jsEeKmDeKkfgPbYuCgbE4jisGR4vs4+jfQZDIYmXPA==} - '@cspell/dict-scala@5.0.6': - resolution: {integrity: sha512-tl0YWAfjUVb4LyyE4JIMVE8DlLzb1ecHRmIWc4eT6nkyDqQgHKzdHsnusxFEFMVLIQomgSg0Zz6hJ5S1E4W4ww==} + '@cspell/dict-shell@1.1.0': + resolution: {integrity: sha512-D/xHXX7T37BJxNRf5JJHsvziFDvh23IF/KvkZXNSh8VqcRdod3BAz9VGHZf6VDqcZXr1VRqIYR3mQ8DSvs3AVQ==} - '@cspell/dict-software-terms@4.1.17': - resolution: {integrity: sha512-QORIk1R5DV8oOQ+oAlUWE7UomaJwUucqu2srrc2+PmkoI6R1fJwwg2uHCPBWlIb4PGDNEdXLv9BAD13H+0wytQ==} + '@cspell/dict-software-terms@5.0.2': + resolution: {integrity: sha512-aCzP+M0WXRLYXTriDMZygUe5s4jKyau/nCA6gBGt4EoHfXn+Ua/+DrW766oXOkkESIlqTBtRgb9gWwQvUdOXSQ==} - '@cspell/dict-sql@2.1.8': - resolution: {integrity: sha512-dJRE4JV1qmXTbbGm6WIcg1knmR6K5RXnQxF4XHs5HA3LAjc/zf77F95i5LC+guOGppVF6Hdl66S2UyxT+SAF3A==} + '@cspell/dict-sql@2.2.0': + resolution: {integrity: sha512-MUop+d1AHSzXpBvQgQkCiok8Ejzb+nrzyG16E8TvKL2MQeDwnIvMe3bv90eukP6E1HWb+V/MA/4pnq0pcJWKqQ==} - '@cspell/dict-svelte@1.0.5': - resolution: {integrity: sha512-sseHlcXOqWE4Ner9sg8KsjxwSJ2yssoJNqFHR9liWVbDV+m7kBiUtn2EB690TihzVsEmDr/0Yxrbb5Bniz70mA==} + '@cspell/dict-svelte@1.0.6': + resolution: {integrity: sha512-8LAJHSBdwHCoKCSy72PXXzz7ulGROD0rP1CQ0StOqXOOlTUeSFaJJlxNYjlONgd2c62XBQiN2wgLhtPN+1Zv7Q==} - '@cspell/dict-swift@2.0.4': - resolution: {integrity: sha512-CsFF0IFAbRtYNg0yZcdaYbADF5F3DsM8C4wHnZefQy8YcHP/qjAF/GdGfBFBLx+XSthYuBlo2b2XQVdz3cJZBw==} + '@cspell/dict-swift@2.0.5': + resolution: {integrity: sha512-3lGzDCwUmnrfckv3Q4eVSW3sK3cHqqHlPprFJZD4nAqt23ot7fic5ALR7J4joHpvDz36nHX34TgcbZNNZOC/JA==} - '@cspell/dict-terraform@1.0.6': - resolution: {integrity: sha512-Sqm5vGbXuI9hCFcr4w6xWf4Y25J9SdleE/IqfM6RySPnk8lISEmVdax4k6+Kinv9qaxyvnIbUUN4WFLWcBPQAg==} + '@cspell/dict-terraform@1.1.1': + resolution: {integrity: sha512-07KFDwCU7EnKl4hOZLsLKlj6Zceq/IsQ3LRWUyIjvGFfZHdoGtFdCp3ZPVgnFaAcd/DKv+WVkrOzUBSYqHopQQ==} - '@cspell/dict-typescript@3.1.11': - resolution: {integrity: sha512-FwvK5sKbwrVpdw0e9+1lVTl8FPoHYvfHRuQRQz2Ql5XkC0gwPPkpoyD1zYImjIyZRoYXk3yp9j8ss4iz7A7zoQ==} + '@cspell/dict-typescript@3.2.0': + resolution: {integrity: sha512-Pk3zNePLT8qg51l0M4g1ISowYAEGxTuNfZlgkU5SvHa9Cu7x/BWoyYq9Fvc3kAyoisCjRPyvWF4uRYrPitPDFw==} - '@cspell/dict-vue@3.0.3': - resolution: {integrity: sha512-akmYbrgAGumqk1xXALtDJcEcOMYBYMnkjpmGzH13Ozhq1mkPF4VgllFQlm1xYde+BUKNnzMgPEzxrL2qZllgYA==} + '@cspell/dict-vue@3.0.4': + resolution: {integrity: sha512-0dPtI0lwHcAgSiQFx8CzvqjdoXROcH+1LyqgROCpBgppommWpVhbQ0eubnKotFEXgpUCONVkeZJ6Ql8NbTEu+w==} - '@cspell/dynamic-import@8.16.0': - resolution: {integrity: sha512-FH+B5y71qfunagXiLSJhXP9h/Vwb1Z8Cc/hLmliGekw/Y8BuYknL86tMg9grXBYNmM0kifIv6ZesQl8Km/p/rA==} + '@cspell/dynamic-import@8.18.0': + resolution: {integrity: sha512-TPdY/x9l0DAWCSI8iXDEQSl0xlB9qSbEqIv3UYVpWqbQYCY7MdA15bmai8uKt08sZ8F9L6nYHPtbOGFExHvoSw==} engines: {node: '>=18.0'} - '@cspell/filetypes@8.16.0': - resolution: {integrity: sha512-u2Ub0uSwXFPJFvXhAO/0FZBj3sMr4CeYCiQwTUsdFRkRMFpbTc7Vf+a+aC2vIj6WcaWrYXrJy3NZF/yjqF6SGw==} + '@cspell/filetypes@8.18.0': + resolution: {integrity: sha512-Qd+Fc9CfkCm4Kufe/H8jCLe5px3PwiKmJgdiZ6FJ0i06MU+0XHZGmzWayrL+EoTqfbQA3jLkvnSgWwF0C6Ci6Q==} engines: {node: '>=18'} - '@cspell/strong-weak-map@8.16.0': - resolution: {integrity: sha512-R6N12wEIQpBk2uyni/FU1SFSIjP0uql7ynXVcF1ob8/JJeRoikssydi9Xq5J6ghMw+X50u35mFvg9BgWKz0d+g==} + '@cspell/strong-weak-map@8.18.0': + resolution: {integrity: sha512-u8j+1JsnzJv10c7KaGzCdp8mJ3IL0tJ601+ySdebqVL4VNVKE1OcEV+sYxMjrXbeXkPGlpSwr+yDKMW1WHaC7A==} engines: {node: '>=18'} - '@cspell/url@8.16.0': - resolution: {integrity: sha512-zW+6hAieD/FjysfjY4mVv7iHWWasBP3ldj6L+xy2p4Kuax1nug7uuJqMHlAVude/OywNwENG0rYaP/P9Pg4O+w==} + '@cspell/url@8.18.0': + resolution: {integrity: sha512-jbo66L7Y5WImty4o2s5sL6LwTSHS6XjZDKEUayqxILyNb5XHKRUinyII1/EpglFRi9n7G5w4t714/Aeg1Y90Vg==} engines: {node: '>=18.0'} '@nodelib/fs.scandir@2.1.5': @@ -245,86 +248,65 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@textlint/ast-node-types@12.6.1': - resolution: {integrity: sha512-uzlJ+ZsCAyJm+lBi7j0UeBbj+Oy6w/VWoGJ3iHRHE5eZ8Z4iK66mq+PG/spupmbllLtz77OJbY89BYqgFyjXmA==} + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@textlint/markdown-to-ast@12.6.1': - resolution: {integrity: sha512-T0HO+VrU9VbLRiEx/kH4+gwGMHNMIGkp0Pok+p0I33saOOLyhfGvwOKQgvt2qkxzQEV2L5MtGB8EnW4r5d3CqQ==} + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - anchor-markdown-header@0.6.0: - resolution: {integrity: sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - array-union@3.0.1: - resolution: {integrity: sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==} - engines: {node: '>=12'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - ccount@1.1.0: - resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} - chalk-template@1.1.0: resolution: {integrity: sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==} engines: {node: '>=14.16'} - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} clear-module@4.1.2: resolution: {integrity: sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw==} engines: {node: '>=8'} - commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + comment-json@4.2.5: resolution: {integrity: sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw==} engines: {node: '>= 6'} @@ -332,59 +314,47 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cspell-config-lib@8.16.0: - resolution: {integrity: sha512-PGT6ohLtIYXYLIm+R5hTcTrF0dzj8e7WAUJSJe5WlV/7lrwVdwgWaliLcXtSSPmfxgczr6sndX9TMJ2IEmPrmg==} + cspell-config-lib@8.18.0: + resolution: {integrity: sha512-Y0hos8IS1rzmU9lTl6v1q6MBr6v9nhJy5IacZXSJhBSTHRYemsvICTnn+PtksUFgrEEqWusOdAsgBhYV0nlSuw==} engines: {node: '>=18'} - cspell-dictionary@8.16.0: - resolution: {integrity: sha512-Y3sN6ttLBKbu0dOLcduY641n5QP1srUvZkW4bOTnG455DbIZfilrP1El/2Hl0RS6hC8LN9PM4bsIm/2xgdbApA==} + cspell-dictionary@8.18.0: + resolution: {integrity: sha512-yf7anUDHYFPuQ53619BILYswm4E08NzyNPO1cF0GyqGe5ZTTHf/rCNYcuZHtQ7yKmQuC/K8/y2kEeLsqNa0p6A==} engines: {node: '>=18'} - cspell-gitignore@8.16.0: - resolution: {integrity: sha512-ODKe0ooyzYSBJkwgIVZSRIvzoZfT4tEbFt4fFDT88wPyyfX7xp7MAQhXy5KD1ocXH0WvYbdv37qzn2UbckrahA==} + cspell-gitignore@8.18.0: + resolution: {integrity: sha512-HYWAK7282o9CkcMwqC3w1wNjgae1v4CMgzF3ptpyBonjISkj1GdFGMno4Gu2uW43aKGTmyj4Fi9J94UZvzZa4w==} engines: {node: '>=18'} hasBin: true - cspell-glob@8.16.0: - resolution: {integrity: sha512-xJSXRHwfENCNFmjpVSEucXY8E3BrpSCA+TukmOYtLyaMKtn6EAwoCpEU7Oj2tZOjdivprPmQ74k4Dqb1RHjIVQ==} + cspell-glob@8.18.0: + resolution: {integrity: sha512-ox3ygu5+3tXR3+XRbYJy/z+YK1zo4TFQFkvUEr+aV8Ogyvgm7qE9uTaFz6krkkMLNG6l8EZ7mJtdn0ZsXF/WKQ==} engines: {node: '>=18'} - cspell-grammar@8.16.0: - resolution: {integrity: sha512-vvbJEkBqXocGH/H975RtkfMzVpNxNGMd0JCDd+NjbpeRyZceuChFw5Tie7kHteFY29SwZovub+Am3F4H1kmf9A==} + cspell-grammar@8.18.0: + resolution: {integrity: sha512-/h8gLULvH+P+8N/cmIx8M85sqlER6AyO/RoCVudfq7lTkFneXXKmCoHSA2YQbod9ZSjL+voivBokN2yjMR+XEA==} engines: {node: '>=18'} hasBin: true - cspell-io@8.16.0: - resolution: {integrity: sha512-WIK5uhPMjGsTAzm2/fGRbIdr7zWsMVG1fn8wNJYUiYELuyvzvLelfI1VG6szaFCGYqd6Uvgb/fS0uNbwGqCLAQ==} + cspell-io@8.18.0: + resolution: {integrity: sha512-W6CfXY5dlGTd6XWgHl4B2qLD/gla9TXDVdSo3ViCMJoVu82UQD8b4mir5RfHqXiMrz7ItDeUy9BxFN42VB2YcA==} engines: {node: '>=18'} - cspell-lib@8.16.0: - resolution: {integrity: sha512-fU8CfECyuhT12COIi4ViQu2bTkdqaa+05YSd2ZV8k8NA7lapPaMFnlooxdfcwwgZJfHeMhRVMzvQF1OhWmwGfA==} + cspell-lib@8.18.0: + resolution: {integrity: sha512-346CAY12pVk40FWnfPOwajKug61EeawW3QMtJE/f6rMYGAjGxGExhZnl6eR/KuCMt/w60kqQMSjGDw2zJjJqUw==} engines: {node: '>=18'} - cspell-trie-lib@8.16.0: - resolution: {integrity: sha512-Io1qqI0r4U9ewAWBLClFBBlxLeAoIi15PUGJi4Za1xrlgQJwRE8PMNIJNHKmPEIp78Iute3o/JyC2OfWlxl4Sw==} + cspell-trie-lib@8.18.0: + resolution: {integrity: sha512-zhrCAHyQ2uiGpFdp6E336/L2oDTh/0fM22VpGbkBS4uYKqG9jMy4eUZdSKS8Lg3St4YdGK14J7dv/PiMLqqxlw==} engines: {node: '>=18'} - cspell@8.16.0: - resolution: {integrity: sha512-U6Up/4nODE+Ca+zqwZXTgBioGuF2JQHLEUIuoRJkJzAZkIBYDqrMXM+zdSL9E39+xb9jAtr9kPAYJf1Eybgi9g==} + cspell@8.18.0: + resolution: {integrity: sha512-+6lJaR4zI/250vAR3qXwRj9O80Q4dHUuJWVXCZQV2L6HdF+s5ThS7+HYmE5zdf1YpPCtYJJ/6stkKsdUCQtkTA==} engines: {node: '>=18'} hasBin: true - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -392,107 +362,45 @@ packages: supports-color: optional: true - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - doctoc@2.2.1: - resolution: {integrity: sha512-qNJ1gsuo7hH40vlXTVVrADm6pdg30bns/Mo7Nv1SxuXSM1bwF9b4xQ40a6EFT/L1cI+Yylbyi8MPI4G4y7XJzQ==} - hasBin: true + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - - emoji-regex@10.1.0: - resolution: {integrity: sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==} - - entities@2.1.0: - resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - entities@3.0.1: - resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - es-abstract@1.23.5: - resolution: {integrity: sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - fast-equals@5.0.1: - resolution: {integrity: sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==} + fast-equals@5.2.2: + resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fault@1.0.4: - resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -507,50 +415,21 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - flat-cache@5.0.0: resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} engines: {node: '>=18'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} gensequence@7.0.0: resolution: {integrity: sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ==} engines: {node: '>=18'} - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - get-stdin@9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} engines: {node: '>=12'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -559,52 +438,20 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@12.1.0: - resolution: {integrity: sha512-YULDaNwsoUZkRy9TWSY/M7Obh0abamTKoKzTfOI3uU+hfpX2FZqOq8LFDxsjYheF1RH7ITdArgbQnsNBFgcdBA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} has-own-prop@2.0.0: resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - htmlparser2@7.2.0: - resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} import-meta-resolve@4.1.0: @@ -614,256 +461,157 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - - is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.0: - resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} - engines: {node: '>= 0.4'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + katex@0.16.21: + resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} + hasBin: true + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - linkify-it@3.0.3: - resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - longest-streak@2.0.4: - resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} - - markdown-it@12.3.2: - resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - markdown-table@2.0.0: - resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} - - markdownlint-cli2-formatter-default@0.0.3: - resolution: {integrity: sha512-QEAJitT5eqX1SNboOD+SO/LNBpu4P4je8JlR02ug2cLQAqmIhh8IJnSK7AcaHBHhNADqdGydnPpQOpsNcEEqCw==} + markdownlint-cli2-formatter-default@0.0.5: + resolution: {integrity: sha512-4XKTwQ5m1+Txo2kuQ3Jgpo/KmnG+X90dWt4acufg6HVGadTUG5hzHF/wssp9b5MBYOMCnZ9RMPaU//uHsszF8Q==} peerDependencies: markdownlint-cli2: '>=0.0.4' - markdownlint-cli2@0.4.0: - resolution: {integrity: sha512-EcwP5tAbyzzL3ACI0L16LqbNctmh8wNX56T+aVvIxWyTAkwbYNx2V7IheRkXS3mE7R/pnaApZ/RSXcXuzRVPjg==} - engines: {node: '>=12'} + markdownlint-cli2@0.17.2: + resolution: {integrity: sha512-XH06ZOi8wCrtOSSj3p8y3yJzwgzYOSa7lglNyS3fP05JPRzRGyjauBb5UvlLUSCGysMmULS1moxdRHHudV+g/Q==} + engines: {node: '>=18'} hasBin: true - markdownlint-rule-helpers@0.16.0: - resolution: {integrity: sha512-oEacRUVeTJ5D5hW1UYd2qExYI0oELdYK72k1TKGvIeYJIbqQWAz476NAc7LNixSySUhcNl++d02DvX0ccDk9/w==} + markdownlint@0.37.4: + resolution: {integrity: sha512-u00joA/syf3VhWh6/ybVFkib5Zpj2e5KB/cfCei8fkSRuums6nyisTWGqjTWIOFoFwuXoTBQQiqlB4qFKp8ncQ==} + engines: {node: '>=18'} - markdownlint@0.25.1: - resolution: {integrity: sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g==} - engines: {node: '>=12'} + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} - mdast-util-find-and-replace@1.1.1: - resolution: {integrity: sha512-9cKl33Y21lyckGzpSmEQnIDjEfeeWelN5s1kUW1LwdB0Fkuq2u+4GdqcGEygYxJE8GVqCl0741bYXHgamfWAZA==} + micromark-core-commonmark@2.0.2: + resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} - mdast-util-footnote@0.1.7: - resolution: {integrity: sha512-QxNdO8qSxqbO2e3m09KwDKfWiLgqyCurdWTQ198NpbZ2hxntdc+VKS4fDJCmNWbAroUdYnSthu+XbZ8ovh8C3w==} + micromark-extension-directive@3.0.2: + resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==} - mdast-util-from-markdown@0.8.5: - resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - mdast-util-frontmatter@0.2.0: - resolution: {integrity: sha512-FHKL4w4S5fdt1KjJCwB0178WJ0evnyyQr5kXTM3wrOVpytD0hrkvd+AOOjU9Td8onOejCkmZ+HQRT3CZ3coHHQ==} + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - mdast-util-gfm-autolink-literal@0.1.3: - resolution: {integrity: sha512-GjmLjWrXg1wqMIO9+ZsRik/s7PLwTaeCHVB7vRxUwLntZc8mzmTsLVr6HW1yLokcnhfURsn5zmSVdi3/xWWu1A==} + micromark-extension-gfm-table@2.1.0: + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} - mdast-util-gfm-strikethrough@0.2.3: - resolution: {integrity: sha512-5OQLXpt6qdbttcDG/UxYY7Yjj3e8P7X16LzvpX8pIQPYJ/C2Z1qFGMmcw+1PZMUM3Z8wt8NRfYTvCni93mgsgA==} + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} - mdast-util-gfm-table@0.1.6: - resolution: {integrity: sha512-j4yDxQ66AJSBwGkbpFEp9uG/LS1tZV3P33fN1gkyRB2LoRL+RR3f76m0HPHaby6F4Z5xr9Fv1URmATlRRUIpRQ==} + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - mdast-util-gfm-task-list-item@0.1.6: - resolution: {integrity: sha512-/d51FFIfPsSmCIRNp7E6pozM9z1GYPIkSy1urQ8s/o4TC22BZ7DqfHFWiqBD23bc7J3vV1Fc9O4QIHBlfuit8A==} + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - mdast-util-gfm@0.1.2: - resolution: {integrity: sha512-NNkhDx/qYcuOWB7xHUGWZYVXvjPFFd6afg6/e2g+SV4r9q5XUcCbV4Wfa3DLYIiD+xAEZc6K4MGaE/m0KDcPwQ==} + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - mdast-util-to-markdown@0.6.5: - resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - mdast-util-to-string@2.0.0: - resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - micromark-extension-footnote@0.3.2: - resolution: {integrity: sha512-gr/BeIxbIWQoUm02cIfK7mdMZ/fbroRpLsck4kvFtjbzP4yi+OPVbnukTc/zy0i7spC2xYE/dbX1Sur8BEDJsQ==} + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - micromark-extension-frontmatter@0.2.2: - resolution: {integrity: sha512-q6nPLFCMTLtfsctAuS0Xh4vaolxSFUWUWR6PZSrXXiRy+SANGllpcqdXFv2z07l0Xz/6Hl40hK0ffNCJPH2n1A==} + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - micromark-extension-gfm-autolink-literal@0.5.7: - resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - micromark-extension-gfm-strikethrough@0.6.5: - resolution: {integrity: sha512-PpOKlgokpQRwUesRwWEp+fHjGGkZEejj83k9gU5iXCbDG+XBA92BqnRKYJdfqfkrRcZRgGuPuXb7DaK/DmxOhw==} + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-extension-gfm-table@0.4.3: - resolution: {integrity: sha512-hVGvESPq0fk6ALWtomcwmgLvH8ZSVpcPjzi0AjPclB9FsVRgMtGZkUcpE0zgjOCFAznKepF4z3hX8z6e3HODdA==} + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - micromark-extension-gfm-tagfilter@0.3.0: - resolution: {integrity: sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q==} + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - micromark-extension-gfm-task-list-item@0.3.3: - resolution: {integrity: sha512-0zvM5iSLKrc/NQl84pZSjGo66aTGd57C1idmlWmE87lkMcXrTxg1uXa/nXomxJytoje9trP0NDLvw4bZ/Z/XCQ==} + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - micromark-extension-gfm@0.3.3: - resolution: {integrity: sha512-oVN4zv5/tAIA+l3GbMi7lWeYpJ14oQyJ3uEim20ktYFAcfX1x3LNlFGGlmrZHt7u9YlKExmyJdDGaTt6cMSR/A==} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark@2.11.4: - resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - micromatch@4.0.4: - resolution: {integrity: sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==} - engines: {node: '>=8.6'} + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.1: + resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + + micromark@4.0.1: + resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -872,12 +620,12 @@ packages: resolution: {integrity: sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg==} engines: {node: '>=8'} - parse-entities@2.0.0: - resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -887,33 +635,13 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - reflect.getprototypeof@1.0.7: - resolution: {integrity: sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} - engines: {node: '>= 0.4'} - - remark-footnotes@3.0.0: - resolution: {integrity: sha512-ZssAvH9FjGYlJ/PBVKdSmfyPc3Cz4rTWgZLI4iE/SX8Nt5l3o3oEjv3wwG5VD7xOjktzdwp5coac+kJV9l4jgg==} - - remark-frontmatter@3.0.0: - resolution: {integrity: sha512-mSuDd3svCHs+2PyO29h7iijIZx4plX0fheacJcAoYAASfgzgVIcXGYSq9GFyYocFLftQs8IOmmkgtOovs6d4oA==} - - remark-gfm@1.0.0: - resolution: {integrity: sha512-KfexHJCiqvrdBZVbQ6RopMZGwaXz6wFJEfByIuEwGf0arvITHjiKKZ1dpXujjH9KZdm1//XJQwgfnJ3lmXaDPA==} - - remark-parse@9.0.0: - resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==} - repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} @@ -926,361 +654,264 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - strip-json-comments@4.0.0: - resolution: {integrity: sha512-LzWcbfMbAsEDTRmhjWIioe8GcDRl0fa35YMXFoJKDdiD/quGFmjJjdgPjFJJNwCMaLyQqFIDqCdHD2V4HfLgYA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} - tinyglobby@0.2.10: - resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - traverse@0.6.10: - resolution: {integrity: sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==} - engines: {node: '>= 0.4'} - - trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.3: - resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - typedarray.prototype.slice@1.0.3: - resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==} - engines: {node: '>= 0.4'} - - uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - underscore@1.13.7: - resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} - - unified@9.2.2: - resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} - - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - - update-section@0.3.3: - resolution: {integrity: sha512-BpRZMZpgXLuTiKeiu7kK0nIPwGdyrqrs6EDSaXtjD/aQ2T+qVo9a5hRC3HN3iJjCMxNT/VxoLGQ7E/OzE5ucnw==} - - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - - vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} vscode-languageserver-textdocument@1.0.12: resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-builtin-type@1.2.0: - resolution: {integrity: sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} engines: {node: '>=12'} - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} hasBin: true - zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} - snapshots: - '@cspell/cspell-bundled-dicts@8.16.0': - dependencies: - '@cspell/dict-ada': 4.0.5 - '@cspell/dict-al': 1.0.3 - '@cspell/dict-aws': 4.0.7 - '@cspell/dict-bash': 4.1.8 - '@cspell/dict-companies': 3.1.7 - '@cspell/dict-cpp': 6.0.2 - '@cspell/dict-cryptocurrencies': 5.0.3 - '@cspell/dict-csharp': 4.0.5 - '@cspell/dict-css': 4.0.16 - '@cspell/dict-dart': 2.2.4 - '@cspell/dict-django': 4.1.3 - '@cspell/dict-docker': 1.1.11 - '@cspell/dict-dotnet': 5.0.8 - '@cspell/dict-elixir': 4.0.6 - '@cspell/dict-en-common-misspellings': 2.0.7 + '@cspell/cspell-bundled-dicts@8.18.0': + dependencies: + '@cspell/dict-ada': 4.1.0 + '@cspell/dict-al': 1.1.0 + '@cspell/dict-aws': 4.0.9 + '@cspell/dict-bash': 4.2.0 + '@cspell/dict-companies': 3.1.14 + '@cspell/dict-cpp': 6.0.6 + '@cspell/dict-cryptocurrencies': 5.0.4 + '@cspell/dict-csharp': 4.0.6 + '@cspell/dict-css': 4.0.17 + '@cspell/dict-dart': 2.3.0 + '@cspell/dict-data-science': 2.0.7 + '@cspell/dict-django': 4.1.4 + '@cspell/dict-docker': 1.1.12 + '@cspell/dict-dotnet': 5.0.9 + '@cspell/dict-elixir': 4.0.7 + '@cspell/dict-en-common-misspellings': 2.0.10 '@cspell/dict-en-gb': 1.1.33 - '@cspell/dict-en_us': 4.3.28 - '@cspell/dict-filetypes': 3.0.8 - '@cspell/dict-flutter': 1.0.3 - '@cspell/dict-fonts': 4.0.3 - '@cspell/dict-fsharp': 1.0.4 - '@cspell/dict-fullstack': 3.2.3 - '@cspell/dict-gaming-terms': 1.0.8 - '@cspell/dict-git': 3.0.3 - '@cspell/dict-golang': 6.0.17 - '@cspell/dict-google': 1.0.4 - '@cspell/dict-haskell': 4.0.4 - '@cspell/dict-html': 4.0.10 + '@cspell/dict-en_us': 4.3.35 + '@cspell/dict-filetypes': 3.0.11 + '@cspell/dict-flutter': 1.1.0 + '@cspell/dict-fonts': 4.0.4 + '@cspell/dict-fsharp': 1.1.0 + '@cspell/dict-fullstack': 3.2.6 + '@cspell/dict-gaming-terms': 1.1.0 + '@cspell/dict-git': 3.0.4 + '@cspell/dict-golang': 6.0.19 + '@cspell/dict-google': 1.0.8 + '@cspell/dict-haskell': 4.0.5 + '@cspell/dict-html': 4.0.11 '@cspell/dict-html-symbol-entities': 4.0.3 - '@cspell/dict-java': 5.0.10 - '@cspell/dict-julia': 1.0.4 - '@cspell/dict-k8s': 1.0.9 + '@cspell/dict-java': 5.0.11 + '@cspell/dict-julia': 1.1.0 + '@cspell/dict-k8s': 1.0.10 + '@cspell/dict-kotlin': 1.1.0 '@cspell/dict-latex': 4.0.3 - '@cspell/dict-lorem-ipsum': 4.0.3 - '@cspell/dict-lua': 4.0.6 - '@cspell/dict-makefile': 1.0.3 - '@cspell/dict-markdown': 2.0.7(@cspell/dict-css@4.0.16)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.10)(@cspell/dict-typescript@3.1.11) - '@cspell/dict-monkeyc': 1.0.9 - '@cspell/dict-node': 5.0.5 - '@cspell/dict-npm': 5.1.14 - '@cspell/dict-php': 4.0.13 - '@cspell/dict-powershell': 5.0.13 - '@cspell/dict-public-licenses': 2.0.11 - '@cspell/dict-python': 4.2.12 - '@cspell/dict-r': 2.0.4 - '@cspell/dict-ruby': 5.0.7 - '@cspell/dict-rust': 4.0.10 - '@cspell/dict-scala': 5.0.6 - '@cspell/dict-software-terms': 4.1.17 - '@cspell/dict-sql': 2.1.8 - '@cspell/dict-svelte': 1.0.5 - '@cspell/dict-swift': 2.0.4 - '@cspell/dict-terraform': 1.0.6 - '@cspell/dict-typescript': 3.1.11 - '@cspell/dict-vue': 3.0.3 - - '@cspell/cspell-json-reporter@8.16.0': - dependencies: - '@cspell/cspell-types': 8.16.0 - - '@cspell/cspell-pipe@8.16.0': {} - - '@cspell/cspell-resolver@8.16.0': + '@cspell/dict-lorem-ipsum': 4.0.4 + '@cspell/dict-lua': 4.0.7 + '@cspell/dict-makefile': 1.0.4 + '@cspell/dict-markdown': 2.0.9(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.0) + '@cspell/dict-monkeyc': 1.0.10 + '@cspell/dict-node': 5.0.6 + '@cspell/dict-npm': 5.1.31 + '@cspell/dict-php': 4.0.14 + '@cspell/dict-powershell': 5.0.14 + '@cspell/dict-public-licenses': 2.0.13 + '@cspell/dict-python': 4.2.16 + '@cspell/dict-r': 2.1.0 + '@cspell/dict-ruby': 5.0.8 + '@cspell/dict-rust': 4.0.11 + '@cspell/dict-scala': 5.0.7 + '@cspell/dict-shell': 1.1.0 + '@cspell/dict-software-terms': 5.0.2 + '@cspell/dict-sql': 2.2.0 + '@cspell/dict-svelte': 1.0.6 + '@cspell/dict-swift': 2.0.5 + '@cspell/dict-terraform': 1.1.1 + '@cspell/dict-typescript': 3.2.0 + '@cspell/dict-vue': 3.0.4 + + '@cspell/cspell-json-reporter@8.18.0': + dependencies: + '@cspell/cspell-types': 8.18.0 + + '@cspell/cspell-pipe@8.18.0': {} + + '@cspell/cspell-resolver@8.18.0': dependencies: global-directory: 4.0.1 - '@cspell/cspell-service-bus@8.16.0': {} + '@cspell/cspell-service-bus@8.18.0': {} - '@cspell/cspell-types@8.16.0': {} + '@cspell/cspell-types@8.18.0': {} - '@cspell/dict-ada@4.0.5': {} + '@cspell/dict-ada@4.1.0': {} - '@cspell/dict-al@1.0.3': {} + '@cspell/dict-al@1.1.0': {} - '@cspell/dict-aws@4.0.7': {} + '@cspell/dict-aws@4.0.9': {} - '@cspell/dict-bash@4.1.8': {} + '@cspell/dict-bash@4.2.0': + dependencies: + '@cspell/dict-shell': 1.1.0 - '@cspell/dict-companies@3.1.7': {} + '@cspell/dict-companies@3.1.14': {} - '@cspell/dict-cpp@6.0.2': {} + '@cspell/dict-cpp@6.0.6': {} - '@cspell/dict-cryptocurrencies@5.0.3': {} + '@cspell/dict-cryptocurrencies@5.0.4': {} - '@cspell/dict-csharp@4.0.5': {} + '@cspell/dict-csharp@4.0.6': {} - '@cspell/dict-css@4.0.16': {} + '@cspell/dict-css@4.0.17': {} - '@cspell/dict-dart@2.2.4': {} + '@cspell/dict-dart@2.3.0': {} - '@cspell/dict-data-science@2.0.5': {} + '@cspell/dict-data-science@2.0.7': {} - '@cspell/dict-django@4.1.3': {} + '@cspell/dict-django@4.1.4': {} - '@cspell/dict-docker@1.1.11': {} + '@cspell/dict-docker@1.1.12': {} - '@cspell/dict-dotnet@5.0.8': {} + '@cspell/dict-dotnet@5.0.9': {} - '@cspell/dict-elixir@4.0.6': {} + '@cspell/dict-elixir@4.0.7': {} - '@cspell/dict-en-common-misspellings@2.0.7': {} + '@cspell/dict-en-common-misspellings@2.0.10': {} '@cspell/dict-en-gb@1.1.33': {} - '@cspell/dict-en_us@4.3.28': {} + '@cspell/dict-en_us@4.3.35': {} - '@cspell/dict-filetypes@3.0.8': {} + '@cspell/dict-filetypes@3.0.11': {} - '@cspell/dict-flutter@1.0.3': {} + '@cspell/dict-flutter@1.1.0': {} - '@cspell/dict-fonts@4.0.3': {} + '@cspell/dict-fonts@4.0.4': {} - '@cspell/dict-fsharp@1.0.4': {} + '@cspell/dict-fsharp@1.1.0': {} - '@cspell/dict-fullstack@3.2.3': {} + '@cspell/dict-fullstack@3.2.6': {} - '@cspell/dict-gaming-terms@1.0.8': {} + '@cspell/dict-gaming-terms@1.1.0': {} - '@cspell/dict-git@3.0.3': {} + '@cspell/dict-git@3.0.4': {} - '@cspell/dict-golang@6.0.17': {} + '@cspell/dict-golang@6.0.19': {} - '@cspell/dict-google@1.0.4': {} + '@cspell/dict-google@1.0.8': {} - '@cspell/dict-haskell@4.0.4': {} + '@cspell/dict-haskell@4.0.5': {} '@cspell/dict-html-symbol-entities@4.0.3': {} - '@cspell/dict-html@4.0.10': {} + '@cspell/dict-html@4.0.11': {} - '@cspell/dict-java@5.0.10': {} + '@cspell/dict-java@5.0.11': {} - '@cspell/dict-julia@1.0.4': {} + '@cspell/dict-julia@1.1.0': {} - '@cspell/dict-k8s@1.0.9': {} + '@cspell/dict-k8s@1.0.10': {} + + '@cspell/dict-kotlin@1.1.0': {} '@cspell/dict-latex@4.0.3': {} - '@cspell/dict-lorem-ipsum@4.0.3': {} + '@cspell/dict-lorem-ipsum@4.0.4': {} - '@cspell/dict-lua@4.0.6': {} + '@cspell/dict-lua@4.0.7': {} - '@cspell/dict-makefile@1.0.3': {} + '@cspell/dict-makefile@1.0.4': {} - '@cspell/dict-markdown@2.0.7(@cspell/dict-css@4.0.16)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.10)(@cspell/dict-typescript@3.1.11)': + '@cspell/dict-markdown@2.0.9(@cspell/dict-css@4.0.17)(@cspell/dict-html-symbol-entities@4.0.3)(@cspell/dict-html@4.0.11)(@cspell/dict-typescript@3.2.0)': dependencies: - '@cspell/dict-css': 4.0.16 - '@cspell/dict-html': 4.0.10 + '@cspell/dict-css': 4.0.17 + '@cspell/dict-html': 4.0.11 '@cspell/dict-html-symbol-entities': 4.0.3 - '@cspell/dict-typescript': 3.1.11 + '@cspell/dict-typescript': 3.2.0 - '@cspell/dict-monkeyc@1.0.9': {} + '@cspell/dict-monkeyc@1.0.10': {} - '@cspell/dict-node@5.0.5': {} + '@cspell/dict-node@5.0.6': {} - '@cspell/dict-npm@5.1.14': {} + '@cspell/dict-npm@5.1.31': {} - '@cspell/dict-php@4.0.13': {} + '@cspell/dict-php@4.0.14': {} - '@cspell/dict-powershell@5.0.13': {} + '@cspell/dict-powershell@5.0.14': {} - '@cspell/dict-public-licenses@2.0.11': {} + '@cspell/dict-public-licenses@2.0.13': {} - '@cspell/dict-python@4.2.12': + '@cspell/dict-python@4.2.16': dependencies: - '@cspell/dict-data-science': 2.0.5 + '@cspell/dict-data-science': 2.0.7 + + '@cspell/dict-r@2.1.0': {} - '@cspell/dict-r@2.0.4': {} + '@cspell/dict-ruby@5.0.8': {} - '@cspell/dict-ruby@5.0.7': {} + '@cspell/dict-rust@4.0.11': {} - '@cspell/dict-rust@4.0.10': {} + '@cspell/dict-scala@5.0.7': {} - '@cspell/dict-scala@5.0.6': {} + '@cspell/dict-shell@1.1.0': {} - '@cspell/dict-software-terms@4.1.17': {} + '@cspell/dict-software-terms@5.0.2': {} - '@cspell/dict-sql@2.1.8': {} + '@cspell/dict-sql@2.2.0': {} - '@cspell/dict-svelte@1.0.5': {} + '@cspell/dict-svelte@1.0.6': {} - '@cspell/dict-swift@2.0.4': {} + '@cspell/dict-swift@2.0.5': {} - '@cspell/dict-terraform@1.0.6': {} + '@cspell/dict-terraform@1.1.1': {} - '@cspell/dict-typescript@3.1.11': {} + '@cspell/dict-typescript@3.2.0': {} - '@cspell/dict-vue@3.0.3': {} + '@cspell/dict-vue@3.0.4': {} - '@cspell/dynamic-import@8.16.0': + '@cspell/dynamic-import@8.18.0': dependencies: + '@cspell/url': 8.18.0 import-meta-resolve: 4.1.0 - '@cspell/filetypes@8.16.0': {} + '@cspell/filetypes@8.18.0': {} - '@cspell/strong-weak-map@8.16.0': {} + '@cspell/strong-weak-map@8.18.0': {} - '@cspell/url@8.16.0': {} + '@cspell/url@8.18.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -1292,96 +923,50 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 - '@textlint/ast-node-types@12.6.1': {} + '@sindresorhus/merge-streams@2.3.0': {} - '@textlint/markdown-to-ast@12.6.1': + '@types/debug@4.1.12': dependencies: - '@textlint/ast-node-types': 12.6.1 - debug: 4.3.7 - mdast-util-gfm-autolink-literal: 0.1.3 - remark-footnotes: 3.0.0 - remark-frontmatter: 3.0.0 - remark-gfm: 1.0.0 - remark-parse: 9.0.0 - traverse: 0.6.10 - unified: 9.2.2 - transitivePeerDependencies: - - supports-color + '@types/ms': 2.1.0 - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.11 + '@types/katex@0.16.7': {} - '@types/unist@2.0.11': {} + '@types/ms@2.1.0': {} - anchor-markdown-header@0.6.0: - dependencies: - emoji-regex: 10.1.0 + '@types/unist@2.0.11': {} argparse@2.0.1: {} - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - array-timsort@1.0.3: {} - array-union@3.0.1: {} - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - bail@1.0.5: {} - braces@3.0.3: dependencies: fill-range: 7.1.1 - call-bind@1.0.7: - 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.2 - callsites@3.1.0: {} - ccount@1.1.0: {} - chalk-template@1.1.0: dependencies: - chalk: 5.3.0 + chalk: 5.4.1 - chalk@5.3.0: {} + chalk@5.4.1: {} - character-entities-legacy@1.1.4: {} + character-entities-legacy@3.0.0: {} - character-entities@1.2.4: {} + character-entities@2.0.2: {} - character-reference-invalid@1.1.4: {} + character-reference-invalid@2.0.1: {} clear-module@4.1.2: dependencies: parent-module: 2.0.0 resolve-from: 5.0.0 - commander@12.1.0: {} + commander@13.1.0: {} + + commander@8.3.0: {} comment-json@4.2.5: dependencies: @@ -1393,270 +978,131 @@ snapshots: core-util-is@1.0.3: {} - cspell-config-lib@8.16.0: + cspell-config-lib@8.18.0: dependencies: - '@cspell/cspell-types': 8.16.0 + '@cspell/cspell-types': 8.18.0 comment-json: 4.2.5 - yaml: 2.6.1 + yaml: 2.7.0 - cspell-dictionary@8.16.0: + cspell-dictionary@8.18.0: dependencies: - '@cspell/cspell-pipe': 8.16.0 - '@cspell/cspell-types': 8.16.0 - cspell-trie-lib: 8.16.0 - fast-equals: 5.0.1 + '@cspell/cspell-pipe': 8.18.0 + '@cspell/cspell-types': 8.18.0 + cspell-trie-lib: 8.18.0 + fast-equals: 5.2.2 - cspell-gitignore@8.16.0: + cspell-gitignore@8.18.0: dependencies: - '@cspell/url': 8.16.0 - cspell-glob: 8.16.0 - cspell-io: 8.16.0 - find-up-simple: 1.0.0 + '@cspell/url': 8.18.0 + cspell-glob: 8.18.0 + cspell-io: 8.18.0 - cspell-glob@8.16.0: + cspell-glob@8.18.0: dependencies: - '@cspell/url': 8.16.0 + '@cspell/url': 8.18.0 micromatch: 4.0.8 - cspell-grammar@8.16.0: + cspell-grammar@8.18.0: dependencies: - '@cspell/cspell-pipe': 8.16.0 - '@cspell/cspell-types': 8.16.0 + '@cspell/cspell-pipe': 8.18.0 + '@cspell/cspell-types': 8.18.0 - cspell-io@8.16.0: + cspell-io@8.18.0: dependencies: - '@cspell/cspell-service-bus': 8.16.0 - '@cspell/url': 8.16.0 + '@cspell/cspell-service-bus': 8.18.0 + '@cspell/url': 8.18.0 - cspell-lib@8.16.0: + cspell-lib@8.18.0: dependencies: - '@cspell/cspell-bundled-dicts': 8.16.0 - '@cspell/cspell-pipe': 8.16.0 - '@cspell/cspell-resolver': 8.16.0 - '@cspell/cspell-types': 8.16.0 - '@cspell/dynamic-import': 8.16.0 - '@cspell/filetypes': 8.16.0 - '@cspell/strong-weak-map': 8.16.0 - '@cspell/url': 8.16.0 + '@cspell/cspell-bundled-dicts': 8.18.0 + '@cspell/cspell-pipe': 8.18.0 + '@cspell/cspell-resolver': 8.18.0 + '@cspell/cspell-types': 8.18.0 + '@cspell/dynamic-import': 8.18.0 + '@cspell/filetypes': 8.18.0 + '@cspell/strong-weak-map': 8.18.0 + '@cspell/url': 8.18.0 clear-module: 4.1.2 comment-json: 4.2.5 - cspell-config-lib: 8.16.0 - cspell-dictionary: 8.16.0 - cspell-glob: 8.16.0 - cspell-grammar: 8.16.0 - cspell-io: 8.16.0 - cspell-trie-lib: 8.16.0 + cspell-config-lib: 8.18.0 + cspell-dictionary: 8.18.0 + cspell-glob: 8.18.0 + cspell-grammar: 8.18.0 + cspell-io: 8.18.0 + cspell-trie-lib: 8.18.0 env-paths: 3.0.0 - fast-equals: 5.0.1 + fast-equals: 5.2.2 gensequence: 7.0.0 - import-fresh: 3.3.0 + import-fresh: 3.3.1 resolve-from: 5.0.0 vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 + vscode-uri: 3.1.0 xdg-basedir: 5.1.0 - cspell-trie-lib@8.16.0: + cspell-trie-lib@8.18.0: dependencies: - '@cspell/cspell-pipe': 8.16.0 - '@cspell/cspell-types': 8.16.0 + '@cspell/cspell-pipe': 8.18.0 + '@cspell/cspell-types': 8.18.0 gensequence: 7.0.0 - cspell@8.16.0: + cspell@8.18.0: dependencies: - '@cspell/cspell-json-reporter': 8.16.0 - '@cspell/cspell-pipe': 8.16.0 - '@cspell/cspell-types': 8.16.0 - '@cspell/dynamic-import': 8.16.0 - '@cspell/url': 8.16.0 - chalk: 5.3.0 + '@cspell/cspell-json-reporter': 8.18.0 + '@cspell/cspell-pipe': 8.18.0 + '@cspell/cspell-types': 8.18.0 + '@cspell/dynamic-import': 8.18.0 + '@cspell/url': 8.18.0 + chalk: 5.4.1 chalk-template: 1.1.0 - commander: 12.1.0 - cspell-dictionary: 8.16.0 - cspell-gitignore: 8.16.0 - cspell-glob: 8.16.0 - cspell-io: 8.16.0 - cspell-lib: 8.16.0 + commander: 13.1.0 + cspell-dictionary: 8.18.0 + cspell-gitignore: 8.18.0 + cspell-glob: 8.18.0 + cspell-io: 8.18.0 + cspell-lib: 8.18.0 fast-json-stable-stringify: 2.1.0 file-entry-cache: 9.1.0 get-stdin: 9.0.0 - semver: 7.6.3 - tinyglobby: 0.2.10 - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 + semver: 7.7.1 + tinyglobby: 0.2.12 - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctoc@2.2.1: - dependencies: - '@textlint/markdown-to-ast': 12.6.1 - anchor-markdown-header: 0.6.0 - htmlparser2: 7.2.0 - minimist: 1.2.8 - underscore: 1.13.7 - update-section: 0.3.3 - transitivePeerDependencies: - - supports-color - - dom-serializer@1.4.1: + decode-named-character-reference@1.1.0: dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - - domelementtype@2.3.0: {} + character-entities: 2.0.2 - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 + dequal@2.0.3: {} - domutils@2.8.0: + devlop@1.1.0: dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - - emoji-regex@10.1.0: {} - - entities@2.1.0: {} - - entities@2.2.0: {} + dequal: 2.0.3 - entities@3.0.1: {} + entities@4.5.0: {} env-paths@3.0.0: {} - es-abstract@1.23.5: - 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.3.0 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - 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.3 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 - 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.3 - typed-array-length: 1.0.7 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - escape-string-regexp@4.0.0: {} - esprima@4.0.1: {} - extend@3.0.2: {} - - fast-equals@5.0.1: {} + fast-equals@5.2.2: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.4 + micromatch: 4.0.8 fast-json-stable-stringify@2.1.0: {} - fastq@1.17.1: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 - fault@1.0.4: - dependencies: - format: 0.2.2 - - fdir@6.4.2(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -1668,50 +1114,17 @@ snapshots: dependencies: to-regex-range: 5.0.1 - find-up-simple@1.0.0: {} - flat-cache@5.0.0: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - format@0.2.2: {} - - function-bind@1.1.2: {} - - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} + flatted@3.3.3: {} gensequence@7.0.0: {} - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - get-stdin@9.0.0: {} - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -1720,54 +1133,20 @@ snapshots: dependencies: ini: 4.1.1 - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - - globby@12.1.0: + globby@14.0.2: dependencies: - array-union: 3.0.1 - dir-glob: 3.0.1 - fast-glob: 3.3.2 + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.3 ignore: 5.3.2 - merge2: 1.4.1 - slash: 4.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - has-bigints@1.0.2: {} + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 has-own-prop@2.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - htmlparser2@7.2.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 3.0.1 - ignore@5.3.2: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -1776,311 +1155,266 @@ snapshots: ini@4.1.1: {} - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - - is-alphabetical@1.0.4: {} - - is-alphanumerical@1.0.4: - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-async-function@2.0.0: - dependencies: - has-tostringtag: 1.0.2 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-buffer@2.0.5: {} - - is-callable@1.2.7: {} - - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 + is-alphabetical@2.0.1: {} - is-date-object@1.0.5: + is-alphanumerical@2.0.1: dependencies: - has-tostringtag: 1.0.2 + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 - is-decimal@1.0.4: {} + is-decimal@2.0.1: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.1.0: - dependencies: - call-bind: 1.0.7 - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-hexadecimal@1.0.4: {} - - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 + is-hexadecimal@2.0.1: {} is-number@7.0.0: {} - is-plain-obj@2.1.0: {} - - is-regex@1.1.4: + js-yaml@4.1.0: dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 + argparse: 2.0.1 - is-set@2.0.3: {} + json-buffer@3.0.1: {} - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 + jsonc-parser@3.3.1: {} - is-string@1.0.7: + katex@0.16.21: dependencies: - has-tostringtag: 1.0.2 + commander: 8.3.0 - is-symbol@1.0.4: + keyv@4.5.4: dependencies: - has-symbols: 1.0.3 + json-buffer: 3.0.1 - is-typed-array@1.1.13: + linkify-it@5.0.0: dependencies: - which-typed-array: 1.1.15 + uc.micro: 2.1.0 - is-weakmap@2.0.2: {} + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 - is-weakref@1.0.2: + markdownlint-cli2-formatter-default@0.0.5(markdownlint-cli2@0.17.2): dependencies: - call-bind: 1.0.7 + markdownlint-cli2: 0.17.2 - is-weakset@2.0.3: + markdownlint-cli2@0.17.2: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + globby: 14.0.2 + js-yaml: 4.1.0 + jsonc-parser: 3.3.1 + markdownlint: 0.37.4 + markdownlint-cli2-formatter-default: 0.0.5(markdownlint-cli2@0.17.2) + micromatch: 4.0.8 + transitivePeerDependencies: + - supports-color - isarray@2.0.5: {} + markdownlint@0.37.4: + dependencies: + markdown-it: 14.1.0 + micromark: 4.0.1 + micromark-core-commonmark: 2.0.2 + micromark-extension-directive: 3.0.2 + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-table: 2.1.0 + micromark-extension-math: 3.1.0 + micromark-util-types: 2.0.1 + transitivePeerDependencies: + - supports-color - json-buffer@3.0.1: {} + mdurl@2.0.0: {} - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 + merge2@1.4.1: {} - linkify-it@3.0.3: + micromark-core-commonmark@2.0.2: dependencies: - uc.micro: 1.0.6 - - longest-streak@2.0.4: {} + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - markdown-it@12.3.2: + micromark-extension-directive@3.0.2: dependencies: - argparse: 2.0.1 - entities: 2.1.0 - linkify-it: 3.0.3 - mdurl: 1.0.1 - uc.micro: 1.0.6 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 + parse-entities: 4.0.2 - markdown-table@2.0.0: + micromark-extension-gfm-autolink-literal@2.1.0: dependencies: - repeat-string: 1.6.1 + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - markdownlint-cli2-formatter-default@0.0.3(markdownlint-cli2@0.4.0): + micromark-extension-gfm-footnote@2.1.0: dependencies: - markdownlint-cli2: 0.4.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - markdownlint-cli2@0.4.0: + micromark-extension-gfm-table@2.1.0: dependencies: - globby: 12.1.0 - markdownlint: 0.25.1 - markdownlint-cli2-formatter-default: 0.0.3(markdownlint-cli2@0.4.0) - markdownlint-rule-helpers: 0.16.0 - micromatch: 4.0.4 - strip-json-comments: 4.0.0 - yaml: 1.10.2 - - markdownlint-rule-helpers@0.16.0: {} + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - markdownlint@0.25.1: + micromark-extension-math@3.1.0: dependencies: - markdown-it: 12.3.2 + '@types/katex': 0.16.7 + devlop: 1.1.0 + katex: 0.16.21 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - mdast-util-find-and-replace@1.1.1: + micromark-factory-destination@2.0.1: dependencies: - escape-string-regexp: 4.0.0 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - mdast-util-footnote@0.1.7: + micromark-factory-label@2.0.1: dependencies: - mdast-util-to-markdown: 0.6.5 - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - mdast-util-from-markdown@0.8.5: + micromark-factory-space@2.0.1: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-string: 2.0.0 - micromark: 2.11.4 - parse-entities: 2.0.0 - unist-util-stringify-position: 2.0.3 - transitivePeerDependencies: - - supports-color + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.1 - mdast-util-frontmatter@0.2.0: + micromark-factory-title@2.0.1: dependencies: - micromark-extension-frontmatter: 0.2.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - mdast-util-gfm-autolink-literal@0.1.3: + micromark-factory-whitespace@2.0.1: dependencies: - ccount: 1.1.0 - mdast-util-find-and-replace: 1.1.1 - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - mdast-util-gfm-strikethrough@0.2.3: + micromark-util-character@2.1.1: dependencies: - mdast-util-to-markdown: 0.6.5 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - mdast-util-gfm-table@0.1.6: + micromark-util-chunked@2.0.1: dependencies: - markdown-table: 2.0.0 - mdast-util-to-markdown: 0.6.5 + micromark-util-symbol: 2.0.1 - mdast-util-gfm-task-list-item@0.1.6: + micromark-util-classify-character@2.0.1: dependencies: - mdast-util-to-markdown: 0.6.5 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - mdast-util-gfm@0.1.2: + micromark-util-combine-extensions@2.0.1: dependencies: - mdast-util-gfm-autolink-literal: 0.1.3 - mdast-util-gfm-strikethrough: 0.2.3 - mdast-util-gfm-table: 0.1.6 - mdast-util-gfm-task-list-item: 0.1.6 - mdast-util-to-markdown: 0.6.5 - transitivePeerDependencies: - - supports-color + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.1 - mdast-util-to-markdown@0.6.5: + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - '@types/unist': 2.0.11 - longest-streak: 2.0.4 - mdast-util-to-string: 2.0.0 - parse-entities: 2.0.0 - repeat-string: 1.6.1 - zwitch: 1.0.5 + micromark-util-symbol: 2.0.1 - mdast-util-to-string@2.0.0: {} + micromark-util-encode@2.0.1: {} - mdurl@1.0.1: {} + micromark-util-html-tag-name@2.0.1: {} - merge2@1.4.1: {} - - micromark-extension-footnote@0.3.2: + micromark-util-normalize-identifier@2.0.1: dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color + micromark-util-symbol: 2.0.1 - micromark-extension-frontmatter@0.2.2: + micromark-util-resolve-all@2.0.1: dependencies: - fault: 1.0.4 + micromark-util-types: 2.0.1 - micromark-extension-gfm-autolink-literal@0.5.7: + micromark-util-sanitize-uri@2.0.1: dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - micromark-extension-gfm-strikethrough@0.6.5: + micromark-util-subtokenize@2.1.0: dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 - micromark-extension-gfm-table@0.4.3: - dependencies: - micromark: 2.11.4 - transitivePeerDependencies: - - supports-color + micromark-util-symbol@2.0.1: {} - micromark-extension-gfm-tagfilter@0.3.0: {} + micromark-util-types@2.0.1: {} - micromark-extension-gfm-task-list-item@0.3.3: + micromark@4.0.1: dependencies: - micromark: 2.11.4 + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.1.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.2 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.1 transitivePeerDependencies: - supports-color - micromark-extension-gfm@0.3.3: - dependencies: - micromark: 2.11.4 - micromark-extension-gfm-autolink-literal: 0.5.7 - micromark-extension-gfm-strikethrough: 0.6.5 - micromark-extension-gfm-table: 0.4.3 - micromark-extension-gfm-tagfilter: 0.3.0 - micromark-extension-gfm-task-list-item: 0.3.3 - transitivePeerDependencies: - - supports-color - - micromark@2.11.4: - dependencies: - debug: 4.3.7 - parse-entities: 2.0.0 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.4: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - minimist@1.2.8: {} - ms@2.1.3: {} - object-inspect@1.13.3: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -2089,292 +1423,59 @@ snapshots: dependencies: callsites: 3.1.0 - parse-entities@2.0.0: + parse-entities@4.0.2: dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.1.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 - path-type@4.0.0: {} + path-type@5.0.0: {} picomatch@2.3.1: {} picomatch@4.0.2: {} - possible-typed-array-names@1.0.0: {} + punycode.js@2.3.1: {} queue-microtask@1.2.3: {} - reflect.getprototypeof@1.0.7: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - which-builtin-type: 1.2.0 - - regexp.prototype.flags@1.5.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - remark-footnotes@3.0.0: - dependencies: - mdast-util-footnote: 0.1.7 - micromark-extension-footnote: 0.3.2 - transitivePeerDependencies: - - supports-color - - remark-frontmatter@3.0.0: - dependencies: - mdast-util-frontmatter: 0.2.0 - micromark-extension-frontmatter: 0.2.2 - - remark-gfm@1.0.0: - dependencies: - mdast-util-gfm: 0.1.2 - micromark-extension-gfm: 0.3.3 - transitivePeerDependencies: - - supports-color - - remark-parse@9.0.0: - dependencies: - mdast-util-from-markdown: 0.8.5 - transitivePeerDependencies: - - supports-color - repeat-string@1.6.1: {} resolve-from@4.0.0: {} resolve-from@5.0.0: {} - reusify@1.0.4: {} + reusify@1.1.0: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - - semver@7.6.3: {} - - set-function-length@1.2.2: - 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: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 + semver@7.7.1: {} - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.3 - - slash@4.0.0: {} + slash@5.1.0: {} - string.prototype.trim@1.2.9: + tinyglobby@0.2.12: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - strip-json-comments@4.0.0: {} - - tinyglobby@0.2.10: - dependencies: - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) picomatch: 4.0.2 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - traverse@0.6.10: - dependencies: - gopd: 1.0.1 - typedarray.prototype.slice: 1.0.3 - which-typed-array: 1.1.15 - - trough@1.0.5: {} - - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - 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.3: - 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 - reflect.getprototypeof: 1.0.7 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.7 - - typedarray.prototype.slice@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.5 - es-errors: 1.3.0 - typed-array-buffer: 1.0.2 - typed-array-byte-offset: 1.0.3 - - uc.micro@1.0.6: {} - - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - - underscore@1.13.7: {} - - unified@9.2.2: - dependencies: - '@types/unist': 2.0.11 - bail: 1.0.5 - extend: 3.0.2 - is-buffer: 2.0.5 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 - - unist-util-is@4.1.0: {} - - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.11 - - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - - update-section@0.3.3: {} - - vfile-message@2.0.4: - dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position: 2.0.3 + uc.micro@2.1.0: {} - vfile@4.2.1: - dependencies: - '@types/unist': 2.0.11 - is-buffer: 2.0.5 - unist-util-stringify-position: 2.0.3 - vfile-message: 2.0.4 + unicorn-magic@0.1.0: {} vscode-languageserver-textdocument@1.0.12: {} - vscode-uri@3.0.8: {} - - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-builtin-type@1.2.0: - dependencies: - call-bind: 1.0.7 - 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.1.0 - 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.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - - which-typed-array@1.1.15: - 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 + vscode-uri@3.1.0: {} xdg-basedir@5.1.0: {} - yaml@1.10.2: {} - - yaml@2.6.1: {} - - zwitch@1.0.5: {} + yaml@2.7.0: {} diff --git a/book/src/advanced-usage/new-extension.md b/book/src/advanced-usage/new-extension.md index ecbd7dd134..78a1d04b3b 100644 --- a/book/src/advanced-usage/new-extension.md +++ b/book/src/advanced-usage/new-extension.md @@ -10,6 +10,7 @@ Extensions in OpenVM let you introduce additional functionality without disrupti This modular architecture means the extension cleanly adds new capabilities while leaving the rest of OpenVM untouched. The entire system, including the extension’s operations, can still be proven correct. Conceptually, a new extension consists of three parts: + - **Guest**: High-level Rust code that defines and uses the new operations. - **Transpiler**: Logic that converts custom RISC-V instructions into corresponding OpenVM instructions. - **Circuit**: The special chips that enforce correctness of instruction execution through polynomial constraints. @@ -37,5 +38,4 @@ The circuit component is where the extension’s logic is enforced in a zero-kno - Implements the computing logic, so that the output always corresponds to the correct result of the new operation. The chip has access to the memory shared with the other chips from the VM via [our special architecture](https://github.com/openvm-org/openvm/blob/main/docs/specs/ISA.md). - Properly constrains all the inputs, outputs and intermediate variables using polynomial equations in such a way that there is no way to fill these variables with values that correspond to an incorrect output while fitting the constraints. - For more technical details on writing circuits and constraints, consult the OpenVM [contributor documentation](https://github.com/openvm-org/openvm/blob/main/docs/specs/README.md), which provides specifications and guidelines for integrating your extension into the OpenVM framework. diff --git a/book/src/advanced-usage/sdk.md b/book/src/advanced-usage/sdk.md index 20e4b52956..41ab1f6213 100644 --- a/book/src/advanced-usage/sdk.md +++ b/book/src/advanced-usage/sdk.md @@ -34,7 +34,6 @@ The `SdkVmConfig` struct allows you to specify the extensions and system configu > ℹ️ > When using Rust to write the guest program, the VM system configuration should keep the default value `pointer_max_bits = 29` to match the hardcoded memory limit of the memory allocator. Otherwise, the guest program may fail due to out of bounds memory access in the VM. - ## Running a Program To run your program and see the public value output, you can do the following: diff --git a/book/src/custom-extensions/ecc.md b/book/src/custom-extensions/ecc.md index 26c722fa33..331430d6ad 100644 --- a/book/src/custom-extensions/ecc.md +++ b/book/src/custom-extensions/ecc.md @@ -111,4 +111,4 @@ b = "7" The `supported_modulus` parameter is a list of moduli that the guest program will use. As mentioned in the [algebra extension](./algebra.md) chapter, the order of moduli in `[app_vm_config.modular]` must match the order in the `moduli_init!` macro. -The `ecc.supported_curves` parameter is a list of supported curves that the guest program will use. They must be provided in decimal format in the `.toml` file. For multiple curves create multiple `[[app_vm_config.ecc.supported_curves]]` sections. The order of curves in `[[app_vm_config.ecc.supported_curves]]` must match the order in the `sw_init!` macro. \ No newline at end of file +The `ecc.supported_curves` parameter is a list of supported curves that the guest program will use. They must be provided in decimal format in the `.toml` file. For multiple curves create multiple `[[app_vm_config.ecc.supported_curves]]` sections. The order of curves in `[[app_vm_config.ecc.supported_curves]]` must match the order in the `sw_init!` macro. diff --git a/book/src/writing-apps/overview.md b/book/src/writing-apps/overview.md index 98db17b719..c3e5a79020 100644 --- a/book/src/writing-apps/overview.md +++ b/book/src/writing-apps/overview.md @@ -28,6 +28,7 @@ For more information on both commands, see the [build](./build.md) docs. The `--input` field needs to either be a single hex string or a file path to a json file that contains the key `input` and an array of hex strings. Note that if your hex string represents a single number, it should be written in little-endian format (as this is what the VM expects). Also note that if you need to provide multiple input streams, you have to use the file path option. Each hex string (either in the file or as the direct input) is either: + - Hex string of bytes, which is prefixed with 0x01 - Hex string of native field elements (represented as u32, little endian), prefixed with 0x02 diff --git a/book/src/writing-apps/verify.md b/book/src/writing-apps/verify.md index 9f123dd2c1..4a4f4b0dc3 100644 --- a/book/src/writing-apps/verify.md +++ b/book/src/writing-apps/verify.md @@ -15,10 +15,13 @@ If you omit `--app_vk` and/or `--proof`, the command will search for those files Once again, if you omitted `--output` and `--vk_output` in the `keygen` and `prove` commands, you can omit `--app_vk` and `--proof` in the `verify` command. ## EVM Level + EVM level proof setup requires large amounts of computation and memory (~200GB). It is recommended to run this process on a server. ### Install Solc + Install `solc` `0.8.19` using `svm` + ```bash # Install svm cargo install --version 0.5.7 svm-rs @@ -37,19 +40,23 @@ The workflow for generating an end-to-end EVM proof requires first generating an ```bash cargo openvm setup ``` + Note that `cargo openvm setup` may attempt to download other files (i.e. KZG parameters) from an AWS S3 bucket into `~/.openvm/`. This command can take ~20mins on a `m6a.16xlarge` instance due to the keygen time. Upon a successful run, the command will write the files + - `agg.pk` - `verifier.sol` - `verifier.bytecode.json` + to `~/.openvm/`, where `~` is the directory specified by environment variable `$HOME`. Every command that requires these files will look for them in this directory. The `agg.pk` contains all aggregation proving keys necessary for aggregating to a final EVM proof. The `verifier.sol` file contains a Solidity contract to verify the final EVM proof. The contract is named `Halo2Verifier` and proof verification is the fallback function of the contract. In addition, the command outputs a JSON file `verifier.bytecode.json` of the form + ```json { "sol_compiler_version": "0.8.19", @@ -57,6 +64,7 @@ In addition, the command outputs a JSON file `verifier.bytecode.json` of the for "bytecode": "0x..." } ``` + where `sol_compiler_version` is the Solidity compiler version used to compile the contract (currently fixed to `0.8.19`), `sol_compiler_options` are additional compiler options used, and `bytecode` is the compiled EVM bytecode as a hex string. @@ -67,7 +75,6 @@ where `sol_compiler_version` is the Solidity compiler version used to compile th > > This command requires very large amounts of computation and memory (~200 GB). - ## Generating and Verifying an EVM Proof To generate and verify an EVM proof, you need to run the following commands: @@ -92,7 +99,9 @@ The EVM proof is written to `evm.proof` as a JSON of the following format: "proof": "0x.." } ``` + where each field is a hex string. We explain what each field represents: + - `accumulators`: `12 * 32` bytes representing the KZG accumulator of the proof, where the proof is from a SNARK using the KZG commitment scheme. - `exe_commit`: `32` bytes for the commitment of the app executable. - `leaf_commit`: `32` bytes for the commitment of the executable verifying app VM proofs. @@ -104,6 +113,7 @@ where each field is a hex string. We explain what each field represents: The `cargo openvm verify evm` command reads the EVM proof from JSON file and then simulates the call to the verifier contract using [Revm](https://github.com/bluealloy/revm/tree/main). This function should only be used for testing and development purposes but not for production. To verify the EVM proof in an EVM execution environment, the EVM proof must be formatted into calldata bytes and sent to the fallback function of the verifier smart contract. The calldata bytes are formed by concatenating the fields of the EVM proof described above in the following order and format: + 1. `accumulators`: every `32` bytes are _reversed_ from little endian to big endian and concatenated. 2. `exe_commit`: the `32` bytes are _reversed_ from little endian to big endian. 3. `leaf_commit`: the `32` bytes are _reversed_ from little endian to big endian. diff --git a/book/src/writing-apps/write-program.md b/book/src/writing-apps/write-program.md index 517784473c..9066a142d5 100644 --- a/book/src/writing-apps/write-program.md +++ b/book/src/writing-apps/write-program.md @@ -56,6 +56,7 @@ Binary crates can generally be written using the standard library, although for OpenVM fully supports `no_std` Rust. We refer to the [Embedded Rust Book](https://docs.rust-embedded.org/book/intro/no-std.html) for a more detailed introduction to `no_std` Rust. ### `no_std` library crates + In a library crate, you should add the following to `lib.rs` to declare your crate as `no_std`: ```rust @@ -101,16 +102,20 @@ fn main() { ``` If you want to feature gate the usage of the standard library, you can add + ```toml [features] std = ["openvm/std"] ``` + to `Cargo.toml` as discussed above. In this case, the `main.rs` header should be modified to: + ```rust // main.rs #![cfg_attr(not(feature = "std"), no_main)] #![cfg_attr(not(feature = "std"), no_std)] ``` + and you still need the `openvm::entry!(main)` line. This tells Rust to use the custom `main` handler when the environment is `no_std`, but to use the Rust `std` library and the standard `main` handler when the feature `"std"` is enabled. diff --git a/book/words.txt b/book/words.txt index e69de29bb2..556a8af01a 100644 --- a/book/words.txt +++ b/book/words.txt @@ -0,0 +1,28 @@ +openvm +Revm +println +vmexe +zkvm +rustup +usize +mathbb +keccak +Keccak +transpiles +transpiling +Transpiles +secp +serde +eprintln +unvalidated +xlarge +noplayground +Repr +riscv +EVMMAX +prehash +prehashed +Uninit +noverify +repr +insn \ No newline at end of file From 98c5ec022d293423c8d9787c63eeb675e4c5d8bc Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Sun, 30 Mar 2025 17:59:09 -0400 Subject: [PATCH 03/25] book: update install instructions with tag (#1545) --- book/src/getting-started/install.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/src/getting-started/install.md b/book/src/getting-started/install.md index 11e74cd96f..2405542d65 100644 --- a/book/src/getting-started/install.md +++ b/book/src/getting-started/install.md @@ -9,7 +9,7 @@ To use OpenVM for generating proofs, you must install the OpenVM command line to Begin the installation: ```bash -cargo install --locked --git http://github.com/openvm-org/openvm.git cargo-openvm +cargo install --locked --git http://github.com/openvm-org/openvm.git --tag v1.0.0 cargo-openvm ``` This will globally install `cargo-openvm`. You can validate a successful installation with: @@ -23,7 +23,7 @@ cargo openvm --version To build from source, clone the repository and begin the installation. ```bash -git clone https://github.com/openvm-org/openvm.git +git clone --branch v1.0.0 --single-branch https://github.com/openvm-org/openvm.git cd openvm cargo install --locked --force --path crates/cli ``` From 3658b890054a06c627c35fe1e001acde5c5c9ae9 Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Mon, 31 Mar 2025 12:14:19 -0400 Subject: [PATCH 04/25] docs: add link to whitepaper (#1546) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1544b0ff89..07b165b290 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ | [User Book](https://book.openvm.dev) | [Contributor Docs](./docs) | [Crate Docs](https://docs.openvm.dev/openvm) +| [Whitepaper](https://openvm.dev/whitepaper.pdf) [tg-badge]: https://img.shields.io/endpoint?color=neon&logo=telegram&label=chat&url=https://tg.sumanjay.workers.dev/openvm From cbaf1167503148a1d3eeea807731c44f8fe5d043 Mon Sep 17 00:00:00 2001 From: Zach Langley Date: Mon, 31 Mar 2025 20:31:31 -0400 Subject: [PATCH 05/25] fix: don't segment due to fixed-size traces (#1548) This fix only affects logging and segmentation logic during execution under certain misconfigured parameter settings. It does not affect any circuit soundness. Fixes two separate issues around segmentation with respect to fixed-size traces: the first being that `constant_trace_height` was not implemented for some wrapper types, and the second being that `VmChipComplex::current_trace_cells` did not check if a chip had constant trace height. --- .../primitives/src/bitwise_op_lookup/mod.rs | 4 ++++ crates/circuits/primitives/src/range_tuple/mod.rs | 4 ++++ crates/circuits/primitives/src/var_range/mod.rs | 4 ++++ crates/vm/src/arch/extensions.rs | 14 ++++++++++---- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/crates/circuits/primitives/src/bitwise_op_lookup/mod.rs b/crates/circuits/primitives/src/bitwise_op_lookup/mod.rs index bd129dfcae..a9e649f84e 100644 --- a/crates/circuits/primitives/src/bitwise_op_lookup/mod.rs +++ b/crates/circuits/primitives/src/bitwise_op_lookup/mod.rs @@ -251,6 +251,10 @@ impl ChipUsageGetter for SharedBitwiseOperationLookupChip self.0.air_name() } + fn constant_trace_height(&self) -> Option { + self.0.constant_trace_height() + } + fn current_trace_height(&self) -> usize { self.0.current_trace_height() } diff --git a/crates/circuits/primitives/src/range_tuple/mod.rs b/crates/circuits/primitives/src/range_tuple/mod.rs index 1133002c33..1b797b1078 100644 --- a/crates/circuits/primitives/src/range_tuple/mod.rs +++ b/crates/circuits/primitives/src/range_tuple/mod.rs @@ -231,6 +231,10 @@ impl ChipUsageGetter for SharedRangeTupleCheckerChip { self.0.air_name() } + fn constant_trace_height(&self) -> Option { + self.0.constant_trace_height() + } + fn current_trace_height(&self) -> usize { self.0.current_trace_height() } diff --git a/crates/circuits/primitives/src/var_range/mod.rs b/crates/circuits/primitives/src/var_range/mod.rs index c2d36097c3..0475f69489 100644 --- a/crates/circuits/primitives/src/var_range/mod.rs +++ b/crates/circuits/primitives/src/var_range/mod.rs @@ -262,6 +262,10 @@ impl ChipUsageGetter for SharedVariableRangeCheckerChip { self.0.air_name() } + fn constant_trace_height(&self) -> Option { + self.0.constant_trace_height() + } + fn current_trace_height(&self) -> usize { self.0.current_trace_height() } diff --git a/crates/vm/src/arch/extensions.rs b/crates/vm/src/arch/extensions.rs index f92ba3dcae..dc523f91d5 100644 --- a/crates/vm/src/arch/extensions.rs +++ b/crates/vm/src/arch/extensions.rs @@ -956,10 +956,16 @@ impl VmChipComplex { .into_iter() .chain(self._public_values_chip().map(|c| c.current_trace_cells())) .chain(self.memory_controller().current_trace_cells()) - .chain( - self.chips_excluding_pv_chip() - .map(|c| c.current_trace_cells()), - ) + .chain(self.chips_excluding_pv_chip().map(|c| match c { + Either::Executor(c) => c.current_trace_cells(), + Either::Periphery(c) => { + if c.constant_trace_height().is_some() { + 0 + } else { + c.current_trace_cells() + } + } + })) .chain([0]) // range_checker_chip .collect() } From 78dcfbd02293d1881e17528ad777419e130c7b03 Mon Sep 17 00:00:00 2001 From: alex <152680487+bodhi-crypo@users.noreply.github.com> Date: Tue, 1 Apr 2025 08:31:48 +0800 Subject: [PATCH 06/25] chore: fix broken links (#1547) --- book/src/advanced-usage/sdk.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/src/advanced-usage/sdk.md b/book/src/advanced-usage/sdk.md index 41ab1f6213..16a1d9c6e5 100644 --- a/book/src/advanced-usage/sdk.md +++ b/book/src/advanced-usage/sdk.md @@ -80,7 +80,7 @@ After generating a proof, you can verify it. To do so, you need your verifying k ### Setup -To generate an EVM proof, you'll first need to ensure that you have followed the [CLI installation steps](../../getting-started/install.md). get the appropriate KZG params by running the following command. +To generate an EVM proof, you'll first need to ensure that you have followed the [CLI installation steps](../getting-started/install.md). get the appropriate KZG params by running the following command. ```bash cargo openvm setup @@ -124,4 +124,4 @@ You can now run the aggregation keygen, proof, and verification functions for th > ⚠️ **WARNING** > The aggregation proving key `agg_pk` above is large. Avoid cloning it if possible. -Note that `DEFAULT_PARAMS_DIR` is the directory where Halo2 parameters are stored by the `cargo openvm setup` CLI command. For more information on the setup process, see the `EVM Level` section of the [verify](../../writing-apps/verify.md) doc. +Note that `DEFAULT_PARAMS_DIR` is the directory where Halo2 parameters are stored by the `cargo openvm setup` CLI command. For more information on the setup process, see the `EVM Level` section of the [verify](../writing-apps/verify.md) doc. From 6a026043c7feb253e3cb2cb123f14657e7139732 Mon Sep 17 00:00:00 2001 From: Ayush Shukla Date: Tue, 1 Apr 2025 20:59:18 +0200 Subject: [PATCH 07/25] fix(ci): run openvm-cli tests (#1552) --- .github/workflows/cli.yml | 6 ++++++ .github/workflows/native-compiler.yml | 1 + .github/workflows/primitives.yml | 1 + .github/workflows/recursion.yml | 1 + .github/workflows/sdk.yml | 1 + .github/workflows/vm.yml | 1 + 6 files changed, 11 insertions(+) diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml index 1447bdcf83..14a346441d 100644 --- a/.github/workflows/cli.yml +++ b/.github/workflows/cli.yml @@ -12,6 +12,7 @@ on: - "crates/cli/**" - "examples/**" - "Cargo.toml" + - ".github/workflows/cli.yml" concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} @@ -70,3 +71,8 @@ jobs: export RUST_BACKTRACE=1 cargo build cargo run --bin cargo-openvm -- openvm keygen --config ./example/app_config.toml --output app.pk --vk-output app.vk + + - name: Run CLI tests + working-directory: crates/cli + run: | + cargo nextest run --cargo-profile=fast diff --git a/.github/workflows/native-compiler.yml b/.github/workflows/native-compiler.yml index 20bd680d6e..af4f39ddff 100644 --- a/.github/workflows/native-compiler.yml +++ b/.github/workflows/native-compiler.yml @@ -10,6 +10,7 @@ on: - "extensions/native/circuit/**" - "extensions/native/compiler/**" - "Cargo.toml" + - ".github/workflows/native-compiler.yml" concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} diff --git a/.github/workflows/primitives.yml b/.github/workflows/primitives.yml index d94e1c25e1..c457fc0fb3 100644 --- a/.github/workflows/primitives.yml +++ b/.github/workflows/primitives.yml @@ -10,6 +10,7 @@ on: - "crates/circuits/poseidon2-air/**" - "crates/circuits/sha256-air/**" - "Cargo.toml" + - ".github/workflows/primitives.yml" concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} diff --git a/.github/workflows/recursion.yml b/.github/workflows/recursion.yml index f00c8e614d..814c1fa44a 100644 --- a/.github/workflows/recursion.yml +++ b/.github/workflows/recursion.yml @@ -11,6 +11,7 @@ on: - "extensions/native/compiler/**" - "extensions/native/recursion/**" - "Cargo.toml" + - ".github/workflows/recursion.yml" concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} diff --git a/.github/workflows/sdk.yml b/.github/workflows/sdk.yml index 97033b77db..1076d724e3 100644 --- a/.github/workflows/sdk.yml +++ b/.github/workflows/sdk.yml @@ -10,6 +10,7 @@ on: - "crates/vm/**" - "crates/sdk/**" - "Cargo.toml" + - ".github/workflows/sdk.yml" concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} diff --git a/.github/workflows/vm.yml b/.github/workflows/vm.yml index 5ba2249c9d..cb7f2284ca 100644 --- a/.github/workflows/vm.yml +++ b/.github/workflows/vm.yml @@ -10,6 +10,7 @@ on: - "crates/vm/**" - "extensions/native/**" - "Cargo.toml" + - ".github/workflows/vm.yml" concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} From 17cefbc12271799823ce720a28e8b0d1716f34ab Mon Sep 17 00:00:00 2001 From: Avaneesh-axiom Date: Tue, 1 Apr 2025 15:07:54 -0400 Subject: [PATCH 08/25] fix: Update Mod Builder symbolic expression multiplication test (#1551) The symbolic expression multiplication unit test was being run with an incorrect expected result. The test became out-of-date after #1473 changed the `max_abs` method. This PR updates the test with the correct expected result and adds the Mod Builder crate's unit tests to the CI workflow. This change has no impact on the functionality of the Mod Builder crate as it only updates the tests. --- .github/workflows/primitives.yml | 6 ++++++ crates/circuits/mod-builder/src/tests.rs | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/primitives.yml b/.github/workflows/primitives.yml index c457fc0fb3..714230b8cd 100644 --- a/.github/workflows/primitives.yml +++ b/.github/workflows/primitives.yml @@ -9,6 +9,7 @@ on: - "crates/circuits/primitives/**" - "crates/circuits/poseidon2-air/**" - "crates/circuits/sha256-air/**" + - "crates/circuits/mod-builder/**" - "Cargo.toml" - ".github/workflows/primitives.yml" @@ -50,3 +51,8 @@ jobs: working-directory: crates/circuits/sha256-air run: | cargo nextest run --cargo-profile fast --features parallel + + - name: Run tests for mod-builder + working-directory: crates/circuits/mod-builder + run: | + cargo nextest run --cargo-profile fast --features parallel diff --git a/crates/circuits/mod-builder/src/tests.rs b/crates/circuits/mod-builder/src/tests.rs index 4b12850ffe..b0ed723b19 100644 --- a/crates/circuits/mod-builder/src/tests.rs +++ b/crates/circuits/mod-builder/src/tests.rs @@ -387,9 +387,9 @@ fn test_symbolic_limbs_mul() { Box::new(SymbolicExpr::Var(0)), Box::new(SymbolicExpr::Var(1)), ); - // x * y = pq, q can be up to p so can limbs as p. - // x * y and p * q both have 63 limbs. - let expected_q = 32; - let expected_carry = 63; + // x * y = pq, and x,y can be up to 2^256 - 1 so q can be up to ceil((2^256 - 1)^2 / p) which has 257 bits, which is 33 limbs + // x * y has 63 limbs, but p * q can have 64 limbs since q is 33 limbs + let expected_q = 33; + let expected_carry = 64; test_symbolic_limbs(expr, expected_q, expected_carry); } From 5868d83e0fce7dbff75eec984aca36d555095f5b Mon Sep 17 00:00:00 2001 From: Ayush Shukla Date: Tue, 1 Apr 2025 22:14:55 +0200 Subject: [PATCH 09/25] fix: use absolute paths in `VmConfig` derive macro (#1550) - use absolute paths for structs used only in the derive macro --- .gitignore | 1 + Cargo.lock | 1 - benchmarks/Cargo.toml | 3 +++ benchmarks/src/bin/ecrecover.rs | 9 ++------ crates/toolchain/tests/Cargo.toml | 4 +++- .../toolchain/tests/tests/transpiler_tests.rs | 9 ++------ crates/vm/derive/src/lib.rs | 23 +++++++++++-------- extensions/algebra/circuit/src/config.rs | 8 ++----- extensions/bigint/circuit/src/extension.rs | 3 +-- extensions/ecc/circuit/src/config.rs | 8 ++----- extensions/keccak256/circuit/src/extension.rs | 3 +-- extensions/native/circuit/src/extension.rs | 4 ++-- extensions/pairing/circuit/src/config.rs | 8 ++----- extensions/rv32im/circuit/src/extension.rs | 3 +-- extensions/sha256/circuit/src/extension.rs | 5 +--- 15 files changed, 36 insertions(+), 56 deletions(-) diff --git a/.gitignore b/.gitignore index 6c53953538..16d9e0c214 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ rustc-* # Bench metrics .bench_metrics/ __pycache__/ +metrics.json # KZG trusted setup **/params diff --git a/Cargo.lock b/Cargo.lock index 2475913852..0de21f22b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4224,7 +4224,6 @@ dependencies = [ "openvm-bigint-circuit", "openvm-build", "openvm-circuit", - "openvm-circuit-primitives-derive", "openvm-ecc-guest", "openvm-instructions", "openvm-platform", diff --git a/benchmarks/Cargo.toml b/benchmarks/Cargo.toml index f4e0415f36..531b4b13f6 100644 --- a/benchmarks/Cargo.toml +++ b/benchmarks/Cargo.toml @@ -66,3 +66,6 @@ harness = false [[bin]] name = "fib_e2e" + +[package.metadata.cargo-shear] +ignored = ["derive_more"] diff --git a/benchmarks/src/bin/ecrecover.rs b/benchmarks/src/bin/ecrecover.rs index 1351dfb7ba..5251fd8655 100644 --- a/benchmarks/src/bin/ecrecover.rs +++ b/benchmarks/src/bin/ecrecover.rs @@ -1,5 +1,4 @@ use clap::Parser; -use derive_more::derive::From; use eyre::Result; use k256::ecdsa::{SigningKey, VerifyingKey}; use num_bigint::BigUint; @@ -9,12 +8,8 @@ use openvm_algebra_circuit::{ use openvm_algebra_transpiler::ModularTranspilerExtension; use openvm_benchmarks::utils::BenchmarkCli; use openvm_circuit::{ - arch::{ - instructions::exe::VmExe, SystemConfig, SystemExecutor, SystemPeriphery, VmChipComplex, - VmConfig, VmInventoryError, - }, - circuit_derive::{Chip, ChipUsageGetter}, - derive::{AnyEnum, InstructionExecutor, VmConfig}, + arch::{instructions::exe::VmExe, SystemConfig}, + derive::VmConfig, }; use openvm_ecc_circuit::{ CurveConfig, WeierstrassExtension, WeierstrassExtensionExecutor, WeierstrassExtensionPeriphery, diff --git a/crates/toolchain/tests/Cargo.toml b/crates/toolchain/tests/Cargo.toml index 47d697dc03..d31d388c32 100644 --- a/crates/toolchain/tests/Cargo.toml +++ b/crates/toolchain/tests/Cargo.toml @@ -8,7 +8,6 @@ homepage.workspace = true repository.workspace = true [dependencies] -openvm-circuit-primitives-derive.workspace = true openvm-stark-backend.workspace = true openvm-stark-sdk.workspace = true openvm-circuit = { workspace = true, features = ["test-utils"] } @@ -35,3 +34,6 @@ num-bigint.workspace = true [features] default = ["parallel"] parallel = ["openvm-circuit/parallel"] + +[package.metadata.cargo-shear] +ignored = ["derive_more", "openvm-stark-backend"] diff --git a/crates/toolchain/tests/tests/transpiler_tests.rs b/crates/toolchain/tests/tests/transpiler_tests.rs index 350f8bca07..5e82b60430 100644 --- a/crates/toolchain/tests/tests/transpiler_tests.rs +++ b/crates/toolchain/tests/tests/transpiler_tests.rs @@ -3,7 +3,6 @@ use std::{ path::{Path, PathBuf}, }; -use derive_more::derive::From; use eyre::Result; use num_bigint::BigUint; use openvm_algebra_circuit::{ @@ -13,14 +12,10 @@ use openvm_algebra_circuit::{ use openvm_algebra_transpiler::{Fp2TranspilerExtension, ModularTranspilerExtension}; use openvm_bigint_circuit::{Int256, Int256Executor, Int256Periphery}; use openvm_circuit::{ - arch::{ - SystemConfig, SystemExecutor, SystemPeriphery, VmChipComplex, VmConfig, VmExecutor, - VmInventoryError, - }, - derive::{AnyEnum, InstructionExecutor, VmConfig}, + arch::{SystemConfig, VmExecutor}, + derive::VmConfig, utils::air_test, }; -use openvm_circuit_primitives_derive::{Chip, ChipUsageGetter}; use openvm_ecc_guest::k256::{SECP256K1_MODULUS, SECP256K1_ORDER}; use openvm_instructions::exe::VmExe; use openvm_platform::memory::MEM_SIZE; diff --git a/crates/vm/derive/src/lib.rs b/crates/vm/derive/src/lib.rs index 472a6aeb59..33f061e6f2 100644 --- a/crates/vm/derive/src/lib.rs +++ b/crates/vm/derive/src/lib.rs @@ -317,12 +317,15 @@ pub fn vm_generic_config_derive(input: proc_macro::TokenStream) -> proc_macro::T #field_name_upper(#periphery_name), }); create_chip_complex.push(quote! { - let complex: VmChipComplex = complex.extend(&self.#field_name)?; + let complex: ::openvm_circuit::arch::VmChipComplex = complex.extend(&self.#field_name)?; }); } let (source_executor_type, source_periphery_type) = match &source { - Source::System(_) => (quote! { SystemExecutor }, quote! { SystemPeriphery }), + Source::System(_) => ( + quote! { ::openvm_circuit::arch::SystemExecutor }, + quote! { ::openvm_circuit::arch::SystemPeriphery }, + ), Source::Config(field_ident) => { let field_type = fields .iter() @@ -344,34 +347,34 @@ pub fn vm_generic_config_derive(input: proc_macro::TokenStream) -> proc_macro::T let periphery_type = Ident::new(&format!("{}Periphery", name), name.span()); TokenStream::from(quote! { - #[derive(ChipUsageGetter, Chip, InstructionExecutor, From, AnyEnum)] + #[derive(::openvm_circuit::circuit_derive::ChipUsageGetter, ::openvm_circuit::circuit_derive::Chip, ::openvm_circuit::derive::InstructionExecutor, ::derive_more::derive::From, ::openvm_circuit::derive::AnyEnum)] pub enum #executor_type { #[any_enum] #source_name_upper(#source_executor_type), #(#executor_enum_fields)* } - #[derive(ChipUsageGetter, Chip, From, AnyEnum)] + #[derive(::openvm_circuit::circuit_derive::ChipUsageGetter, ::openvm_circuit::circuit_derive::Chip, ::derive_more::derive::From, ::openvm_circuit::derive::AnyEnum)] pub enum #periphery_type { #[any_enum] #source_name_upper(#source_periphery_type), #(#periphery_enum_fields)* } - impl VmConfig for #name { + impl ::openvm_circuit::arch::VmConfig for #name { type Executor = #executor_type; type Periphery = #periphery_type; - fn system(&self) -> &SystemConfig { - VmConfig::::system(&self.#source_name) + fn system(&self) -> &::openvm_circuit::arch::SystemConfig { + ::openvm_circuit::arch::VmConfig::::system(&self.#source_name) } - fn system_mut(&mut self) -> &mut SystemConfig { - VmConfig::::system_mut(&mut self.#source_name) + fn system_mut(&mut self) -> &mut ::openvm_circuit::arch::SystemConfig { + ::openvm_circuit::arch::VmConfig::::system_mut(&mut self.#source_name) } fn create_chip_complex( &self, - ) -> Result, VmInventoryError> { + ) -> Result<::openvm_circuit::arch::VmChipComplex, ::openvm_circuit::arch::VmInventoryError> { let complex = self.#source_name.create_chip_complex()?; #(#create_chip_complex)* Ok(complex) diff --git a/extensions/algebra/circuit/src/config.rs b/extensions/algebra/circuit/src/config.rs index a47d2ce171..3f2e83fef3 100644 --- a/extensions/algebra/circuit/src/config.rs +++ b/extensions/algebra/circuit/src/config.rs @@ -1,10 +1,6 @@ -use derive_more::derive::From; use num_bigint::BigUint; -use openvm_circuit::arch::{ - SystemConfig, SystemExecutor, SystemPeriphery, VmChipComplex, VmConfig, VmInventoryError, -}; -use openvm_circuit_derive::{AnyEnum, InstructionExecutor, VmConfig}; -use openvm_circuit_primitives_derive::{Chip, ChipUsageGetter}; +use openvm_circuit::arch::SystemConfig; +use openvm_circuit_derive::VmConfig; use openvm_rv32im_circuit::*; use openvm_stark_backend::p3_field::PrimeField32; use serde::{Deserialize, Serialize}; diff --git a/extensions/bigint/circuit/src/extension.rs b/extensions/bigint/circuit/src/extension.rs index 8977d3ff47..b9eeeafd99 100644 --- a/extensions/bigint/circuit/src/extension.rs +++ b/extensions/bigint/circuit/src/extension.rs @@ -5,8 +5,7 @@ use openvm_bigint_transpiler::{ }; use openvm_circuit::{ arch::{ - SystemConfig, SystemExecutor, SystemPeriphery, SystemPort, VmChipComplex, VmConfig, - VmExtension, VmInventory, VmInventoryBuilder, VmInventoryError, + SystemConfig, SystemPort, VmExtension, VmInventory, VmInventoryBuilder, VmInventoryError, }, system::phantom::PhantomChip, }; diff --git a/extensions/ecc/circuit/src/config.rs b/extensions/ecc/circuit/src/config.rs index 91fa25eb91..ab8809aa6d 100644 --- a/extensions/ecc/circuit/src/config.rs +++ b/extensions/ecc/circuit/src/config.rs @@ -1,10 +1,6 @@ -use derive_more::derive::From; use openvm_algebra_circuit::*; -use openvm_circuit::arch::{ - SystemConfig, SystemExecutor, SystemPeriphery, VmChipComplex, VmConfig, VmInventoryError, -}; -use openvm_circuit_derive::{AnyEnum, InstructionExecutor, VmConfig}; -use openvm_circuit_primitives_derive::{Chip, ChipUsageGetter}; +use openvm_circuit::arch::SystemConfig; +use openvm_circuit_derive::VmConfig; use openvm_rv32im_circuit::*; use openvm_stark_backend::p3_field::PrimeField32; use serde::{Deserialize, Serialize}; diff --git a/extensions/keccak256/circuit/src/extension.rs b/extensions/keccak256/circuit/src/extension.rs index 7f7749e53d..d24681fb55 100644 --- a/extensions/keccak256/circuit/src/extension.rs +++ b/extensions/keccak256/circuit/src/extension.rs @@ -1,8 +1,7 @@ use derive_more::derive::From; use openvm_circuit::{ arch::{ - SystemConfig, SystemExecutor, SystemPeriphery, SystemPort, VmChipComplex, VmConfig, - VmExtension, VmInventory, VmInventoryBuilder, VmInventoryError, + SystemConfig, SystemPort, VmExtension, VmInventory, VmInventoryBuilder, VmInventoryError, }, system::phantom::PhantomChip, }; diff --git a/extensions/native/circuit/src/extension.rs b/extensions/native/circuit/src/extension.rs index fbaf11ff74..8f73423e40 100644 --- a/extensions/native/circuit/src/extension.rs +++ b/extensions/native/circuit/src/extension.rs @@ -6,8 +6,8 @@ use loadstore_native_adapter::NativeLoadStoreAdapterChip; use native_vectorized_adapter::NativeVectorizedAdapterChip; use openvm_circuit::{ arch::{ - ExecutionBridge, MemoryConfig, SystemConfig, SystemExecutor, SystemPeriphery, SystemPort, - VmChipComplex, VmConfig, VmExtension, VmInventory, VmInventoryBuilder, VmInventoryError, + ExecutionBridge, MemoryConfig, SystemConfig, SystemPort, VmExtension, VmInventory, + VmInventoryBuilder, VmInventoryError, }, system::phantom::PhantomChip, }; diff --git a/extensions/pairing/circuit/src/config.rs b/extensions/pairing/circuit/src/config.rs index 97bd242e32..4914fa433c 100644 --- a/extensions/pairing/circuit/src/config.rs +++ b/extensions/pairing/circuit/src/config.rs @@ -1,10 +1,6 @@ -use derive_more::derive::From; use openvm_algebra_circuit::*; -use openvm_circuit::arch::{ - SystemConfig, SystemExecutor, SystemPeriphery, VmChipComplex, VmConfig, VmInventoryError, -}; -use openvm_circuit_derive::{AnyEnum, InstructionExecutor, VmConfig}; -use openvm_circuit_primitives_derive::{Chip, ChipUsageGetter}; +use openvm_circuit::arch::SystemConfig; +use openvm_circuit_derive::VmConfig; use openvm_ecc_circuit::*; use openvm_rv32im_circuit::*; use openvm_stark_backend::p3_field::PrimeField32; diff --git a/extensions/rv32im/circuit/src/extension.rs b/extensions/rv32im/circuit/src/extension.rs index 9c6063468a..f1f67d3994 100644 --- a/extensions/rv32im/circuit/src/extension.rs +++ b/extensions/rv32im/circuit/src/extension.rs @@ -1,8 +1,7 @@ use derive_more::derive::From; use openvm_circuit::{ arch::{ - SystemConfig, SystemExecutor, SystemPeriphery, SystemPort, VmChipComplex, VmConfig, - VmExtension, VmInventory, VmInventoryBuilder, VmInventoryError, + SystemConfig, SystemPort, VmExtension, VmInventory, VmInventoryBuilder, VmInventoryError, }, system::phantom::PhantomChip, }; diff --git a/extensions/sha256/circuit/src/extension.rs b/extensions/sha256/circuit/src/extension.rs index 49cc57236c..76a6c1ec0c 100644 --- a/extensions/sha256/circuit/src/extension.rs +++ b/extensions/sha256/circuit/src/extension.rs @@ -1,9 +1,6 @@ use derive_more::derive::From; use openvm_circuit::{ - arch::{ - SystemConfig, SystemExecutor, SystemPeriphery, VmChipComplex, VmConfig, VmExtension, - VmInventory, VmInventoryBuilder, VmInventoryError, - }, + arch::{SystemConfig, VmExtension, VmInventory, VmInventoryBuilder, VmInventoryError}, system::phantom::PhantomChip, }; use openvm_circuit_derive::{AnyEnum, InstructionExecutor, VmConfig}; From 40927aa95fd14893fdb922334d5193f547d90f20 Mon Sep 17 00:00:00 2001 From: Golovanov399 Date: Thu, 3 Apr 2025 02:35:28 +0300 Subject: [PATCH 10/25] feat: make provers generic over engine (#1553) This adds the ability to use different engines for proving. --- benchmarks/src/bin/fib_e2e.rs | 12 +++++++++--- benchmarks/src/bin/kitchen_sink.rs | 12 +++++++++--- benchmarks/src/bin/verify_fibair.rs | 4 ++-- benchmarks/src/utils.rs | 14 +++++++------- crates/sdk/examples/sdk_app.rs | 9 ++++++--- crates/sdk/src/lib.rs | 6 +++--- crates/sdk/src/prover/agg.rs | 24 ++++++++++-------------- crates/sdk/src/prover/app.rs | 13 +++++-------- crates/sdk/src/prover/mod.rs | 8 ++++---- crates/sdk/src/prover/stark.rs | 9 +++++---- 10 files changed, 60 insertions(+), 51 deletions(-) diff --git a/benchmarks/src/bin/fib_e2e.rs b/benchmarks/src/bin/fib_e2e.rs index 63c327ddec..d19e0b56e8 100644 --- a/benchmarks/src/bin/fib_e2e.rs +++ b/benchmarks/src/bin/fib_e2e.rs @@ -12,7 +12,9 @@ use openvm_rv32im_transpiler::{ use openvm_sdk::{ commit::commit_app_exe, prover::ContinuationProver, DefaultStaticVerifierPvHandler, Sdk, StdIn, }; -use openvm_stark_sdk::bench::run_with_metric_collection; +use openvm_stark_sdk::{ + bench::run_with_metric_collection, config::baby_bear_poseidon2::BabyBearPoseidon2Engine, +}; use openvm_transpiler::{transpiler::Transpiler, FromElf}; const NUM_PUBLIC_VALUES: usize = DEFAULT_MAX_NUM_PUBLIC_VALUES; @@ -56,8 +58,12 @@ async fn main() -> Result<()> { let mut stdin = StdIn::default(); stdin.write(&n); run_with_metric_collection("OUTPUT_PATH", || { - let mut e2e_prover = - ContinuationProver::new(&halo2_params_reader, app_pk, app_committed_exe, full_agg_pk); + let mut e2e_prover = ContinuationProver::<_, BabyBearPoseidon2Engine>::new( + &halo2_params_reader, + app_pk, + app_committed_exe, + full_agg_pk, + ); e2e_prover.set_program_name("fib_e2e"); let _proof = e2e_prover.generate_proof_for_evm(stdin); }); diff --git a/benchmarks/src/bin/kitchen_sink.rs b/benchmarks/src/bin/kitchen_sink.rs index c5d9ca7ab2..9ec4a26d71 100644 --- a/benchmarks/src/bin/kitchen_sink.rs +++ b/benchmarks/src/bin/kitchen_sink.rs @@ -13,7 +13,9 @@ use openvm_sdk::{ commit::commit_app_exe, config::SdkVmConfig, prover::ContinuationProver, DefaultStaticVerifierPvHandler, Sdk, StdIn, }; -use openvm_stark_sdk::bench::run_with_metric_collection; +use openvm_stark_sdk::{ + bench::run_with_metric_collection, config::baby_bear_poseidon2::BabyBearPoseidon2Engine, +}; use openvm_transpiler::FromElf; fn main() -> Result<()> { @@ -78,8 +80,12 @@ fn main() -> Result<()> { )?; run_with_metric_collection("OUTPUT_PATH", || -> Result<()> { - let mut prover = - ContinuationProver::new(&halo2_params_reader, app_pk, app_committed_exe, full_agg_pk); + let mut prover = ContinuationProver::<_, BabyBearPoseidon2Engine>::new( + &halo2_params_reader, + app_pk, + app_committed_exe, + full_agg_pk, + ); prover.set_program_name("kitchen_sink"); let stdin = StdIn::default(); let _proof = prover.generate_proof_for_evm(stdin); diff --git a/benchmarks/src/bin/verify_fibair.rs b/benchmarks/src/bin/verify_fibair.rs index 95f7c6abbe..aac1f4ea79 100644 --- a/benchmarks/src/bin/verify_fibair.rs +++ b/benchmarks/src/bin/verify_fibair.rs @@ -59,8 +59,8 @@ fn main() -> Result<()> { let app_pk = sdk.app_keygen(app_config)?; let app_vk = app_pk.get_app_vk(); let committed_exe = sdk.commit_app_exe(app_fri_params, program.into())?; - let prover = - AppProver::new(app_pk.app_vm_pk, committed_exe).with_program_name("verify_fibair"); + let prover = AppProver::<_, BabyBearPoseidon2Engine>::new(app_pk.app_vm_pk, committed_exe) + .with_program_name("verify_fibair"); let proof = prover.generate_app_proof_without_continuations(input_stream.into()); sdk.verify_app_proof_without_continuations(&app_vk, &proof)?; Ok(()) diff --git a/benchmarks/src/utils.rs b/benchmarks/src/utils.rs index 1a04804fd0..198bf8b763 100644 --- a/benchmarks/src/utils.rs +++ b/benchmarks/src/utils.rs @@ -24,6 +24,7 @@ use openvm_stark_sdk::{ baby_bear_poseidon2::{BabyBearPoseidon2Config, BabyBearPoseidon2Engine}, FriParameters, }, + engine::StarkFriEngine, openvm_stark_backend::Chip, p3_baby_bear::BabyBear, }; @@ -157,7 +158,7 @@ impl BenchmarkCli { VC::Periphery: Chip, { let app_config = self.app_config(vm_config); - bench_from_exe( + bench_from_exe::( bench_name, app_config, exe, @@ -202,7 +203,7 @@ pub fn build_bench(manifest_dir: PathBuf, profile: impl ToString) -> Result /// 6. Verify STARK proofs. /// /// Returns the data necessary for proof aggregation. -pub fn bench_from_exe( +pub fn bench_from_exe>( bench_name: impl ToString, app_config: AppConfig, exe: impl Into>, @@ -231,7 +232,8 @@ where // 4. Generate trace // 5. Generate STARK proofs for each segment (segmentation is determined by `config`), with timer. let app_vk = app_pk.get_app_vk(); - let prover = AppProver::new(app_pk.app_vm_pk, committed_exe).with_program_name(bench_name); + let prover = + AppProver::::new(app_pk.app_vm_pk, committed_exe).with_program_name(bench_name); let app_proof = prover.generate_app_proof(input_stream); // 6. Verify STARK proofs, including boundary conditions. let sdk = Sdk::new(); @@ -239,10 +241,8 @@ where .expect("Verification failed"); if let Some(leaf_vm_config) = leaf_vm_config { let leaf_vm_pk = leaf_keygen(app_config.leaf_fri_params.fri_params, leaf_vm_config); - let leaf_prover = VmLocalProver::::new( - leaf_vm_pk, - app_pk.leaf_committed_exe, - ); + let leaf_prover = + VmLocalProver::::new(leaf_vm_pk, app_pk.leaf_committed_exe); let leaf_controller = LeafProvingController { num_children: DEFAULT_NUM_CHILDREN_LEAF, }; diff --git a/crates/sdk/examples/sdk_app.rs b/crates/sdk/examples/sdk_app.rs index 9514fb6485..fb78a01a3a 100644 --- a/crates/sdk/examples/sdk_app.rs +++ b/crates/sdk/examples/sdk_app.rs @@ -9,7 +9,7 @@ use openvm_sdk::{ prover::AppProver, Sdk, StdIn, }; -use openvm_stark_sdk::config::FriParameters; +use openvm_stark_sdk::config::{baby_bear_poseidon2::BabyBearPoseidon2Engine, FriParameters}; use openvm_transpiler::elf::Elf; use serde::{Deserialize, Serialize}; @@ -90,8 +90,11 @@ fn main() -> Result<(), Box> { // 9a. Generate a proof let proof = sdk.generate_app_proof(app_pk.clone(), app_committed_exe.clone(), stdin.clone())?; // 9b. Generate a proof with an AppProver with custom fields - let app_prover = AppProver::new(app_pk.app_vm_pk.clone(), app_committed_exe.clone()) - .with_program_name("test_program"); + let app_prover = AppProver::<_, BabyBearPoseidon2Engine>::new( + app_pk.app_vm_pk.clone(), + app_committed_exe.clone(), + ) + .with_program_name("test_program"); let proof = app_prover.generate_app_proof(stdin.clone()); // ANCHOR_END: proof_generation diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs index 7f0640bd2b..9d3f62a32e 100644 --- a/crates/sdk/src/lib.rs +++ b/crates/sdk/src/lib.rs @@ -176,7 +176,7 @@ impl> GenericSdk { VC::Executor: Chip, VC::Periphery: Chip, { - let app_prover = AppProver::new(app_pk.app_vm_pk.clone(), app_committed_exe); + let app_prover = AppProver::::new(app_pk.app_vm_pk.clone(), app_committed_exe); let proof = app_prover.generate_app_proof(inputs); Ok(proof) } @@ -241,7 +241,7 @@ impl> GenericSdk { VC::Executor: Chip, VC::Periphery: Chip, { - let stark_prover = StarkProver::new(app_pk, app_exe, agg_stark_pk); + let stark_prover = StarkProver::::new(app_pk, app_exe, agg_stark_pk); let proof = stark_prover.generate_root_verifier_input(inputs); Ok(proof) } @@ -258,7 +258,7 @@ impl> GenericSdk { VC::Executor: Chip, VC::Periphery: Chip, { - let e2e_prover = ContinuationProver::new(reader, app_pk, app_exe, agg_pk); + let e2e_prover = ContinuationProver::::new(reader, app_pk, app_exe, agg_pk); let proof = e2e_prover.generate_proof_for_evm(inputs); Ok(proof) } diff --git a/crates/sdk/src/prover/agg.rs b/crates/sdk/src/prover/agg.rs index bcf202f60d..3055516424 100644 --- a/crates/sdk/src/prover/agg.rs +++ b/crates/sdk/src/prover/agg.rs @@ -7,9 +7,7 @@ use openvm_continuations::verifier::{ }; use openvm_native_circuit::NativeConfig; use openvm_native_recursion::hints::Hintable; -use openvm_stark_sdk::{ - config::baby_bear_poseidon2::BabyBearPoseidon2Engine, openvm_stark_backend::proof::Proof, -}; +use openvm_stark_sdk::{engine::StarkFriEngine, openvm_stark_backend::proof::Proof}; use tracing::info_span; use crate::{ @@ -25,11 +23,11 @@ pub const DEFAULT_NUM_CHILDREN_LEAF: usize = 1; const DEFAULT_NUM_CHILDREN_INTERNAL: usize = 2; const DEFAULT_MAX_INTERNAL_WRAPPER_LAYERS: usize = 4; -pub struct AggStarkProver { - leaf_prover: VmLocalProver, +pub struct AggStarkProver> { + leaf_prover: VmLocalProver, leaf_controller: LeafProvingController, - internal_prover: VmLocalProver, + internal_prover: VmLocalProver, root_prover: RootVerifierLocalProver, pub num_children_internal: usize, @@ -41,19 +39,17 @@ pub struct LeafProvingController { pub num_children: usize, } -impl AggStarkProver { +impl> AggStarkProver { pub fn new( agg_stark_pk: AggStarkProvingKey, leaf_committed_exe: Arc, ) -> Self { - let leaf_prover = VmLocalProver::::new( - agg_stark_pk.leaf_vm_pk, - leaf_committed_exe, - ); + let leaf_prover = + VmLocalProver::::new(agg_stark_pk.leaf_vm_pk, leaf_committed_exe); let leaf_controller = LeafProvingController { num_children: DEFAULT_NUM_CHILDREN_LEAF, }; - let internal_prover = VmLocalProver::::new( + let internal_prover = VmLocalProver::::new( agg_stark_pk.internal_vm_pk, agg_stark_pk.internal_committed_exe, ); @@ -184,9 +180,9 @@ impl LeafProvingController { self } - pub fn generate_proof( + pub fn generate_proof>( &self, - prover: &VmLocalProver, + prover: &VmLocalProver, app_proofs: &ContinuationVmProof, ) -> Vec> { info_span!("agg_layer", group = "leaf").in_scope(|| { diff --git a/crates/sdk/src/prover/app.rs b/crates/sdk/src/prover/app.rs index 6ed7d528b7..095351677e 100644 --- a/crates/sdk/src/prover/app.rs +++ b/crates/sdk/src/prover/app.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use getset::Getters; use openvm_circuit::arch::{ContinuationVmProof, VmConfig}; use openvm_stark_backend::{proof::Proof, Chip}; -use openvm_stark_sdk::config::baby_bear_poseidon2::BabyBearPoseidon2Engine; +use openvm_stark_sdk::engine::StarkFriEngine; use tracing::info_span; use super::vm::SingleSegmentVmProver; @@ -13,13 +13,13 @@ use crate::{ }; #[derive(Getters)] -pub struct AppProver { +pub struct AppProver> { pub program_name: Option, #[getset(get = "pub")] - app_prover: VmLocalProver, + app_prover: VmLocalProver, } -impl AppProver { +impl> AppProver { pub fn new( app_vm_pk: Arc>, app_committed_exe: Arc, @@ -29,10 +29,7 @@ impl AppProver { { Self { program_name: None, - app_prover: VmLocalProver::::new( - app_vm_pk, - app_committed_exe, - ), + app_prover: VmLocalProver::::new(app_vm_pk, app_committed_exe), } } pub fn set_program_name(&mut self, program_name: impl AsRef) -> &mut Self { diff --git a/crates/sdk/src/prover/mod.rs b/crates/sdk/src/prover/mod.rs index 5e4fee43ad..e0e4fedd04 100644 --- a/crates/sdk/src/prover/mod.rs +++ b/crates/sdk/src/prover/mod.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use openvm_circuit::arch::VmConfig; -use openvm_stark_sdk::openvm_stark_backend::Chip; +use openvm_stark_sdk::{engine::StarkFriEngine, openvm_stark_backend::Chip}; use crate::{keygen::AppProvingKey, stdin::StdIn, NonRootCommittedExe, F, SC}; @@ -24,12 +24,12 @@ pub use stark::*; use crate::{keygen::AggProvingKey, prover::halo2::Halo2Prover, types::EvmProof}; -pub struct ContinuationProver { - stark_prover: StarkProver, +pub struct ContinuationProver> { + stark_prover: StarkProver, halo2_prover: Halo2Prover, } -impl ContinuationProver { +impl> ContinuationProver { pub fn new( reader: &impl Halo2ParamsReader, app_pk: Arc>, diff --git a/crates/sdk/src/prover/stark.rs b/crates/sdk/src/prover/stark.rs index 99d053b1f4..d9d8d17d14 100644 --- a/crates/sdk/src/prover/stark.rs +++ b/crates/sdk/src/prover/stark.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use openvm_circuit::arch::VmConfig; use openvm_continuations::verifier::root::types::RootVmVerifierInput; use openvm_stark_backend::{proof::Proof, Chip}; +use openvm_stark_sdk::engine::StarkFriEngine; use crate::{ keygen::{AggStarkProvingKey, AppProvingKey}, @@ -10,11 +11,11 @@ use crate::{ NonRootCommittedExe, RootSC, StdIn, F, SC, }; -pub struct StarkProver { - app_prover: AppProver, - agg_prover: AggStarkProver, +pub struct StarkProver> { + app_prover: AppProver, + agg_prover: AggStarkProver, } -impl StarkProver { +impl> StarkProver { pub fn new( app_pk: Arc>, app_committed_exe: Arc, From 51f07d50d20174b23091f48e25d9ea421b4e2787 Mon Sep 17 00:00:00 2001 From: Xinding Wei Date: Wed, 2 Apr 2025 17:05:19 -0700 Subject: [PATCH 11/25] fix: RootVerifierLocalProver should respect AIR heights (#1554) - Not a soundness issue. Just an issue of `RootVerifierLocalProver` implementation in SDK. - In some edge cases, the trace heights of the root verifier circuit are less than the required heights. In this case, `RootVerifierLocalProver` should pad its traces to the required heights. - [Breaking change] Add a new field `internal_heights` into `RootVerifierProvingKey`. --- crates/sdk/src/keygen/dummy.rs | 12 ++++++------ crates/sdk/src/keygen/mod.rs | 10 +++++----- crates/sdk/src/prover/root.rs | 3 ++- crates/vm/src/arch/vm.rs | 6 +++--- crates/vm/tests/integration_test.rs | 4 ++-- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/crates/sdk/src/keygen/dummy.rs b/crates/sdk/src/keygen/dummy.rs index d025411d81..5000a14041 100644 --- a/crates/sdk/src/keygen/dummy.rs +++ b/crates/sdk/src/keygen/dummy.rs @@ -63,9 +63,9 @@ pub(super) fn compute_root_proof_heights( .into_iter() .map(next_power_of_two_or_zero) .collect(); - let mut internal_heights = res.internal_heights; - internal_heights.round_to_next_power_of_two_or_zero(); - (air_heights, internal_heights) + let mut vm_heights = res.vm_heights; + vm_heights.round_to_next_power_of_two_or_zero(); + (air_heights, vm_heights) } pub(super) fn dummy_internal_proof( @@ -186,9 +186,9 @@ where assert_eq!(results.len(), 1, "dummy exe should have only 1 segment"); let mut result = results.pop().unwrap(); result.chip_complex.finalize_memory(); - let mut internal_heights = result.chip_complex.get_internal_trace_heights(); - internal_heights.round_to_next_power_of_two(); - internal_heights + let mut vm_heights = result.chip_complex.get_internal_trace_heights(); + vm_heights.round_to_next_power_of_two(); + vm_heights }; // For the dummy proof, we must override the trace heights. let app_prover = diff --git a/crates/sdk/src/keygen/mod.rs b/crates/sdk/src/keygen/mod.rs index 07265dd2d8..0b6c6cd27b 100644 --- a/crates/sdk/src/keygen/mod.rs +++ b/crates/sdk/src/keygen/mod.rs @@ -3,7 +3,7 @@ use std::sync::Arc; use derivative::Derivative; use dummy::{compute_root_proof_heights, dummy_internal_proof_riscv_app_vm}; use openvm_circuit::{ - arch::{VirtualMachine, VmConfig}, + arch::{VirtualMachine, VmComplexTraceHeights, VmConfig}, system::{memory::dimensions::MemoryDimensions, program::trace::VmCommittedExe}, }; use openvm_continuations::{ @@ -333,7 +333,7 @@ impl AggStarkProvingKey { let mut vm_pk = vm.keygen(); assert!(vm_pk.max_constraint_degree <= config.root_fri_params.max_constraint_degree()); - let (air_heights, _internal_heights) = compute_root_proof_heights( + let (air_heights, vm_heights) = compute_root_proof_heights( root_vm_config.clone(), root_committed_exe.exe.clone(), &internal_proof, @@ -349,6 +349,7 @@ impl AggStarkProvingKey { }), root_committed_exe, air_heights, + vm_heights, } }; ( @@ -392,9 +393,8 @@ pub struct RootVerifierProvingKey { pub root_committed_exe: Arc>, /// The constant trace heights, ordered by AIR ID. pub air_heights: Vec, - // The following is currently not used: - // The constant trace heights, ordered according to an internal ordering determined by the `NativeConfig`. - // pub internal_heights: VmComplexTraceHeights, + /// The constant trace heights in a semantic way for VM. + pub vm_heights: VmComplexTraceHeights, } impl RootVerifierProvingKey { diff --git a/crates/sdk/src/prover/root.rs b/crates/sdk/src/prover/root.rs index 87548c7461..6e69aa0f13 100644 --- a/crates/sdk/src/prover/root.rs +++ b/crates/sdk/src/prover/root.rs @@ -52,7 +52,8 @@ impl RootVerifierLocalProver { impl SingleSegmentVmProver for RootVerifierLocalProver { fn prove(&self, input: impl Into>) -> Proof { let input = input.into(); - let vm = SingleSegmentVmExecutor::new(self.vm_config().clone()); + let mut vm = SingleSegmentVmExecutor::new(self.vm_config().clone()); + vm.set_override_trace_heights(self.root_verifier_pk.vm_heights.clone()); let mut proof_input = vm .execute_and_generate(self.root_verifier_pk.root_committed_exe.clone(), input) .unwrap(); diff --git a/crates/vm/src/arch/vm.rs b/crates/vm/src/arch/vm.rs index 7c45b22dad..c885d34cf0 100644 --- a/crates/vm/src/arch/vm.rs +++ b/crates/vm/src/arch/vm.rs @@ -376,7 +376,7 @@ pub struct SingleSegmentVmExecutionResult { /// Heights of each AIR, ordered by AIR ID. pub air_heights: Vec, /// Heights of (SystemBase, Inventory), in an internal ordering. - pub internal_heights: VmComplexTraceHeights, + pub vm_heights: VmComplexTraceHeights, } impl SingleSegmentVmExecutor @@ -424,7 +424,7 @@ where segment }; let air_heights = segment.chip_complex.current_trace_heights(); - let internal_heights = segment.chip_complex.get_internal_trace_heights(); + let vm_heights = segment.chip_complex.get_internal_trace_heights(); let public_values = if let Some(pv_chip) = segment.chip_complex.public_values_chip() { pv_chip.core.get_custom_public_values() } else { @@ -433,7 +433,7 @@ where Ok(SingleSegmentVmExecutionResult { public_values, air_heights, - internal_heights, + vm_heights, }) } diff --git a/crates/vm/tests/integration_test.rs b/crates/vm/tests/integration_test.rs index 42aebe4584..e8fb2574ff 100644 --- a/crates/vm/tests/integration_test.rs +++ b/crates/vm/tests/integration_test.rs @@ -132,7 +132,7 @@ fn test_vm_override_executor_height() { .unwrap(); // Memory trace heights are not computed during execution. assert_eq!( - res.internal_heights.system, + res.vm_heights.system, SystemTraceHeights { memory: MemoryTraceHeights::Volatile(VolatileMemoryTraceHeights { boundary: 1, @@ -141,7 +141,7 @@ fn test_vm_override_executor_height() { } ); assert_eq!( - res.internal_heights.inventory, + res.vm_heights.inventory, VmInventoryTraceHeights { chips: vec![ (ChipId::Executor(0), 0), From a9f68e0c1a50d574e17eec63803d8d3a5895f9e0 Mon Sep 17 00:00:00 2001 From: Ayush Shukla Date: Fri, 4 Apr 2025 17:20:52 -0400 Subject: [PATCH 12/25] feat(test): add execution benchmarks (#1556) Closes INT-3706 - Moved existing benchmarks to `benchmarks/prove` crate - Added a new `benchmarks/execute` binary crate that runs execution for a list of guest programs - Added programs for benchmarking in `benchmarks/guest` - Added a ci workflow to run execution benchmarks - Note: Timing metrics for summary are currently being parsed from logs. I'll change it to use proper metrics in a follow up --- .github/workflows/benchmarks-execute.yml | 112 ++++++++++++++++ .github/workflows/benchmarks.yml | 2 +- .gitignore | 3 + Cargo.lock | 40 +++++- Cargo.toml | 9 +- benchmarks/execute/Cargo.toml | 50 ++++++++ .../benches/fibonacci_execute.rs | 6 +- .../{ => execute}/benches/regex_execute.rs | 8 +- benchmarks/{ => execute}/examples/regex-elf | Bin .../{ => execute}/examples/regex_execute.rs | 2 +- benchmarks/execute/src/main.rs | 121 ++++++++++++++++++ benchmarks/{programs => guest}/README.md | 0 .../base64_json/Cargo.toml | 0 .../base64_json/elf/openvm-json-program.elf | Bin 0 -> 203336 bytes .../base64_json/json_payload.txt | 0 .../base64_json/json_payload_encoded.txt | 0 benchmarks/guest/base64_json/openvm.toml | 3 + .../base64_json/src/lib.rs | 0 .../base64_json/src/main.rs | 0 .../{programs => guest}/bincode/Cargo.toml | 0 .../bincode/elf/openvm-bincode-program.elf | Bin 0 -> 137456 bytes .../bincode/minecraft_savedata.bin | Bin benchmarks/guest/bincode/openvm.toml | 3 + .../bincode/src/generate.rs | 0 .../{programs => guest}/bincode/src/main.rs | 0 .../{programs => guest}/bincode/src/types.rs | 0 benchmarks/guest/bubblesort/Cargo.toml | 16 +++ .../elf/openvm-bubblesort-program.elf | Bin 0 -> 65684 bytes benchmarks/guest/bubblesort/openvm.toml | 3 + benchmarks/guest/bubblesort/src/main.rs | 46 +++++++ .../{programs => guest}/ecrecover/Cargo.toml | 0 .../elf/openvm-ecdsa-recover-key-program.elf | Bin 0 -> 124472 bytes .../{programs => guest}/ecrecover/src/main.rs | 0 .../{programs => guest}/fibonacci/Cargo.toml | 0 .../elf/openvm-fibonacci-program.elf | Bin 0 -> 83268 bytes benchmarks/guest/fibonacci/openvm.toml | 3 + .../{programs => guest}/fibonacci/src/main.rs | 0 .../guest/fibonacci_iterative/Cargo.toml | 16 +++ .../openvm-fibonacci-iterative-program.elf | Bin 0 -> 64056 bytes .../guest/fibonacci_iterative/openvm.toml | 3 + .../guest/fibonacci_iterative/src/main.rs | 15 +++ .../guest/fibonacci_recursive/Cargo.toml | 16 +++ .../openvm-fibonacci-recursive-program.elf | Bin 0 -> 64236 bytes .../guest/fibonacci_recursive/openvm.toml | 3 + .../guest/fibonacci_recursive/src/main.rs | 21 +++ benchmarks/guest/keccak256/Cargo.toml | 17 +++ .../elf/openvm-keccak256-program.elf | Bin 0 -> 64932 bytes benchmarks/guest/keccak256/openvm.toml | 4 + benchmarks/guest/keccak256/src/main.rs | 21 +++ benchmarks/guest/keccak256_iter/Cargo.toml | 17 +++ .../elf/openvm-keccak256-iter-program.elf | Bin 0 -> 64904 bytes benchmarks/guest/keccak256_iter/openvm.toml | 4 + benchmarks/guest/keccak256_iter/src/main.rs | 19 +++ .../kitchen-sink/Cargo.toml | 0 .../elf/openvm-kitchen-sink-program.elf | Bin 0 -> 80500 bytes .../kitchen-sink/src/main.rs | 2 +- .../{programs => guest}/pairing/Cargo.toml | 0 .../pairing/elf/openvm-pairing-program.elf | Bin 0 -> 155380 bytes benchmarks/guest/pairing/openvm.toml | 25 ++++ .../{programs => guest}/pairing/src/main.rs | 0 benchmarks/guest/quicksort/Cargo.toml | 16 +++ .../elf/openvm-quicksort-program.elf | Bin 0 -> 66048 bytes benchmarks/guest/quicksort/openvm.toml | 3 + benchmarks/guest/quicksort/src/main.rs | 64 +++++++++ .../{programs => guest}/regex/Cargo.toml | 0 .../guest/regex/elf/openvm-regex-program.elf | Bin 0 -> 667200 bytes benchmarks/guest/regex/openvm.toml | 4 + .../{programs => guest}/regex/regex_email.txt | 0 .../{programs => guest}/regex/src/main.rs | 0 benchmarks/guest/revm_snailtracer/Cargo.toml | 22 ++++ .../elf/openvm-revm-snailtracer.elf | Bin 0 -> 1890572 bytes benchmarks/guest/revm_snailtracer/openvm.toml | 3 + benchmarks/guest/revm_snailtracer/src/main.rs | 25 ++++ .../revm_snailtracer/src/snailtracer.hex | 0 .../revm_transfer/Cargo.toml | 3 +- .../elf/openvm-revm-transfer.elf | Bin 0 -> 1885496 bytes benchmarks/guest/revm_transfer/openvm.toml | 4 + .../revm_transfer/src/main.rs | 0 .../{programs => guest}/rkyv/Cargo.toml | 0 .../guest/rkyv/elf/openvm-rkyv-program.elf | Bin 0 -> 65628 bytes .../rkyv/minecraft_savedata.bin | Bin benchmarks/guest/rkyv/openvm.toml | 3 + .../{programs => guest}/rkyv/src/generate.rs | 0 .../{programs => guest}/rkyv/src/main.rs | 0 .../{programs => guest}/rkyv/src/types.rs | 0 benchmarks/guest/sha256/Cargo.toml | 17 +++ .../sha256/elf/openvm-sha256-program.elf | Bin 0 -> 64708 bytes benchmarks/guest/sha256/openvm.toml | 4 + benchmarks/guest/sha256/src/main.rs | 20 +++ benchmarks/guest/sha256_iter/Cargo.toml | 17 +++ .../elf/openvm-sha256-iter-program.elf | Bin 0 -> 64424 bytes benchmarks/guest/sha256_iter/openvm.toml | 4 + benchmarks/guest/sha256_iter/src/main.rs | 19 +++ benchmarks/{ => prove}/Cargo.toml | 19 +-- benchmarks/{ => prove}/src/bin/base64_json.rs | 4 +- benchmarks/{ => prove}/src/bin/bincode.rs | 4 +- benchmarks/{ => prove}/src/bin/ecrecover.rs | 2 +- benchmarks/{ => prove}/src/bin/fib_e2e.rs | 2 +- benchmarks/{ => prove}/src/bin/fibonacci.rs | 2 +- .../{ => prove}/src/bin/kitchen_sink.rs | 2 +- benchmarks/{ => prove}/src/bin/pairing.rs | 2 +- benchmarks/{ => prove}/src/bin/regex.rs | 4 +- .../{ => prove}/src/bin/revm_transfer.rs | 2 +- benchmarks/{ => prove}/src/bin/rkyv.rs | 4 +- .../{ => prove}/src/bin/verify_fibair.rs | 2 +- benchmarks/prove/src/lib.rs | 1 + .../{src/utils.rs => prove/src/util.rs} | 33 +---- benchmarks/src/lib.rs | 1 - benchmarks/utils/Cargo.toml | 30 +++++ benchmarks/utils/src/build-elfs.rs | 101 +++++++++++++++ benchmarks/utils/src/lib.rs | 73 +++++++++++ book/src/writing-apps/write-program.md | 2 +- ci/README.md | 4 +- ci/benchmark-config.json | 14 +- crates/cli/src/lib.rs | 2 +- crates/cli/src/util.rs | 2 +- crates/toolchain/build/Cargo.toml | 2 +- docs/crates/benchmarks.md | 61 +++++++-- 118 files changed, 1118 insertions(+), 95 deletions(-) create mode 100644 .github/workflows/benchmarks-execute.yml create mode 100644 benchmarks/execute/Cargo.toml rename benchmarks/{ => execute}/benches/fibonacci_execute.rs (87%) rename benchmarks/{ => execute}/benches/regex_execute.rs (85%) rename benchmarks/{ => execute}/examples/regex-elf (100%) rename benchmarks/{ => execute}/examples/regex_execute.rs (95%) create mode 100644 benchmarks/execute/src/main.rs rename benchmarks/{programs => guest}/README.md (100%) rename benchmarks/{programs => guest}/base64_json/Cargo.toml (100%) create mode 100755 benchmarks/guest/base64_json/elf/openvm-json-program.elf rename benchmarks/{programs => guest}/base64_json/json_payload.txt (100%) rename benchmarks/{programs => guest}/base64_json/json_payload_encoded.txt (100%) create mode 100644 benchmarks/guest/base64_json/openvm.toml rename benchmarks/{programs => guest}/base64_json/src/lib.rs (100%) rename benchmarks/{programs => guest}/base64_json/src/main.rs (100%) rename benchmarks/{programs => guest}/bincode/Cargo.toml (100%) create mode 100755 benchmarks/guest/bincode/elf/openvm-bincode-program.elf rename benchmarks/{programs => guest}/bincode/minecraft_savedata.bin (100%) create mode 100644 benchmarks/guest/bincode/openvm.toml rename benchmarks/{programs => guest}/bincode/src/generate.rs (100%) rename benchmarks/{programs => guest}/bincode/src/main.rs (100%) rename benchmarks/{programs => guest}/bincode/src/types.rs (100%) create mode 100644 benchmarks/guest/bubblesort/Cargo.toml create mode 100755 benchmarks/guest/bubblesort/elf/openvm-bubblesort-program.elf create mode 100644 benchmarks/guest/bubblesort/openvm.toml create mode 100644 benchmarks/guest/bubblesort/src/main.rs rename benchmarks/{programs => guest}/ecrecover/Cargo.toml (100%) create mode 100755 benchmarks/guest/ecrecover/elf/openvm-ecdsa-recover-key-program.elf rename benchmarks/{programs => guest}/ecrecover/src/main.rs (100%) rename benchmarks/{programs => guest}/fibonacci/Cargo.toml (100%) create mode 100755 benchmarks/guest/fibonacci/elf/openvm-fibonacci-program.elf create mode 100644 benchmarks/guest/fibonacci/openvm.toml rename benchmarks/{programs => guest}/fibonacci/src/main.rs (100%) create mode 100644 benchmarks/guest/fibonacci_iterative/Cargo.toml create mode 100755 benchmarks/guest/fibonacci_iterative/elf/openvm-fibonacci-iterative-program.elf create mode 100644 benchmarks/guest/fibonacci_iterative/openvm.toml create mode 100644 benchmarks/guest/fibonacci_iterative/src/main.rs create mode 100644 benchmarks/guest/fibonacci_recursive/Cargo.toml create mode 100755 benchmarks/guest/fibonacci_recursive/elf/openvm-fibonacci-recursive-program.elf create mode 100644 benchmarks/guest/fibonacci_recursive/openvm.toml create mode 100644 benchmarks/guest/fibonacci_recursive/src/main.rs create mode 100644 benchmarks/guest/keccak256/Cargo.toml create mode 100755 benchmarks/guest/keccak256/elf/openvm-keccak256-program.elf create mode 100644 benchmarks/guest/keccak256/openvm.toml create mode 100644 benchmarks/guest/keccak256/src/main.rs create mode 100644 benchmarks/guest/keccak256_iter/Cargo.toml create mode 100755 benchmarks/guest/keccak256_iter/elf/openvm-keccak256-iter-program.elf create mode 100644 benchmarks/guest/keccak256_iter/openvm.toml create mode 100644 benchmarks/guest/keccak256_iter/src/main.rs rename benchmarks/{programs => guest}/kitchen-sink/Cargo.toml (100%) create mode 100755 benchmarks/guest/kitchen-sink/elf/openvm-kitchen-sink-program.elf rename benchmarks/{programs => guest}/kitchen-sink/src/main.rs (98%) rename benchmarks/{programs => guest}/pairing/Cargo.toml (100%) create mode 100755 benchmarks/guest/pairing/elf/openvm-pairing-program.elf create mode 100644 benchmarks/guest/pairing/openvm.toml rename benchmarks/{programs => guest}/pairing/src/main.rs (100%) create mode 100644 benchmarks/guest/quicksort/Cargo.toml create mode 100755 benchmarks/guest/quicksort/elf/openvm-quicksort-program.elf create mode 100644 benchmarks/guest/quicksort/openvm.toml create mode 100644 benchmarks/guest/quicksort/src/main.rs rename benchmarks/{programs => guest}/regex/Cargo.toml (100%) create mode 100755 benchmarks/guest/regex/elf/openvm-regex-program.elf create mode 100644 benchmarks/guest/regex/openvm.toml rename benchmarks/{programs => guest}/regex/regex_email.txt (100%) rename benchmarks/{programs => guest}/regex/src/main.rs (100%) create mode 100644 benchmarks/guest/revm_snailtracer/Cargo.toml create mode 100755 benchmarks/guest/revm_snailtracer/elf/openvm-revm-snailtracer.elf create mode 100644 benchmarks/guest/revm_snailtracer/openvm.toml create mode 100644 benchmarks/guest/revm_snailtracer/src/main.rs create mode 100644 benchmarks/guest/revm_snailtracer/src/snailtracer.hex rename benchmarks/{programs => guest}/revm_transfer/Cargo.toml (91%) create mode 100755 benchmarks/guest/revm_transfer/elf/openvm-revm-transfer.elf create mode 100644 benchmarks/guest/revm_transfer/openvm.toml rename benchmarks/{programs => guest}/revm_transfer/src/main.rs (100%) rename benchmarks/{programs => guest}/rkyv/Cargo.toml (100%) create mode 100755 benchmarks/guest/rkyv/elf/openvm-rkyv-program.elf rename benchmarks/{programs => guest}/rkyv/minecraft_savedata.bin (100%) create mode 100644 benchmarks/guest/rkyv/openvm.toml rename benchmarks/{programs => guest}/rkyv/src/generate.rs (100%) rename benchmarks/{programs => guest}/rkyv/src/main.rs (100%) rename benchmarks/{programs => guest}/rkyv/src/types.rs (100%) create mode 100644 benchmarks/guest/sha256/Cargo.toml create mode 100755 benchmarks/guest/sha256/elf/openvm-sha256-program.elf create mode 100644 benchmarks/guest/sha256/openvm.toml create mode 100644 benchmarks/guest/sha256/src/main.rs create mode 100644 benchmarks/guest/sha256_iter/Cargo.toml create mode 100755 benchmarks/guest/sha256_iter/elf/openvm-sha256-iter-program.elf create mode 100644 benchmarks/guest/sha256_iter/openvm.toml create mode 100644 benchmarks/guest/sha256_iter/src/main.rs rename benchmarks/{ => prove}/Cargo.toml (87%) rename benchmarks/{ => prove}/src/bin/base64_json.rs (91%) rename benchmarks/{ => prove}/src/bin/bincode.rs (89%) rename benchmarks/{ => prove}/src/bin/ecrecover.rs (98%) rename benchmarks/{ => prove}/src/bin/fib_e2e.rs (98%) rename benchmarks/{ => prove}/src/bin/fibonacci.rs (95%) rename benchmarks/{ => prove}/src/bin/kitchen_sink.rs (98%) rename benchmarks/{ => prove}/src/bin/pairing.rs (96%) rename benchmarks/{ => prove}/src/bin/regex.rs (91%) rename benchmarks/{ => prove}/src/bin/revm_transfer.rs (95%) rename benchmarks/{ => prove}/src/bin/rkyv.rs (89%) rename benchmarks/{ => prove}/src/bin/verify_fibair.rs (98%) create mode 100644 benchmarks/prove/src/lib.rs rename benchmarks/{src/utils.rs => prove/src/util.rs} (87%) delete mode 100644 benchmarks/src/lib.rs create mode 100644 benchmarks/utils/Cargo.toml create mode 100644 benchmarks/utils/src/build-elfs.rs create mode 100644 benchmarks/utils/src/lib.rs diff --git a/.github/workflows/benchmarks-execute.yml b/.github/workflows/benchmarks-execute.yml new file mode 100644 index 0000000000..741ccdb0f1 --- /dev/null +++ b/.github/workflows/benchmarks-execute.yml @@ -0,0 +1,112 @@ +name: "benchmarks-execute" + +on: + push: + branches: ["main"] + pull_request: + types: [opened, synchronize, reopened, labeled] + branches: ["**"] + paths: + - "benchmarks/execute/**" + - "crates/circuits/**" + - "crates/toolchain/**" + - "crates/prof/**" + - "crates/sdk/**" + - "crates/vm/**" + - "extensions/**" + - "Cargo.toml" + - ".github/workflows/benchmarks-execute.yml" + workflow_dispatch: + +env: + CARGO_TERM_COLOR: always + +jobs: + execute-benchmarks: + runs-on: + - runs-on=${{ github.run_id }} + - runner=8cpu-linux-x64 + steps: + - uses: actions/checkout@v4 + + - name: Set up Rust + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + + - name: Run execution benchmarks + working-directory: benchmarks/execute + run: cargo run | tee benchmark_output.log + + - name: Parse benchmark results + working-directory: benchmarks/execute + run: | + # Determine if running in GitHub Actions environment + if [ -n "$GITHUB_STEP_SUMMARY" ]; then + SUMMARY_FILE="$GITHUB_STEP_SUMMARY" + echo "### Benchmark Results Summary" >> "$SUMMARY_FILE" + else + SUMMARY_FILE="benchmark_summary.md" + echo "### Benchmark Results Summary" > "$SUMMARY_FILE" + echo "Saving summary to $SUMMARY_FILE" + fi + + # Set up summary table header + echo "| Program | Total Time (ms) |" >> "$SUMMARY_FILE" + echo "| ------- | --------------- |" >> "$SUMMARY_FILE" + + # Variables to track current program and total time + current_program="" + total_time=0 + + # Process the output file line by line + while IFS= read -r line; do + # Check if line contains "Running program" message + if [[ $line =~ i\ \[info\]:\ Running\ program:\ ([a-zA-Z0-9_-]+) ]]; then + # If we were processing a program, output its results + if [[ -n "$current_program" ]]; then + echo "| $current_program | $total_time |" >> "$SUMMARY_FILE" + fi + + # Start tracking new program + current_program="${BASH_REMATCH[1]}" + total_time=0 + fi + + # Check for program completion to catch programs that might have no execution segments + if [[ $line =~ i\ \[info\]:\ Completed\ program:\ ([a-zA-Z0-9_-]+) ]]; then + completed_program="${BASH_REMATCH[1]}" + # If no segments were found for this program, ensure it's still in the output + if [[ "$current_program" == "$completed_program" && $total_time == 0 ]]; then + echo "| $current_program | 0 |" >> "$SUMMARY_FILE" + current_program="" + fi + fi + + # Check if line contains execution time (looking for the format with ms or s) + if [[ $line =~ execute_segment\ \[\ ([0-9.]+)(ms|s)\ \|\ [0-9.]+%\ \]\ segment ]]; then + segment_time="${BASH_REMATCH[1]}" + unit="${BASH_REMATCH[2]}" + + # Convert to milliseconds if in seconds + if [[ "$unit" == "s" ]]; then + segment_time=$(echo "scale=6; $segment_time * 1000" | bc) + fi + + # Add segment time to total + total_time=$(echo "scale=6; $total_time + $segment_time" | bc) + fi + done < benchmark_output.log + + # Output the last program result if there was one + if [[ -n "$current_program" ]]; then + echo "| $current_program | $total_time |" >> "$SUMMARY_FILE" + fi + + # If not in GitHub Actions, print the summary to the terminal + if [ -z "$GITHUB_STEP_SUMMARY" ]; then + echo -e "\nBenchmark Summary:" + cat "$SUMMARY_FILE" + fi diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index c3c9eb8d6a..1a76f847e0 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -7,7 +7,7 @@ on: types: [opened, synchronize, reopened, labeled] branches: ["**"] paths: - - "benchmarks/**" + - "benchmarks/prove/**" - "crates/circuits/**" - "crates/toolchain/**" - "crates/prof/**" diff --git a/.gitignore b/.gitignore index 16d9e0c214..35f726fed6 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ metrics.json # Profiling **/flamegraph.svg **/profile.json + +# openvm generated files +crates/cli/openvm/ diff --git a/Cargo.lock b/Cargo.lock index 0de21f22b6..a11d72a5fa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3298,11 +3298,32 @@ dependencies = [ ] [[package]] -name = "openvm-benchmarks" +name = "openvm-benchmarks-execute" version = "1.0.0" dependencies = [ + "cargo-openvm", "clap", "criterion", + "derive_more 1.0.0", + "eyre", + "openvm-benchmarks-utils", + "openvm-circuit", + "openvm-keccak256-circuit", + "openvm-keccak256-transpiler", + "openvm-rv32im-circuit", + "openvm-rv32im-transpiler", + "openvm-sdk", + "openvm-stark-sdk", + "openvm-transpiler", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "openvm-benchmarks-prove" +version = "1.0.0" +dependencies = [ + "clap", "derive-new 0.6.0", "derive_more 1.0.0", "eyre", @@ -3310,7 +3331,7 @@ dependencies = [ "num-bigint 0.4.6", "openvm-algebra-circuit", "openvm-algebra-transpiler", - "openvm-build", + "openvm-benchmarks-utils", "openvm-circuit", "openvm-ecc-circuit", "openvm-ecc-transpiler", @@ -3329,12 +3350,25 @@ dependencies = [ "openvm-transpiler", "rand_chacha", "serde", - "tempfile", "tiny-keccak", "tokio", "tracing", ] +[[package]] +name = "openvm-benchmarks-utils" +version = "1.0.0" +dependencies = [ + "cargo_metadata", + "clap", + "eyre", + "openvm-build", + "openvm-transpiler", + "tempfile", + "tracing", + "tracing-subscriber", +] + [[package]] name = "openvm-bigint-circuit" version = "1.0.0" diff --git a/Cargo.toml b/Cargo.toml index 943b8d798e..322d769671 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,9 @@ license = "MIT" [workspace] members = [ - "benchmarks", + "benchmarks/utils", + "benchmarks/execute", + "benchmarks/prove", "crates/prof", "crates/sdk", "crates/cli", @@ -127,6 +129,7 @@ openvm-custom-insn = { path = "crates/toolchain/custom_insn", default-features = openvm-circuit = { path = "crates/vm", default-features = false } openvm-circuit-derive = { path = "crates/vm/derive", default-features = false } openvm-continuations = { path = "crates/continuations", default-features = false } +cargo-openvm = { path = "crates/cli", default-features = false } # Extensions openvm-rv32im-circuit = { path = "extensions/rv32im/circuit", default-features = false } @@ -159,6 +162,9 @@ openvm-pairing-circuit = { path = "extensions/pairing/circuit", default-features openvm-pairing-transpiler = { path = "extensions/pairing/transpiler", default-features = false } openvm-pairing-guest = { path = "extensions/pairing/guest", default-features = false } +# Benchmarking +openvm-benchmarks-utils = { path = "benchmarks/utils", default-features = false } + # Plonky3 p3-field = { git = "https://github.com/Plonky3/Plonky3.git", rev = "1ba4e5c" } p3-baby-bear = { git = "https://github.com/Plonky3/Plonky3.git", features = [ @@ -180,6 +186,7 @@ snark-verifier-sdk = { version = "0.2.0", default-features = false, features = [ ] } halo2curves-axiom = "0.7.0" +cargo_metadata = "0.18" tracing = "0.1.40" bon = "3.2.0" serde_json = "1.0.117" diff --git a/benchmarks/execute/Cargo.toml b/benchmarks/execute/Cargo.toml new file mode 100644 index 0000000000..64e76e9aa3 --- /dev/null +++ b/benchmarks/execute/Cargo.toml @@ -0,0 +1,50 @@ +[package] +name = "openvm-benchmarks-execute" +version.workspace = true +authors.workspace = true +edition.workspace = true +homepage.workspace = true +repository.workspace = true +license.workspace = true + +[dependencies] +openvm-benchmarks-utils.workspace = true +cargo-openvm.workspace = true +openvm-circuit.workspace = true +openvm-sdk.workspace = true +openvm-stark-sdk.workspace = true +openvm-transpiler.workspace = true +openvm-rv32im-circuit.workspace = true +openvm-rv32im-transpiler.workspace = true +openvm-keccak256-circuit.workspace = true +openvm-keccak256-transpiler.workspace = true + +clap = { version = "4.5.9", features = ["derive", "env"] } +eyre.workspace = true +tracing.workspace = true +derive_more = { workspace = true, features = ["from"] } + +tracing-subscriber = { version = "0.3.17", features = ["std", "env-filter"] } + +[dev-dependencies] +criterion = { version = "0.5", features = ["html_reports"] } + +[features] +default = ["mimalloc"] +profiling = ["openvm-sdk/profiling"] +aggregation = [] +mimalloc = ["openvm-circuit/mimalloc"] +jemalloc = ["openvm-circuit/jemalloc"] +jemalloc-prof = ["openvm-circuit/jemalloc-prof"] +nightly-features = ["openvm-circuit/nightly-features"] + +[[bench]] +name = "fibonacci_execute" +harness = false + +[[bench]] +name = "regex_execute" +harness = false + +[package.metadata.cargo-shear] +ignored = ["derive_more"] diff --git a/benchmarks/benches/fibonacci_execute.rs b/benchmarks/execute/benches/fibonacci_execute.rs similarity index 87% rename from benchmarks/benches/fibonacci_execute.rs rename to benchmarks/execute/benches/fibonacci_execute.rs index 5450c4c749..70952b53c9 100644 --- a/benchmarks/benches/fibonacci_execute.rs +++ b/benchmarks/execute/benches/fibonacci_execute.rs @@ -1,5 +1,5 @@ use criterion::{criterion_group, criterion_main, Criterion}; -use openvm_benchmarks::utils::{build_bench, get_programs_dir}; +use openvm_benchmarks_utils::{build_elf, get_programs_dir}; use openvm_circuit::arch::{instructions::exe::VmExe, VmExecutor}; use openvm_rv32im_circuit::Rv32ImConfig; use openvm_rv32im_transpiler::{ @@ -10,7 +10,9 @@ use openvm_stark_sdk::p3_baby_bear::BabyBear; use openvm_transpiler::{transpiler::Transpiler, FromElf}; fn benchmark_function(c: &mut Criterion) { - let elf = build_bench(get_programs_dir().join("fibonacci"), "release").unwrap(); + let program_dir = get_programs_dir().join("fibonacci"); + let elf = build_elf(&program_dir, "release").unwrap(); + let exe = VmExe::from_elf( elf, Transpiler::::default() diff --git a/benchmarks/benches/regex_execute.rs b/benchmarks/execute/benches/regex_execute.rs similarity index 85% rename from benchmarks/benches/regex_execute.rs rename to benchmarks/execute/benches/regex_execute.rs index 08b555ec4a..a3a110e344 100644 --- a/benchmarks/benches/regex_execute.rs +++ b/benchmarks/execute/benches/regex_execute.rs @@ -1,5 +1,5 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; -use openvm_benchmarks::utils::{build_bench, get_programs_dir}; +use openvm_benchmarks_utils::{build_elf, get_programs_dir}; use openvm_circuit::arch::{instructions::exe::VmExe, VmExecutor}; use openvm_keccak256_circuit::Keccak256Rv32Config; use openvm_keccak256_transpiler::Keccak256TranspilerExtension; @@ -11,7 +11,9 @@ use openvm_stark_sdk::p3_baby_bear::BabyBear; use openvm_transpiler::{transpiler::Transpiler, FromElf}; fn benchmark_function(c: &mut Criterion) { - let elf = build_bench(get_programs_dir().join("regex"), "release").unwrap(); + let program_dir = get_programs_dir().join("regex"); + let elf = build_elf(&program_dir, "release").unwrap(); + let exe = VmExe::from_elf( elf, Transpiler::::default() @@ -27,7 +29,7 @@ fn benchmark_function(c: &mut Criterion) { let config = Keccak256Rv32Config::default(); let executor = VmExecutor::::new(config); - let data = include_str!("../programs/regex/regex_email.txt"); + let data = include_str!("../../guest/regex/regex_email.txt"); let fe_bytes = data.to_owned().into_bytes(); group.bench_function("execute", |b| { diff --git a/benchmarks/examples/regex-elf b/benchmarks/execute/examples/regex-elf similarity index 100% rename from benchmarks/examples/regex-elf rename to benchmarks/execute/examples/regex-elf diff --git a/benchmarks/examples/regex_execute.rs b/benchmarks/execute/examples/regex_execute.rs similarity index 95% rename from benchmarks/examples/regex_execute.rs rename to benchmarks/execute/examples/regex_execute.rs index ea59f0c7a1..59705a19fd 100644 --- a/benchmarks/examples/regex_execute.rs +++ b/benchmarks/execute/examples/regex_execute.rs @@ -25,7 +25,7 @@ fn main() { let config = Keccak256Rv32Config::default(); let executor = VmExecutor::::new(config); - let data = include_str!("../programs/regex/regex_email.txt"); + let data = include_str!("../../guest/regex/regex_email.txt"); let timer = std::time::Instant::now(); executor diff --git a/benchmarks/execute/src/main.rs b/benchmarks/execute/src/main.rs new file mode 100644 index 0000000000..80db3ec5a4 --- /dev/null +++ b/benchmarks/execute/src/main.rs @@ -0,0 +1,121 @@ +use cargo_openvm::{default::DEFAULT_APP_CONFIG_PATH, util::read_config_toml_or_default}; +use clap::{Parser, ValueEnum}; +use eyre::Result; +use openvm_benchmarks_utils::{get_elf_path, get_programs_dir, read_elf_file}; +use openvm_circuit::arch::{instructions::exe::VmExe, VmExecutor}; +use openvm_sdk::StdIn; +use openvm_stark_sdk::bench::run_with_metric_collection; +use openvm_transpiler::FromElf; + +#[derive(Debug, Clone, ValueEnum)] +enum BuildProfile { + Debug, + Release, +} + +static AVAILABLE_PROGRAMS: &[&str] = &[ + "fibonacci_recursive", + "fibonacci_iterative", + "quicksort", + "bubblesort", + "pairing", + "keccak256", + "keccak256_iter", + "sha256", + "sha256_iter", + "revm_transfer", + "revm_snailtracer", +]; + +#[derive(Parser)] +#[command(author, version, about = "OpenVM Benchmark CLI", long_about = None)] +struct Cli { + /// Programs to benchmark (if not specified, all programs will be run) + #[arg(short, long)] + programs: Vec, + + /// Programs to skip from benchmarking + #[arg(short, long)] + skip: Vec, + + /// Output path for benchmark results + #[arg(short, long, default_value = "OUTPUT_PATH")] + output: String, + + /// List available benchmark programs and exit + #[arg(short, long)] + list: bool, + + /// Verbose output + #[arg(short, long)] + verbose: bool, +} + +fn main() -> Result<()> { + let cli = Cli::parse(); + + if cli.list { + println!("Available benchmark programs:"); + for program in AVAILABLE_PROGRAMS { + println!(" {}", program); + } + return Ok(()); + } + + // Set up logging based on verbosity + if cli.verbose { + tracing_subscriber::fmt::init(); + } + + let mut programs_to_run = if cli.programs.is_empty() { + AVAILABLE_PROGRAMS.to_vec() + } else { + // Validate provided programs + for program in &cli.programs { + if !AVAILABLE_PROGRAMS.contains(&program.as_str()) { + eprintln!("Unknown program: {}", program); + eprintln!("Use --list to see available programs"); + std::process::exit(1); + } + } + cli.programs.iter().map(|s| s.as_str()).collect() + }; + + // Remove programs that should be skipped + if !cli.skip.is_empty() { + // Validate skipped programs + for program in &cli.skip { + if !AVAILABLE_PROGRAMS.contains(&program.as_str()) { + eprintln!("Unknown program to skip: {}", program); + eprintln!("Use --list to see available programs"); + std::process::exit(1); + } + } + + let skip_set: Vec<&str> = cli.skip.iter().map(|s| s.as_str()).collect(); + programs_to_run.retain(|&program| !skip_set.contains(&program)); + } + + tracing::info!("Starting benchmarks with metric collection"); + + run_with_metric_collection(&cli.output, || -> Result<()> { + for program in &programs_to_run { + tracing::info!("Running program: {}", program); + + let program_dir = get_programs_dir().join(program); + let elf_path = get_elf_path(&program_dir); + let elf = read_elf_file(&elf_path)?; + + let config_path = program_dir.join(DEFAULT_APP_CONFIG_PATH); + let vm_config = read_config_toml_or_default(&config_path)?.app_vm_config; + + let exe = VmExe::from_elf(elf, vm_config.transpiler())?; + + let executor = VmExecutor::new(vm_config); + executor.execute(exe, StdIn::default())?; + tracing::info!("Completed program: {}", program); + } + tracing::info!("All programs executed successfully"); + Ok(()) + }) +} diff --git a/benchmarks/programs/README.md b/benchmarks/guest/README.md similarity index 100% rename from benchmarks/programs/README.md rename to benchmarks/guest/README.md diff --git a/benchmarks/programs/base64_json/Cargo.toml b/benchmarks/guest/base64_json/Cargo.toml similarity index 100% rename from benchmarks/programs/base64_json/Cargo.toml rename to benchmarks/guest/base64_json/Cargo.toml diff --git a/benchmarks/guest/base64_json/elf/openvm-json-program.elf b/benchmarks/guest/base64_json/elf/openvm-json-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..29e6cac131dd0132fa30ccb3483d19937120a410 GIT binary patch literal 203336 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�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

+JF#=(`$#r`w0`w0Ei;Y;OY$7J*o+6KHUW*zJi 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 literal 0 HcmV?d00001 diff --git a/benchmarks/guest/bubblesort/openvm.toml b/benchmarks/guest/bubblesort/openvm.toml new file mode 100644 index 0000000000..19a1e670e5 --- /dev/null +++ b/benchmarks/guest/bubblesort/openvm.toml @@ -0,0 +1,3 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] diff --git a/benchmarks/guest/bubblesort/src/main.rs b/benchmarks/guest/bubblesort/src/main.rs new file mode 100644 index 0000000000..0dd7e51146 --- /dev/null +++ b/benchmarks/guest/bubblesort/src/main.rs @@ -0,0 +1,46 @@ +use core::hint::black_box; +use openvm as _; + +const ARRAY_SIZE: usize = 100; + +fn bubblesort(arr: &mut [T]) { + let len = arr.len(); + if len <= 1 { + return; + } + + for i in 0..len { + let mut swapped = false; + for j in 0..len - i - 1 { + if arr[j] > arr[j + 1] { + arr.swap(j, j + 1); + swapped = true; + } + } + // If no swapping occurred in this pass, array is sorted + if !swapped { + break; + } + } +} + +pub fn main() { + // Generate array of random-like values + let mut arr = Vec::with_capacity(ARRAY_SIZE); + + // Initialize with pseudo-random values + let mut val = 1; + for _ in 0..ARRAY_SIZE { + arr.push(val); + val = ((val * 8191) << 7) ^ val; + } + + // Prevent compiler from optimizing away the computation + let mut input = black_box(arr); + + // Sort the array + bubblesort(&mut input); + + // Prevent compiler from optimizing away the computation + black_box(&input); +} diff --git a/benchmarks/programs/ecrecover/Cargo.toml b/benchmarks/guest/ecrecover/Cargo.toml similarity index 100% rename from benchmarks/programs/ecrecover/Cargo.toml rename to benchmarks/guest/ecrecover/Cargo.toml diff --git a/benchmarks/guest/ecrecover/elf/openvm-ecdsa-recover-key-program.elf b/benchmarks/guest/ecrecover/elf/openvm-ecdsa-recover-key-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..4e54268ea42c31e14412cb6bc4e8178656f6f57b GIT binary patch literal 124472 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 BHroII literal 0 HcmV?d00001 diff --git a/benchmarks/programs/ecrecover/src/main.rs b/benchmarks/guest/ecrecover/src/main.rs similarity index 100% rename from benchmarks/programs/ecrecover/src/main.rs rename to benchmarks/guest/ecrecover/src/main.rs diff --git a/benchmarks/programs/fibonacci/Cargo.toml b/benchmarks/guest/fibonacci/Cargo.toml similarity index 100% rename from benchmarks/programs/fibonacci/Cargo.toml rename to benchmarks/guest/fibonacci/Cargo.toml diff --git a/benchmarks/guest/fibonacci/elf/openvm-fibonacci-program.elf b/benchmarks/guest/fibonacci/elf/openvm-fibonacci-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..36ad8d359c16042f86d8fb540a9acf7756241f67 GIT binary patch literal 83268 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 literal 0 HcmV?d00001 diff --git a/benchmarks/guest/fibonacci/openvm.toml b/benchmarks/guest/fibonacci/openvm.toml new file mode 100644 index 0000000000..19a1e670e5 --- /dev/null +++ b/benchmarks/guest/fibonacci/openvm.toml @@ -0,0 +1,3 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] diff --git a/benchmarks/programs/fibonacci/src/main.rs b/benchmarks/guest/fibonacci/src/main.rs similarity index 100% rename from benchmarks/programs/fibonacci/src/main.rs rename to benchmarks/guest/fibonacci/src/main.rs diff --git a/benchmarks/guest/fibonacci_iterative/Cargo.toml b/benchmarks/guest/fibonacci_iterative/Cargo.toml new file mode 100644 index 0000000000..6f0c145061 --- /dev/null +++ b/benchmarks/guest/fibonacci_iterative/Cargo.toml @@ -0,0 +1,16 @@ +[workspace] +[package] +name = "openvm-fibonacci-iterative-program" +version = "0.0.0" +edition = "2021" + +[dependencies] +openvm = { path = "../../../crates/toolchain/openvm", features = ["std"] } + +[features] +default = [] + +[profile.profiling] +inherits = "release" +debug = 2 +strip = false diff --git a/benchmarks/guest/fibonacci_iterative/elf/openvm-fibonacci-iterative-program.elf b/benchmarks/guest/fibonacci_iterative/elf/openvm-fibonacci-iterative-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..ac9fbf3e89e5c2ccade3d62e0afdd78b08877c15 GIT binary patch literal 64056 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 Cy8|%* literal 0 HcmV?d00001 diff --git a/benchmarks/guest/fibonacci_iterative/openvm.toml b/benchmarks/guest/fibonacci_iterative/openvm.toml new file mode 100644 index 0000000000..19a1e670e5 --- /dev/null +++ b/benchmarks/guest/fibonacci_iterative/openvm.toml @@ -0,0 +1,3 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] diff --git a/benchmarks/guest/fibonacci_iterative/src/main.rs b/benchmarks/guest/fibonacci_iterative/src/main.rs new file mode 100644 index 0000000000..09ceb5df41 --- /dev/null +++ b/benchmarks/guest/fibonacci_iterative/src/main.rs @@ -0,0 +1,15 @@ +use core::hint::black_box; +use openvm as _; + +const N: u64 = 100_000; + +pub fn main() { + let mut a: u64 = 0; + let mut b: u64 = 1; + for _ in 0..black_box(N) { + let c: u64 = a.wrapping_add(b); + a = b; + b = c; + } + black_box(a); +} diff --git a/benchmarks/guest/fibonacci_recursive/Cargo.toml b/benchmarks/guest/fibonacci_recursive/Cargo.toml new file mode 100644 index 0000000000..95b124df43 --- /dev/null +++ b/benchmarks/guest/fibonacci_recursive/Cargo.toml @@ -0,0 +1,16 @@ +[workspace] +[package] +name = "openvm-fibonacci-recursive-program" +version = "0.0.0" +edition = "2021" + +[dependencies] +openvm = { path = "../../../crates/toolchain/openvm", features = ["std"] } + +[features] +default = [] + +[profile.profiling] +inherits = "release" +debug = 2 +strip = false diff --git a/benchmarks/guest/fibonacci_recursive/elf/openvm-fibonacci-recursive-program.elf b/benchmarks/guest/fibonacci_recursive/elf/openvm-fibonacci-recursive-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..7dee9d4286bd1935e369f7c1a69d49f972fedbad GIT binary patch literal 64236 zcmeFa3!GHNl|Np$Z+Fjw5s^kfL(GMq8Qx8I-+mgC^awM85=8|c(aq3(yBj7BGvhpX z7}pFoJv_w3q*a#xVwq&D4MLBWn3X@kp6v7)vfN^ zFfe0W{rx}xPwt1I`+Muu>(r@pPMxZI`)lvV#nR}T!p7l){wSS|p*y(B=}+T--Ip>(e-65DrgvYB zdrcbu+u~x3{;c^Yu3&89ts4KMZ1>=g+C}*dOr3$R^hf3M zwiT29`t7eA_$vqg%7MRf;IAC`|0M@pijsHNp25@_2YUk+*aah;(RMT3SC(}%`W#WZ zdy0a*w<&JzK71-HQ&WdB6?PZ6_C`0exu-nJ3TdU~A9H)oVD4FKnR~`JnS0t~#a-)D za_i6*JN|+-EVtuK=Bi*Uhd=%Bc4ka;*j&rgIa@oUqQBU`uU7>L-_xL#0 zx9+K!D-=K(@8tE08buF22-={cAKAnDHg0DF%y~2igYUABVY;JQ;bpB0C{!N$uc*~) zl}vS=qE1(o%yiBVo0T8A9<@JP>z1GUl z3Gic6#XRo2F~ejWFd2dlQ?Uassm z<|f>Hq_WR>Z_M?l5c0pybmzgCYvrDN?(pH$!)1!%Dw{B-FZ;U9eedH;U%!XBJv)yX zi6iCi??2Am+weDI=P{I}xM$&h`iRrri+c~??;-p>jK3*6kGZSyR|~p7HL%

lNL3 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 LBl(!~k u64 { + if n == 0 { + 0 + } else if n == 1 { + 1 + } else { + let a = fibonacci(n - 2); + let b = fibonacci(n - 1); + a.wrapping_add(b) + } +} diff --git a/benchmarks/guest/keccak256/Cargo.toml b/benchmarks/guest/keccak256/Cargo.toml new file mode 100644 index 0000000000..d14a60111e --- /dev/null +++ b/benchmarks/guest/keccak256/Cargo.toml @@ -0,0 +1,17 @@ +[workspace] +[package] +name = "openvm-keccak256-program" +version = "0.0.0" +edition = "2021" + +[dependencies] +openvm = { path = "../../../crates/toolchain/openvm", features = ["std"] } +openvm-keccak256-guest = { path = "../../../extensions/keccak256/guest" } + +[features] +default = [] + +[profile.profiling] +inherits = "release" +debug = 2 +strip = false diff --git a/benchmarks/guest/keccak256/elf/openvm-keccak256-program.elf b/benchmarks/guest/keccak256/elf/openvm-keccak256-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..7425897f996e62a6472bdf52bec88d3273cb600d GIT binary patch literal 64932 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

$|+r<}?tq8=z h9)I~ODWb;@{2t5u9q;8{$K$_z?_ZMtIUnQq{s(Xk>CpfH literal 0 HcmV?d00001 diff --git a/benchmarks/guest/keccak256/openvm.toml b/benchmarks/guest/keccak256/openvm.toml new file mode 100644 index 0000000000..93998f52a3 --- /dev/null +++ b/benchmarks/guest/keccak256/openvm.toml @@ -0,0 +1,4 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] +[app_vm_config.keccak] diff --git a/benchmarks/guest/keccak256/src/main.rs b/benchmarks/guest/keccak256/src/main.rs new file mode 100644 index 0000000000..ee7ec8b09a --- /dev/null +++ b/benchmarks/guest/keccak256/src/main.rs @@ -0,0 +1,21 @@ +use core::hint::black_box; +use openvm as _; + +use openvm_keccak256_guest::keccak256; + +const INPUT_LENGTH_BYTES: usize = 100 * 1024; // 100 KB + +pub fn main() { + let mut input = Vec::with_capacity(INPUT_LENGTH_BYTES); + + // Initialize with pseudo-random values + let mut val: u64 = 1; + for _ in 0..INPUT_LENGTH_BYTES { + input.push(val as u8); + val = ((val.wrapping_mul(8191)) << 7) ^ val; + } + + // Prevent optimizer from optimizing away the computation + let input = black_box(input); + black_box(keccak256(&input)); +} diff --git a/benchmarks/guest/keccak256_iter/Cargo.toml b/benchmarks/guest/keccak256_iter/Cargo.toml new file mode 100644 index 0000000000..ae9291be0c --- /dev/null +++ b/benchmarks/guest/keccak256_iter/Cargo.toml @@ -0,0 +1,17 @@ +[workspace] +[package] +name = "openvm-keccak256-iter-program" +version = "0.0.0" +edition = "2021" + +[dependencies] +openvm = { path = "../../../crates/toolchain/openvm", features = ["std"] } +openvm-keccak256-guest = { path = "../../../extensions/keccak256/guest" } + +[features] +default = [] + +[profile.profiling] +inherits = "release" +debug = 2 +strip = false diff --git a/benchmarks/guest/keccak256_iter/elf/openvm-keccak256-iter-program.elf b/benchmarks/guest/keccak256_iter/elf/openvm-keccak256-iter-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..0cf372eec35c5580260f823355f0701e6e9257b7 GIT binary patch literal 64904 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 literal 0 HcmV?d00001 diff --git a/benchmarks/guest/keccak256_iter/openvm.toml b/benchmarks/guest/keccak256_iter/openvm.toml new file mode 100644 index 0000000000..93998f52a3 --- /dev/null +++ b/benchmarks/guest/keccak256_iter/openvm.toml @@ -0,0 +1,4 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] +[app_vm_config.keccak] diff --git a/benchmarks/guest/keccak256_iter/src/main.rs b/benchmarks/guest/keccak256_iter/src/main.rs new file mode 100644 index 0000000000..7ef36a5fa7 --- /dev/null +++ b/benchmarks/guest/keccak256_iter/src/main.rs @@ -0,0 +1,19 @@ +use core::hint::black_box; +use openvm as _; + +use openvm_keccak256_guest::keccak256; + +const ITERATIONS: usize = 10_000; + +pub fn main() { + // Initialize with hash of an empty vector + let mut hash = black_box(keccak256(&vec![])); + + // Iteratively apply keccak256 + for _ in 0..ITERATIONS { + hash = keccak256(&hash); + } + + // Prevent optimizer from optimizing away the computation + black_box(hash); +} diff --git a/benchmarks/programs/kitchen-sink/Cargo.toml b/benchmarks/guest/kitchen-sink/Cargo.toml similarity index 100% rename from benchmarks/programs/kitchen-sink/Cargo.toml rename to benchmarks/guest/kitchen-sink/Cargo.toml diff --git a/benchmarks/guest/kitchen-sink/elf/openvm-kitchen-sink-program.elf b/benchmarks/guest/kitchen-sink/elf/openvm-kitchen-sink-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..85f3509fa53ff1ddd42cdcadb45052381dc91ee6 GIT binary patch literal 80500 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

Eb_0aG5v9kMSiQsB7b>}r>0-8vB)L7&{ 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%0DXb(bxl@mqCbwQ=#L_JQ@0;{IHq0< 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

-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: &mut [T]) { + if arr.len() <= 1 { + return; + } + + let pivot_index = partition(arr); + + // Sort left part + quicksort(&mut arr[0..pivot_index]); + // Sort right part + quicksort(&mut arr[pivot_index + 1..]); +} + +fn partition(arr: &mut [T]) -> usize { + let len = arr.len(); + if len <= 1 { + return 0; + } + + // Choose pivot (middle element) + let pivot_index = len / 2; + + // Move pivot to the end + arr.swap(pivot_index, len - 1); + + // Partition + let mut store_index = 0; + for i in 0..len - 1 { + if arr[i] < arr[len - 1] { + arr.swap(i, store_index); + store_index += 1; + } + } + + // Move pivot to its final place + arr.swap(store_index, len - 1); + store_index +} + +pub fn main() { + // Generate array of random-like values + let mut arr = Vec::with_capacity(ARRAY_SIZE); + + // Initialize with pseudo-random values + let mut val = 1; + for _ in 0..ARRAY_SIZE { + arr.push(val); + val = ((val * 8191) << 7) ^ val; + } + + // Prevent compiler from optimizing away the computation + let mut input = black_box(arr); + + // Sort the array + quicksort(&mut input); + + // Prevent compiler from optimizing away the computation + black_box(&input); +} diff --git a/benchmarks/programs/regex/Cargo.toml b/benchmarks/guest/regex/Cargo.toml similarity index 100% rename from benchmarks/programs/regex/Cargo.toml rename to benchmarks/guest/regex/Cargo.toml diff --git a/benchmarks/guest/regex/elf/openvm-regex-program.elf b/benchmarks/guest/regex/elf/openvm-regex-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..6e6074e0797a5252504e3d7e700d4f3d0ef9959c GIT binary patch literal 667200 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

7JEGR!da+x>uMSX- zU7)sm$Vbl?JH?FWVSi1-{=)A!K3!^nTZ$ z$^HQQyvQlBbwv&#FLhb|gEEedyo}vuaB-gsd)zDZIEyZF!^YizfE|bLz^7rmXOGnK z|9Kg|ZX32V_;+ooZN>#@TeY;Q_n>Cud zwV-{IP2>NoP145qlsk?)H5AMNUbpa0?Cd#=HHZG^0^^*C@tcjrZ#ELY*;t9+#5&%y zrxNdBZsJ!p0A~ZR6DwIjPPEm?^G4vE!Q9B1=F`sqGp(7-X(sg=1AF^S>dd6=Oz`4U zXXeVBf{xtFu~BCR^Ld`Nnu3K3h!yhP#wROqZmfr~NkZ;;Mmv~D}634pG?tZe~ zUfNq9odw-D7ulbGq~7j%u0Cpo7uwjLYkx#V=k!jCdVrbz;izZ(G~$kY?_m#)@1?`k zvl?U%+i&r#j!(eTiym>p*-LXm-(hOEGXci4+^(RN{shLhJ@t{mD0_LejFr7pd<*c( zJhh#nO3^8uHSlFkbmk*z`|Kyv_Bqd`$K!|!`o=cWJXV;C9q`V$`8x6qF0dl<&EuQa zsg9>_vLf~j<6G)2`xMLa-*BBZ^z@yUP_o4Cf{1GG5Oa)1Nrz@)*r&hVa zy1-&hH!u<-)iCxFo0aFo(+!MPBYig7=gerd&s@+L<$4==F1T&9cTQ6RV|3c31#n9#eaFHj}b`Se`!%k2$pmx*{W6o@{c4P+d&9C6OF3hKM;9rb;7Fs;?z zF>N_AXxIa1p54~zMLiblIlwsgI9k6g+n)-r-YI>%$K#;WP5g=8C_CJ0W1B>+ovrp_ zi@k*5z+TcDVE+X+M;W4}!wc>9-i7e;LU6ngT3+B=R!;0Zi37_XDsc}d$q(+OY{Gu5 zeg6f-;Mv!kpPs4rk+pv8w!?ZCJ=t%eXIt#S1L!GL6Mk`LlRemHk-t$0>qllrx9wN< zZ4Uc@eHOMEu@u&x{YuG8H0M!D*9F_KE3iF+TjAT3TVoG)5of~}mAKiQozgG4td134 zaR|GkV18dVm?LA*Cd3X5KYuu-&#kz(v4+^4#3RI? zl|6y*_@N_t_a!^W|svrdE!i*WKbtD-Vc%_uddoPEuCK@ZXh`wIsh6Ci>=0 zliJK1Z=>?ejd;h1FKf#By|&-n=SrN_WMO-Rs?RNFNZW;t$=viV&H%aWbP=g=N?;^In z#Ptr3MQug=h4J%G&lHHKNd4NEwI?+m-+U|{Y}xyJhBd09SgJ&9^;tO_SZR z=2_K2E^h}sIMn~od>`cFS{?2P-`GBG_gvQExVY9NdY@lK?=vQqwT_qN#b49(Z{L5V z9X6&@_Wi5uuqB;J@(2ExtUGngenznf-{40glMJ7!-%aW}JKlF8Q|=pEQR)6$(vI1~ zW{f$m<8#&`*(bac*^e)Wj7;_pjNU=ch}_5yhgC%?a?psKKcV+~ zPZjy2|6xL z%Q_(sbMRIU-P4SIsS#a;&iLX}_>k{|Kio!pG^5XE4xm>>h9A^47JjjxGS)}*V*mc6>`~-( zeoEaI7uT>p5~Huc_~0ZQR`EjV2X?N8abAy3Q;#P7Bsxv)P3YtwC-q;oMx}oyr`Qgg z;NLT#>-l`&R4G9p{t$_a>F$OP6(R;XBFr zvkdJN?tm^P%5beG;T5rGu4T^wpN6=8O7FiM(lO^R@!OT((E0=!mcaIfWQ^GfeGZn# zh}XE-9^2Kvy*bv}UB7Z4u&2}Oe9kIMoJ(@cj7^sRkn~ME9ZTn1@0-S)ON!kQ;I{;Fwz##e}EvIkj>`$G3?w=Zrp?bm$G_f}6Hzw@=*ySFB5zkLe$-!ZBEkzm=3 z8uSn6gg0_tcmY1?Y51L;GN${H;CP&GPGy^gfr9V z?f{!r_rI2N(*w(~aU@1Jz?xg|r~@xzqsb?Y-E^wf4WEgYSnShwvUlC<=s3++ch8hQ zkbm<8whCOe?)+%iew$}@v>W?J!_#Fa@N^k?3a8?4u-9{@h9~AO0J&QtSa^YD5AKIg zf$MLXV*@esoqgnEIeK46Y@hIoz1T?LrYJDqlZtCsr{s(}_AGJCyHld0C6+3%mFLA? zX;WP6;zf3YT7(pdw4)oPnp%ZKhKll&uhB{YD%;0}cCj0cUt!@(k%BYqF@grLnT z)5%+9?UQy_7@qI`Ws+xUCBL6YekXFK`=`n8F*A<)_LYxnIsOi4!7^p}KS`dQZhjZ8 zD9gd1Du0ByJn^AUo47nVdKVG%Am`wKt977}HT}1W{cDSl2#_( z-6?3i@HshiVCT17C9z zD#M8!Fl(ou=kF}9o$o%u^F!0On)j?JYl0a=%J5K?Cph3S5=7&lK!^Cy1tl#yOc~odGZ}7yKo@D)YafeA`Wgf};osjGBHk{`{y#q*tMjEIrgZGHGN`|(j7 z&Ya)FS+)J#4?z5G_s{ek(c#<^AUa$5;y)$wZ@$0|O@m{6Pu*`x&LSoKcG7RJ_LJ%PZ?YtAdgsZNV#64 z(!CNB3zonK?F;ZJI=LG|WRLpy;MV29(F$DvcQPkEHa3jlft*O<_kHY@iVvt`mbMwQ zuqNr_Clc=xTu8go7S3`@yKAx4bh{N|FO=!J4|=P_Iia@{^d|9<DhThb+dw;51wlP|e5efzD^mdsJnUDB__ZzA$G!MTRR)K!;9t-vLH zYo0AVCudNlFL_2=_QPqbGVpLU4EeLhVJJOzJPd`utcF3ancPJKF8nRvX!8Zc>qhe9 zFcVnLA7d9PD#qDxQi)HgUJfJ;YZX+8MtH zdz|@m=L7eG$euyRkpm)g@TK6(+wVzneg&Umza8OM_$@ueSPpO>+X!-Iwe}r?g~+3A za%NTiseH#bFUF?pA|}UuKA!8uU*4-X%(dF@BQ8tK?ttZgnzM4sLza$=#YOs=NlsegOO@v* z{#4nQ@?G*h3OX+Sr_g1^pA!ErSjbvb`%;__JkFO|J;|5SIAHz@wLCt%dVS(`;=>eN zEtfr!%e}7nD9Qf(yZD`9uU*Gf#CP=5D)AljzTJ-BvUoUyf5qI`<8QjNMcOC2^Xo%( zS6M-}lbqwr$&J|v-g+~!_#-;cuTUSILf`my;aBfsp9z|p?Ve@t-miVk3SQ>zo&qoG zER7fP07XuTt`$F1BK4Rf-*n>>Y++2(urQT%P@2_ruU6Adg4!WxKeDqg&4b*n(x7+Rbm`js6 zY`6=*UgH|y(C{z&WXvm%?T+u5wPX+5thw-XR_HLFmNqh1d&w|sCU$4yOK=JDJ#o`jU(ne)S7ET?bk2_t&e4 zSbxm7sZ;vA)RFe#O(Hp+mgG& z|7_CsndJ8~$?wtR_tVU26#Y(KTQ7NT8zo=u4e0l|#8>7LUm-v3B67(tpG)~%%IBir z=c3y?*qr?7L@G$F+BG&T-_;k|&AX z_h#&_(=}b;FI?8xc&6Qbl)ZDKmnHrdINKX`@Cg=LoTun*_Px#qLucxrr5)?n94#4c zoYj11jq7(Q!Cz zCz0*6fA~+hk8qN{kT_{oTvF>%^^DOM<+$X9&}Sq2ON_OIewTW(U(_`|$8*oL@0i%H zzZP3z-W^rC2!7Cg=btovpRLL<*ouyJ=a%E0*aOGKJ7xZJWK6wR4<82G2DpdlM^^mh zx69rVq-hB~RjNQBs{-s^xM`G-d%hb8=ku{Zh z%DRS|MkvdFLa*y4saLp^b$sLKfx-93vPbA0vcoIx<$3Ajau=cTG5T-E&c!Ce=615s zi+tnfG^&q9?bujX*Z;Z1IPAs!*u?GF#($^_QuK9eYtf{>=gWPWHY} zW?n_|V?{T}K3P`#?6u76V|I=@t^LFrbDFN>7VP!@19?r~nePMl$ZU;=>)jS`J{uX44n=)V_p5M)Wq@ONXIfs|8ttTs4`aU={+MNt)Ny|WwkWZ3 za7t`?f68wvs*Z~X$hE$2D*F7UrXlX7F!l^KE%r>%TGaMlguUk%#jY7hh3ni!(IB+6 z%dzDwLPv2>g{yZh(sWd&A!ju<$HQN$qUU+`z(jfu=M78&N8uhr%Ux5@a+9Iun&WM% z@QZt)kE+-`_NFhmkUJWLz7x2Df$NOjaO-tKKYxVZ=){@*);QkFK3rkXtK&U?%kuPf0_2S3yHsS$#VhR5YclVgQm$y7mH*V}Joon!dGMId zy%Cx7u#Ru-5E(9G#OvqkF{FRwrJRGY{b^Zj?L*`#5tnhW8Qadow<5Rf`oXm3zjdxR zdhPlZM&9K^(FJ9kMCa5a6YtS-S7JJ4|0v0~UaRr3`C9U1H(P#-;AI59>Ba_zcf?N; z|1gok+E$t4iA|pw?OXq*WV}DCjP)IIl}*&&;jOT*NSnf`F*#d; z-_aWee}N72+&FKsUWc>|_Sae;Bh&1POtb37Wm@6e0^6t>XcE2}ojovH#xnRS{poA+ z)oSq<)M`VkMvj#Ivk819XNjTJXfTmuF1c>U1}FMrB1Z%lQ^*m4F+h$4+wPKi*G4C! z$9sCLG9UVq)2Q`9X%Xc$$$EeAHSGlh|HTIWvc0g{$YW?qbgrf^Vr<6WO!hRV;=N1u zYG13oMwPYbFRz6PWi7ORS!|(OkY`N;CcdI|Nhx2p%1jZW)=Kv_E<3_GK7KT9%dRu&RAi(jK3z z;)iJ1edezH5HtR#E8~+tqt_H&Il5)AF}U><;;!#OR>V$du9eHi&&=QGGbeD#v6NQp51mPcEws? z0LNl;Xg*W*_=EgrUFPiNtjPn|ENhPn%n3ccr82*M^MEF`%rIt^*%~P(Zk{Fn?Ep) zlY&!`TiBq+@5C23>;1mUdM9#g^rp?L;#%TmBC}cse?xx%3x4sttW9EPZ4;T5|5C6G zTDbKS(8P!EA2*z>Z87R;xuxrC?~c339@%f6rS^VSKWlKI<*r1|D8o0m4%GN-`#Aps zzn`k*;y;rAp9!+P6936;-Jth3-!__Z|2)oYoZ&lpXg!ZTR4!9*9d+D4lbEF4)(veA zr?;-wI`{Y4pCi}asYj_Jd-;j$wr}UI7ie9> zR#<9x!w0Od|LH4%89pnP=U;MI-y)jsXWB4L_+nMLG?Q$-uCBAvC8d^_`v7PrpEW4aBfnl58x4A9Ecii`N;`D3RJ_1hh z^%$%9^u(^E-&9fUV82(+6%(VBm`l<&zXQH{tK9|8(T@Uabe6mmM&}h9S2`)^q;ZDu z5_Z|@XwdP>a%l7xceVD(w+(oHe;3c81>+ZePH+HjTkOTig|<%YSLETcJ**vaKRY}# zY}v&-40>lo@PjR9#1`Vyw{q^R4ccivk8>_Ux4pH7Zu1Suz(zmwNJi*3&Jh2q(5Y3I z&_WaaaUV}-9sSior<_AW4z~|8=4r&G$~03t$?iTa6M90Ydon?4do47SiMlV(*gYFF zQP1|w3F$N|bvvnh8gbdB|b(d|gk^G|g$YJ*7Sxb0D^kEW9+$cWBsB`)Y#3J6p zy3a6sbi*?y(x`fH90%$c`+0|SKU(hV{jASHZ!3J!Eq!+)b04VqH;Mf<3Vj&4ytLv| z0tY^&mQe-rb+NxV2czw;mVu_=)-PyXh_5-v$i~E8Gxbj~a<5Y7bJ`!8b4Q!-5o-<~ z!Ak?sx~wyNh1~y4EN28XKV8mUV1}QD)}Eg5lH9$-+8FutANW2^zM~owe)>U$pEkd} zil4g4owxv9Ma(06x#1_%{ujhn$dPi@=x5jcakPZ}k3;LujhH*M(L8#~9WU#(sPI+k zN63JeBkUoqQ)avM5<8N$5gHf!GtxG7mmO@w&)Ccz#rVMNuR7tp{S_ZU%Ur{!_fND% zv&NQdy?{7lw-vOlz<1e??oRyM*Snvx?VI3LY?IPQ1kSSF);8(DClXxi@(bmjNU1Yg z?>?Wz^`1)3E!<8Vw8bx8haMviYSy#Stmk`>d+I|mbUIOo6&hH-KaE<;w9`9doOVj} zK6h3b8mWGsuQPp$P4yL7|M$@^<4z-%p^|aQCCpju;|lNh&Ioqi1)o0c z7izqd>lbWmwZ$h5+AU-cdPLiT)=Z&2{P!6Wt4hwId{){-A|vsUWL;y;H~7pqeErXn zw-s3{ZL8XSywYxxJsxiO`lVvWAw$UzmGiK?lST7}x(^xpskknYq0>&CyDzt}FD_p2 zX3msycIo+t*f0FvQ1P4O`R>tslg17pzG`&s-^1Sx;I09A-ta2&^;=rL&MAt|c)VOQ zbocpjxC(cV&T(G^w|@~V#0JfFTK}KPZq6c`d%y;Gz-yBvQ-MeLPvT=xWsvU3HYfDZkbS!)H zBBSh%?iJQhk#Fy*)DY#eKP+`jS@DEr;-kmxdnS30-Et4$=;v3F*XK0&Uy*p-pcP#( zqU=ZaH-tBkla3Ay=if)Hx?6=eeVy+MIDhpGYzh2x?!*!r;XKy)WqloZr`7H7dO2%q ziEb5IWUggeRDZ5%s(qXmgKY!ID*Ta~zVTk}`8lWDPni}CycPd!Te*E%K8X$px7_)D zVv`M{zrD|)yuqI*F_g8Iy=8xc%qLh#{3MHPY+YpqEhG9ISiF8I@2gq=tn|m;f6wG` z?WLXYv*4;cw)(Qv6zThqCWKY!pOll1?Wg+8&jSo6FZom2b)v5SL35Ao)`;1j#s zQF-uZiG74GwrFLOxfcdmr0*BiaJ9JSzNUYFp|-;>F*>2_-=Au90{*?kTqpSTuQ%RF zei3qYQoQpNV&Ldp@nz8$(SOl4)O%TmZo0~Nmw3PlWtqeXl+3fVw7dq`p%Z0U%RO0< zN%+pEm;2N-RB2myL#1t5p0URnK!0K5J+dc@Elk{9{P})~OKCrMhn?$f=FTVf{gQIM zcL+SDe7ltU@9{^4p85T#rq3p~C#tg5 z!%c3_)V6v-w)%28>prEeE_jnYI4ws^ywEl{T|Q%?t(yNHb80+( z&iQK$Uhtz2J^uYE%KHsYw2k6}?@6{qz7O0_X-i-yVE0=sk=P2wzAC#%^#NkCU(*jCOM1~nVHeZ+2`&p95=bPW|cavE4KM{LO8C$E+Kf&(U zpktw*lX72Cqz*;NCLSL_S@zRz3t*RY2B?ZoE7uLFh$fE}A%_mjUe$bK2Q`7vbX zTJ-dZbS$}O*eY5c-Z@YYz5Rp0M8EXcW$Yo--)i2Sp>3kkuj+SC9!=&sn&88gb_R#l z?Mjyl4#D5ollo65^^-F|-M>hFmvjH0Nq!^a*V=xjbEfZHcQmf!Jsa$;Ku0soei*#> zgy2ifj@o-?jIR6q15q1x;!00JmmIDb7H;SCdUnFs* zuxb4?-bZkZyY{TnIS%)aKmM%*?q>~Lr6b9Dekb{TSmR6M|IBK9eJIEpyz}0eXX)qP zO}pYhC-Y0}?&7~Bzn?R>+ppJ9_{8U&pIOVo`-5$ppfzZ5fP9-nj}J_}M(Vw?MwH)r zf^y=Ky8X6fPLG?h3uV}TxbI%#6aD@FYWC*O_(`naZ?fm4q~7O~IZUqiZxidOtCD)( zPuh(pzYiwAf13P$H2M8x!W$1)_Hpi(m{P$LyBL1q%z%zDU1iS7xgDmRdMr76z1-Y~ zi_CvQ>Xptp+?%p}8u5WT$w7=H z2hq!N_o#J{zO8)z}z1??(Kvd=vOYwqhT&ZP#(tSaf6qdruNG z#(oVy`^{-p__D&)-<0!64;qj6 zrz7lgAKO6ZS{Zxf1*wO8OqXrKaKoxhyxzor19)u(v4huf{y38!=Z8P| z-zoM9Q*u9_z;5JknWhWhgb&(%!ROV3$2fOBGc09J^*MhoaVZ_cG(3;2$In^^O{{a9 z#`jp*Yb17``0qFP)R7z}d@}rH_ENHUfbTo#YrVGr3~rU2=Szj0$F9(T-m|i3OH2YE zO7ijjH1xoGV-sKd7HI=cb^gB4gy@|>Y|NSKp%L0@8?!twb+@jIuK~~E7pyPSU6$B8 zev!#Z0?vhIZ~LjS@bfurQO3p&kbdPpBFQfUKXX`n=8)JRdhJUunpnkhDW5I(Xb60x zHI=x{zngWg zoFy$cN;ez1VfOoD_uRxsDbjzAxD~V^c_Dg#8+<_v(d4|4t9EJl1+OuCsqobynNNlH z=2xwi;9AzHY|k5h{f5-X_F}HAO|m~2-ZBtYbW{pmWTi1+T5`R4@!=u3lDM!U$2}+PK$q(@Y&Bz zPD1{#Dt!2`=&1asRz8(u4#o7or?t-YRzAb;^!?bw*gD?jPO`4a*~&?09<`oR`x)y6 zc((@LyJ>hg4ezGm-8ALA19hY9%fQ=vT>n~lx1P^+JOcj5cqLf_|W88|NMbY3WR zCeY(|f@~``si_M-YrrRWh<2KL$QBQ$!6!1kllNg;=)PgzQw_e`J3VBY7o9TfGT%(a z_nhs%d2((xz6*B|@8P{F<2l;wOYwd-?R#Ek=-1>lP1JiPM_b2*$pL^)#?Jx2TJHLx z$A80pg2u;|JyB>ffTzQw*Us&zzok>+e_>&oob7Fk?%Z!96NnMFa&}sDL}w*7oWQqA z!?*byWpb`Al=uvH9JmW#yDjft8kD^Ja@*CF_(3eOMae&bKXn|TIM3uwO_d*T>E1)} zx@i?2mAMEFRBY*owU2V4rh`+473*T?VD>KVb#f$*)S_da%u%;S^sVM! z-9J1W-ZIiauKi5G&3HTR-|J`Z`jEEIzc6LH4I}l)_lD!zi7lnul|DCRyG^+(tQ@LkUj+mvB)6p``v@g+=ZWIAxn_w z#Fcf<@u9~b5kE@HW{E8ueSWj>0kZGmSo2r4t}n^`wco==n8Z8z8x8N=1D_4h_QT(q zBu`FBem|SYoA%`QGs*9z$?wtR_Y&W-UgWL--Z75eUxMCWv;bLw>}c(TpOGEei;xxQ z{dV-eyl-dixSZgQ4c>X4CKsU}pHS;+_D;Hqzsp@;&_R8shxm8RarS8AF7gJ)b74jH z7}{5F5jn4ExVany6Z+4eq3Hpgo1B|_TZEoP_R3zUp}iXt`&VV=jW)5b^IA5rmIdlf z$B$K-EAPMyIJX`wK?ZU@MBocdu01r+>j)ntduDG(R>>WW$V1?eyuW$tWDjo=uc&4C zl@)mLF9VGqFVjP;^wX~o);xI_@b(0}6o_}4v68cWCu?}Xi-t#JbIWd%16rS%2XC#O zEGtDuR@pbZl zY3eLbY?IQt;Nz0li4X1`tH#Hx$U67LxlrLJ_b!*UsL1U3?w^(Iha|U&wG=y1YzXW_ zBTsZ2!L_uDHSZ(uo9=rj@V~#@-mHzZl~`oCtvXH14cbnW8@u0W><@HfR-cE;Pl2!Z zm+io0&*~i#vwwYSnoszuyr!>)uS5?{p&K}(v~U8xTHLcL^VPaf<|Xo8@Kuq&3#5(k z>;!z>a9=y{L&IfzEom#b9>>@GDcf$kZ&8`{@ik6O@}l35eS9jq;17}OYGjiyg+qm`CNt@t6goWD5nDVo?DdGm2NL028m`=y`! zr}^sj?oDeSM`$}gvl>s#zpX+8lWC|z2ZdLrq=OCj)zE%nrM=)o>*@*o`jWJr0)NKN z5MQp$qXvK31b@7jOyrlG`vK>gFAJXWvAV=AbISkwqSv+DQ{2@oKD?rAvP{f#KIVL6 zB66`+e7O?+R@nunJ+Xi;3%fXtU7W@)PUB|~Pa5`s-;0)Xdf3GtI>)uq$-ZUPh%KC) zZG4NSG338Fdv=w?Ks9}s^3rUrhoHf5-d|VBCeEER)YvpSwsh0SCe?wT4Ssl!CiHdF z$7Dan(4XenN;&7Mh1a3+n+CLBD{&2D3w`bRic* z(&N9Lq8uCLV(m{*{>v%W!}d#G|YUGjZ7Yohbh zW06-`&T_h4#PIe0(!bcbgzvKhDb`N0c9k>G6US9?b-(yy*yszAyASAplUp0(gK;+8 z<_x=C9!u;>@HT$0k+EOc*BaM>WnU)B?MH?nrbN=G@}HSgX>;|QV)w!+eVG4?b9`oNNyni- z^WQhe!kUS5oLb-fU!3E!W{!Dz*UPKk3#(&)yEunF=vtK+_$^;Yk2qH497JB{A>wm& z@jh;2$5&``5Z;#iwzzjf)8@`D@}`In$eAIRT>CO@B5TEmf;N#s*iIXS&(!_)k_W74 z$yzH|CU>uTSK!vZv*aGM5*zV|kw|XlvNMr6n|Ox3*0#K&AK-lp z-kS43tx_%7UGwCG8F_ptOGdz_;;a{P~wLQC}(E- z5_ygP${OGgBZD+Nj*dkeJpMnd3-V9yQL2{J`M)inlLZgQ#mShrj){>Uki5^U=V!@1 z5-%}^8+(jHOw{fNpvqUFBL&WSnkG;Z`uShIhVhGYl`21pW8_)w{!x((eW-Xy7^y2)zZ3H=%0K+-j_1Qdq0{w>fXjVt&`MH-*V0+IowInM4zmA!-}yT4SSFIbLC7=miL5? z919!&&a1LdWbXiYl6ZnyuT8AS>#`>z;{En1mP?#XVwl>th?YEPb*#Ub9LiSi<~hsq zZ#he?B!`)E2Z!T&@(7?2n>lp2MRYtovT!r@jqu6}Ylk;z1?jz(euwq457Ng{V(InP z=rw9Q$Fty^H(V zOfI*!m#~{H{T{5pCw=8=}rxkAaOYVi-Z;k%?htG#sb1(1! zb72lcecxxVZvUA5!1u?Z2Yxmtdv(F}&ap5BoV)wRSiiCG7UXEr8QZ7jXfav85@$cV z#^TN8+;)LA2dpa$E!=rNcbAlHYLO+v`-v=Bt@rOf7G$r`w(@_5cFQz7kv96}jAKF@ z>OAU9dH+PxtBfCix|=7K-@b2ba=HAj?xWn6cfX9qYu1p1@4aZ>v6ees>c}M`-YPoekd~L^aMNbjZtJG)2aqA}We)TBAos54-pwNYOM};73;ejzxf-CS3B8W`8D;>`{mdpZuQym$J6=ziRui*b$7x}>2Ote?NgPlknbbcFpyy~5zK^r#E?6*li2z&z{Z5xn0 zz7)1cDr)T{E^X;My6_pXmyieWc|@ENpOL#tIwfW=wtRAb*9d;V0B|M!05^9Tyj+Gw z?63by-?Jk9{@+rfzkQ!QNAb4=4rrrvy6<@64 zU%-D`FO>I?=6_@ZbL?(Y;m-zVkKY&8Z3~Ut#HK&01i#{I7x23a)Q&o8J2>6h5c zGdS)$0gm%GMXmU}71#>oEKP<@-N-X=2fQve$5i*A8G79etxf3z$sWh}{S%&7zJEgQ zp3t)MYN3yAWL6$N9N}BlMzSA54ntDT{s?QfS@x`jhDyX*pfhrG?N(&(HJJw93u^Fr zp_~^hd~AG9iX0Vma``?wgYR|m+T=dEEpi{7s*Bo2xI+SamHX+TS3Qo{xITC8CF{RN z=5M!lYdmb#M}(AKxBxy zbC$Je+&h^kjzT|fh2G74K4rH;lfY~ECjWA!j+p~^M&4G%P7?Sp+vonrn8+rf)9~WG z^pUN)=a6@USIMoZXjSHu+#d*k0Yk9@Lv6xeuJEq#&S=5qPCx2+1s9q%a^}#7Iq%q2 zCG(IiTIP|PQ{%oEJ6(o$IL|C{#?O@HjP%2Or)K^i8R}~#7J$CE-u-P^&fsGo68;~@ zOX*oH>kfVG*RRG~E4}}~=3y)kocs(v0Vh@bRy%>;US*vp(P*kdqgw9fUo=Zr`tYbeGTo2WK-U^=`Y>4ja z!_R?V4*rBYf8N16!iXzC$Ky8Kin{2>j%DAqUv(67mY>Ex?8|U2^GRjzhNiA)Q+9sS zRdP2q^P{gk^od`mX-2Iizrxcoddcw;TgcsoEs76Q*NtB;cWjFtS8M!cLua=KJO6Gh zxcx83g57-Ic?a*(eQ7NC>dj-JmvLmQc>UQT8z+sGKUH$XMrXU_7=o{D4S}Vg{lp8! z?h@Z0SzIr?YMgJyQ)r*Ja%VFG|k34Nu$HSa!5{SoRgz+v=2ju@p9z zg^e}-t}^l?SU1P4;kVutY-4W>ID=csRU6=LkDYf|!HqW)?}65tL%3x`%M9R=dq=Gy z?}3!?>`<|Y&3-So_{cGVQ~H_QhqNEv^moVb$#|#H9q9f2(!cEcF_wIH={A(p{tn=n z#T>QW_+Ofn$e>vCDeo8(UXRzxdSib}yd$q;fc@gTij6_8!oPxt*X?&{n&oVg&}Dex z?wN8fl=m;Ic+OeMzqXe37yYS-C)5##JP8@~`RN_&KZoDD9(#X1e!@;<-`U9Cvn?$f zpU{5L5oqD4-Tjaibw4EM1o64SBmP2^tJCiv7e3YX4c#?K96kJEcgC-MC^fY1bbQwb zWnAJNwZzrHDeo!`TIGA)nB*SfL$EghZh^_X&-8<7e=af5^&bPa2giVIY;@+%qrf&6 zwXWmcRmg1(Tj7_ZExhZwo4Y={AA+udO)*A89rHMAOziQAu&FxsG+q`Og(i_JuWk2( ze{JvcJ+*yGc;$}Txum|c~t(OjIU-Rvvf8jIc!#s4I!eLEM>dU;Z6MwAvbNK0l`Jwfk znHwZ8XhXMa-wExg`jkDe-n7$w<=-N?M7|?7bN#Vs@NAL&FWZCbE3!k@%f53xHoUYw zyQ*#B%@f-)j@ZQXQI>|GFIehIetFD7u4|8JC1?Rk-b-Ro{Zne z`-FKeF)EEuiANb*F~R4f6UVPEQwI}RDmEPBm+v&5l7FVg6*`G`$;v%b23Op-H35dg z_YACEC%_dpLZ_wRHWa!zd3ijQ>Y@t5@T>)jX4bGeuL!!N!L8hKT@5)r$#cOmcEih94K z!+Be$e}0#~i!c0TzZYJ;7+(s!%pwNru|KeexLV zmA&H{747&o@!d4?|9!-bK8l?D46=oIaXM|qYcp0X@7e2TpWuc?uSl*&oXMyT=U?+O zF8(<0XF?98(P`qZNqo^|f5KxOP8D5RASW1`sOZRDYTTo>_yyqMKEEP1*U10N+MCBo zQC^GRRb5rxJu6Gi42uMZshI(WfoNJJG0W|a3F!#d z<(%`J=j@N>wOhJ_&gn)!Vc9Kn*o$Y;X1EUMn{|M1XIpTtc8A!=@-lq7Q`Vuo*ffpy zR^DsH*3qiQV*U zUySzSO5snl+}1%j)mqH~{MBhTa#YrOEE(XjTJyoB)S*;$Fjw#&oRW*44EFG@%0YNN zVlNlojQl&8KfmwV%iGsQ#uFYSHWOd@+bWSKt$=Q0qkw&_=3YOFyeRaGw{v5SC$Tv{ zS&QAdf^!v5*0LWPttU?9lek37M$SrRU%ymyS46bzPv21g-JMTF{Qdif**EPU<}Mhm z_g?Yt0eBl{PsX+0OWr+TFTz*1=g0USkum@F$Y}Q#bF9*PkS_wi&bH~`HsY6$h0aAD zyIgP6<_EQTi0u_Q!Edc22dtXfzu3{kq=vLTy#HXEzo~J9HVFR(V zi!9CEztJ>KE7y!!@CMEgbQkV6?f7WE_nYobv&%(a%vy7G<0(toeZ8ls^D}!2Uy+JcR;Un93N&p$3F*T6&;TON@y z_$$ibkvs4eEl=9~mNr6}@E=Y!dhiF3PxCy1d=lL~_z34fvmZs*)0Xf*75jZRbKM>I zbuyDfzuw322}i=bz+VQ}W{p!a^}|YjeLQ^bB(Y)3`U{`^Rd_ui*Mnl%jAu%_@cV+aioYVQNlFlSgwO^ASoTk#?PUugKGK{R~QAR5-5 z|Nn)CD}{#Bm%cv@cXb>|!|CrIorb$QkEG#r$50yXS|cGNlta+Bz!oNoXQE4$y1u>)Tbumcb&+-FcH7&MD9=I{zUw) z6Y-bVIMY^(&z&63ZmFLzoZ1@X3yA*Kbz_i2r_t}8VSe=aayyoa__001SR?q&%NbX> z=A_|yi{8aQ$$1w|v61%q(>431IQ~{s_a;#rtqS?gS*#h8p48f~)i`|GG`{(?4bvkI zpSDuI`Lvbr&8MxHZ$52BeDi55#EFbB{Bss_Ui@_t|C~5y$6pt* z&tJ?r^15N4@9AwZ`8J4;Q2({IDBr)nMQ_6;YyUc;JL>xut<9AGv}4FO?Wk|siSU2) za@{`vN#+vMz0Zx-ywAop zmnK@yO(m?kDZ8lrQ1q z_wTMlUq6L*HYDX-lZ4pX?%F&Bkp$Qns3D2z4@$ofQ zsJJoa+WW`5_elRTKfe`uzNQ$>Nz4e(cjiWV59Vy8 z7nn(X#?NYqr8$E$f|H!_kfIGelHJ{@+H-1m5LeVF*L1h3quQx^p6jVH1AZ*$O@ZGs ze+ja*irL7W8P*1UM)GSJYnk}eol0GN@A$ikA*s9^oQn>drp<0$#h(>yppIU5S#QMJ zPhZ%|_M(@s4#u46pdCxbUFI&Bd!k(dT$;D3{lh)jp}X%iOcxzCYl&S2Ipfxj1H{3U zyElD)qF+8$U6)!KPGu)~;LE3BAC4q45Ar^Gk-UdJRNj;PaOHoSlHpv1ZeW-y^QJZs zm+&|^NR@^2J3E};|H#}tfzz(XX?s1g-4yV(f!`a%FU;9#VH;D9Xye?VjpXCf#=v{* zrIPE)ypbjU-2eX640%Bf(Cy_Z_tFhT3Z^TjqB{lssXXRj{d_V}^tkTS&MSvk|H0rL zFFyv_aPJv1k1qye(2)HY!}5W#3vT_TGLH4-oDnm4?&k#Wbp5A#=iaF@U+5BiW~PMW zK7Oa72c>_?8Yp57@b2qTlx~&OSO^wZ=M@^FO$EQ{+ZxZ*>BXGgLi}Xx*ii*5BYME z!Jgt(rzWw+C$X+14{9Ph$wXs{J`s4<8ug8}UVW<8n5x%$Q@d-}izbWxk-di)y_Bjo zI3ridn5=aUbxVEfgOEcCzgk^^EfZe0x?;xV6S$wNa3=9P$2ctOHm7Q}XkdOHCFWVB%YNR z{SfyfjB0%pwDOa%t!3&=HIZ%AyU7|G+`yMAf?90aY0UL~&jWTUsZH4gpOWDnP&ffD^oGd)zMsHRVc5HZZU{4>; z+45uUMVzm&AQt~u_tdrm_EkRYo9wUM5%$dpduD|FGUD)Izl^X~M%X9WclkE>=EMHT z9?Um(Lx&H0dW1ba;*VOX`!8+PZT8`8Y=6>tawU4@BF%f^e$CjtNn@`J_Q^XUx@~)U z_G{;8i8ry`+;pRs7&Th=p7;{aou+x4IW_Is8#VuqTQt!Cp z)kw|XyuUAT&bN5>C7#`?dC$I~8PC1Tv!0gi-K_gRD%I`dzpp30@rs_6_s9;g&mXPX z&+gX~?CaS(M(WO-*}hLOS=ENQCi}6 z&+6Hgqjdj8^kZ}~PxOnQplkeRkLLYnvyun0Z_@6i-(yY@J@Lk$wZxTIYS}jqv3B?2 zC)$nAC`w#Wg)VpnSHzg=8uE{dPelIFkbgAf9}W3OL;lf_e>CJDbq*}J(!iC-I2yRp zz?BBBM7F`t!Z&^aa3wO02Cg)4rGYDvWi)Ul@|Om#&`tT~W3NEIIj;vFqppjs$Cw4K zPFsY0bHC<&4qR0{+|i`Xkns{UfJzA>`hF%dbhCiphNw+X&Y@NI(cA@a6=#}9P>mrv*k z?@LMVvp#t6fOVVZeIXm-;(7&F)_|Vvh1PpnXNPVA=9_iz3+HIYnWt*rnXYEc{??Fn zVvlLj6W@GK&$7=WTJ*#`OZQe07Z;k`aBsBl77A^bx*}8vsq2e0} z_Z)aZLiaDQwZzMl^@I(+e~nzeKi-#(SLnu1KBswWkk{8fi5(Z7^NruZ2c|K`1I!Cv z@cM;(Ue^=7SFtv~#@alewRsc!>yxa9MJnF1HyZ2oo**t0+gR@{k)5{pPM?3hAv`t; z9;4tf3Lc~2F$x}|;4umwqu??N>azSu?ixYTow0YT#Q-T=fZXSO`8^_3ZEG=!xI+ z-k6tl`>Wu8+aW#i)z9dO<6qH@?KbZin(>qapH5&KZPgN2U#Q#173uJ4aN+VfRkwd* zYuO8+2me>l=*O_joCk0HEclCnzb7R!rK>u!|TD} zrQq-h`0Fnve}9{YZyXt>T&+iud5}raYtO-FMyzPCwfeL$q1j$XlPxw}=YjT-?l{TIX|e+uxZ#4Z*8Mfa1=wDVNz6e~PY_=qHhgCi zvA{K3u;;LE!y}A|CbA)NF+K&SiuT|&DyM9foWFtJ;eF1BN9H>0jQHH#K*pJMK5}Cu zkW;jkUaeI|tXhRJ5uJt@g6yJwk!aR8a&XE50_muXx!JKUGsQv9x?Y!Rec9=)Az{Um> z_>DMcB#;N2fb&TD?jOH#zl^D2Bsd-E{_XJVxiY7U>#dv-GclvyF=}GOK;)uI7Y*e; zKL%Wzd(f-z$Nm!ocF}_(Plw~UcE~txSGK$al2);k|Djd5;=AL0>lH6BRErxo%=lBJb%E(Y>PFkE#5qNhiic|KVNsIqI2AYowkTb&+bR zaXpD|YQ=Fq9_lgw&R8P6Z#Z=m4Dx5FO_ws9Ny~_%Na5S)mRgs3phqQl`AeTUWEYXE zG~9a2Z7PYl+BF|>DzD>=s%!pYkaOc!pi^6~8u0Z!a-Ie{GqJQfvG+N6Cb(I6`LF~8+6Zvda5Xff;u5(J{&n*#pI!0{KGZqX@GdzJ@cABW`Z{|7w2z#jY_WTk z|Bv-B8+k|5RlG^zc6?Um=RD%?h$kVAS8OE2G^n{Hsh{-9KV)v$pCd-~7GeoFgJA=6 z%4EK6M=t>rXdl{IOE<7Vq5jAZ^@w z>y@$&ee~c&!K$SA72WjZpEksP(%JwoBqpD0y;19s-@xy^oa?ayJ?`?2%p2HMtvB7< zWW2P=ID&EIZj|v*qvs3o6nu2RlzcwcKnUCQz;-n;p^fkulX>75y;kjmKcwc&9LcXt zSd}Sw&bwX>W5CxF;Ay=HuLWPLwHXa+jeVAOxUa(lxHiClL)(tE5Iz!)P4KiDJ_!7% zZ{SSprcLl%)h&4$*z^tH#Lam5=yIDP-qil5%e9*>+3?_f@h;f@JyXP=&B#jm)8jXn+4Cl!ZY@J{0#wL&HRVLuh=Z{s|h~g z&C7a(-Np80&fPxj40bVQrjK#4`?Irbs=0CdLh zTKNslP2zW*>`!WpX`xG@8Tv!M85oD;g3|}%?&iMEx=&iFe>G3q5qi$kF7piSv0gAY z#?Lr}j|`??;SVyeV9t5|)O97a9Qq07-lXi6A#XsIA=WerZ!&*!RNjPrEU5pH-tMM} zlU+U;x}B}!MP*LPz8&D}tZ*!5Fy`Dtz{U*m@g4e!s($V;Uwr?5v@P%7PuJ}C>F1`y zU?VW>U)x8Ajdq?_qr=;%;aQsk57>=N3!M@fT+OTNv%-r$^m<2M5Z(*VIyeKHvmKrF zZ#H~W#kicMc-s|rnDb!FY9JSXE_7<)+j$ZD1$e9%`QSR?i&|it&kzqScyA;xVi0}c zI}2b9Zxgyud^ZIxF#nF6_>tJVXs=d>HiZ7W^Ly7U=4LPkQ~3($v#sd)u-|#)S`6wJ zSW>T(vCs}OS2%_NISkn=pwWgV8L#9R(wEfQWKRvoKwSpxc+mW$Ztkb>jVKs=dhi$+ z%Lj@_5t}{hMK{(ovG<|VcVhQz0(bZk+-pB!_=3ZSrG3ppXOMFPBX*s{UZo9*-yd|} zK&CpBus)GO?ma{=3|u7e-L;ltP4}pFL02&fFb?Zz(KuxC;2jkf-~eL&RL~h z(`_v>6&y_bxg9gHGdAHL4dDQ+-FL3C!ujtK9LPH|7S7Z{r=lHXLhxcKUm!l}-n)wq z*h}O(zS^j&{ZBpuxx4{>UuCQZ6Pc@ItOtUz4uy$~75(Ob^4E22hp#_^zp0fqAm4LX zi}H61b3t_xR38JMgj`?Y8qxJCo#_cI)K3 zm3HKNJMFedSWn1=@1HNhI?KnXexUW{45}62OI;D*q

24oGZFI#XKbsIukf8itG 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
  • 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ðh$$f+S2KU1+i!Sz& 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%0D$CPzX?LKc9GvR#sqxJE zGyVr{N-dwOeGSJ6$70gwZj_9Z^pyjjXelvhVIR9?E_tT7q`sI%cdV$@+~E066a&v~}Y<=cUuut*W!6K2k7*0Ln@itH z>&^}ia`ic7^cL)@(AZ6Qt|dHYqcTy7FW|llN;all<0EeVVq-yK+Tb$+D*qqht)8+xj=T_dGEya1Cnfvq1P;!1+oBjC@v@Izdl(@ezJ8A!! zf9th>a#8O3b9i@n-V*M)Ufa55Ajx;h_Wj zFWP;uWR_)oIP0+ao!Le$%LE7T)36@?nG@o&J13asF`j_OWBO9fUOg^~8x|XDCi=`+ z(`)+sdryn)muOn~SnvgXrZ*1hrV>%JgHLZ0rX$5UwfJU)-d>ot3Myk?xR9|LA5 zPnUoxrg1xH#&|=XUgl}ojmKst&f}`r?=^ifo;cf8!eHWv%}Jg@Ncqy!oM8G)95;jJ zIi@EjJ~-F(#Ky%;^z^_z)68#c;-f##Op7(=`OE-;@^tg~ya~QG+y=~cCh6}>^7i!f z@)UW@n4sy2i!}$}UV|sayv*zK#F_!`9|!=UjS&|;!9d7kX7|qVWruv;jM#XOU#PbVARo6KU%2vm9upBb_|Q#}T;^qJi}e)C73?j72g z8NqIGrkUlNSug|;(KSuct&lKPIxE$Y=W?s9##5Cm1!QB}1bZ?s943044J-M-@na^X+@p^nD zi+P9X4R*HE)_D(YW4!(`CP^gO!RsS(Z9OxB63MQT(#~`8$_IovfZju-7{0_#qjLG{ zGyO)a>G``E^7+hF`0q2VP-eh>cL9%gAg{oPA(_l`yAU+oxFUe_yan=~cw`#9|6IS{ z%lRs1pq&x#^&0-uVhnSn?;LUyaUbaEYWTf@V9*oO%eUHVF-CFIVZM_A`t-4uS(MOhR(7-kA9h(67~icqP-`{E6sI-EUe?Eo z`z&i+TugRz-1l>=c5yTi^So zH}>}~+P~g9{O*41@PXvy=MI)6UwUYNvT>v&Be}%mHA2^go(&nH z%R;_D6@M=ac>>jK>O#So`JsxKn2rlW#XK9|$q0=PF)-!*C=>{F!F*HPJ>2~&bRPBt zA@W@y5PEiq$8QXu+=UHmq-?j?wv>SzLcM}!J1f+uoe|m=G6J`SGVrep_E;_&G6uvK zw)Yr4(tJJ1k=OZO2pPd{F@0js@^=ZW^LP?G1B+sFJ-xhV`745n!M-s@AX|LveP^hj zuQukoUQMClp;e)nPM_K_FhcV}flia+jgGV7^LqYK!W^2{*{Bh}B&22xcU@7P;yYD! zqY=q-BlORZ5!)0pPLskjX#nrI4NpsJYA<(AO|$2s*t1a6u&9)SH>H*3&emBRb6-}& zrUp4T)83cNcyk>?QqDX_lu_f?=VaL5yLZrKUN&^D)3#D=@hSF}%;+^mR`FyeQrtB~ zj4mx2zyQ@{l`Q6C$H_ugXUjB>HBT1rOAD_xJba+p5me82taajwFQ&aalZ_U9M2#u< zKZ$Uh+HaaOwded6E_*75z2&g0Olkn@~2 zNTM6YnCVWtyBE5&p+d?i_sYx~*KCn%Mw!JK3Z8RSA(L^>Q~Yk(XW*<%yJ+CRfwS#B zJJP$5?O~b4pAjbMi)OJ$UdA;t-FU>!aLR#w-iVXFYO_pp?2G3Vm&`3KE1x&NqVkdjRSVg;b}7FO z+i=<9#>=m`a>-R!hdufq-AT*AzGyVbd1=v?dL+NG!{z*qHuUBE^~@_zPT6dk8#`+mb7)LAtShZ7YnWwS8OjP>WnGn-8S0xAy7Hpgr@rikf0yg{`OaRR zS}IZL+vqI)1;wQl5b3`w{$3P+-{pY=dFB7p>py#6x-FG`Ppo^RE}vYQ^;7#cRnO1f znI}_mbo*YoAj4Qjh@>Byhf++p*;(gBo0lex#~%~p2?k?5A%C2wtuKKFYX^VFq)ujM zPghU3Hc9@T!QS))F7Yk!Jmh`Yv(59e=M~SM_}5}z_q^eG(`@$d_q^{r==sn(>^tW9 z#P_Kg-{-Uulc(Hr=bd+5dE*amz5C~nUiWYyCN}T%5$FAF_ba|miFx_wo&TMmKKRh% zLz_EX|J|GK^tEZ*zC+)f++pL!Pdsz-l(O<0R^D{Wubz5($FskEeb%oY>5&u@48?Wo znpZe%{ z_ig;yquX`_;^I5^95!;?IrrYT>&103-MXiwj~My>p^sXgdDds8re|ahDHt~4%t=$H z%{Xu7g|jX$E-jz8psw+%@7%EArw?u3zWc$4s%zeQ`v(`NT|_mB0p?br0vK$i$;Wvv4 zd}sLw`9d+VF-2A%UwmwycbLC>j4wWB>cspZZHB}Q42A+3-kw2E)9!NQq~1U)_H_L>k3HQjr0%DA{t zpiReN0ot`mS-!4KzaCyTEq+35X#BVy6N1y)OpFON{VJtxC@?s2o9Sbghy>IC5_m>W7XZ8%V^#zx%{H||-zl}FGCgGOi zrcVM(w@f-CwtjfiKSFiE+Ro#zpj91zer&g<>zAJ4y>@iF&daCv4g{KB>+c_tY}O9& zcK3Of7WHmF%x^B;-LL8O{yuYQbJIWjPV$9(o@?5VopgHBZ-xg<-wc0`T+hV&9xVyw7YG?<*j_nZYcdXT;L!@jbmEe?d%A zAU3AyljQ;WBz}J&;E4$YV`AHflH$6>cW;x>Hol!N!P}uj$Jj1rS6`yp&D%YuhneK* z-No|u_YQ~~XlDCzJcG^qeD`~P>U$vgiRV-QXP(c!EwMjqy!^(S?#@1c=8Y>?CB4yw_s*>;jNK?6lJ-o;iE@%?P(V z`q;BCy!7&c_l(x!ahjBmi_6NFfA97?o`31(HtqWkJ8j&=^Dmlp@tm^qo4$8HR-SqO zodfS3Zqt6;#Io|Hug*4?Xhab1%Q~&TU4~kJe=0()*>C zf4AqQmdR5tyeKBvE}_q$4?n7|$v=JM=y9vQH*J2y&gXZ(viJAzf8JtPb5fSQ<6Aa1 z*uxiSzjRaErU(4JgG-aV-GZiXkT2I4<27RfG3`TB+jWSU5##kGg<`!yZ;Y3r9B;hO z?~MzXZ9DrX$MlFfpCO{I@l$)D_)wOQ%;C+6%kp&(#Ce-GAsUp^bTl~J+s-?Jv6TM)Wi9O! zgM-=+@FurQZr8NZx9qkqah+GJ_77qlz|%G{w&{tK`uL{TyDv@fH|>x8_)c$r?9y4C znzja;-s*gsHxwucjt|BM>f?HOFZ5jy+jLE0Qm9MpBwy1Ffd@9kclG70_bq)hBPQPO zZ@M>O>EB~at6u==O}?flygj__+Wc=mC0`gs>|7ikdD(bY1Gh`_~=+`BUqSZRSsmJ;^`0_w|wu#yjTytKQxJ!0rS4A8dZV1yX=50Y_4pHt_yA;xQ4d=`Ne+1-K2Kj% zax1knW!QI2dP2f^o`Bczv^Tr^&+^8_bc*Xt@t1IU;&VM6+wx||IMqOJGu{{5wHL#* zR0MfRzLB0zgUzm*{XD)W|5<|=G42){<7c?_JccVTWJtTed2xFyn}twC#+ZQ~!zVHvBYDRRcJ5>*C+5bFWt3M&IlZA|e`=ea-XUguJ2N36>4Yc2=S)u99WfXbSU!VWyaV0&Fj-BIdK2P+D?@8%HoYuCi&w@l)?0L6m@~oHMYIk*Xyk@rx^2U+V3z*+8ONw z-3+>VEa{5r-F`~@ULCR%e7!sSI~oICEoySwbc8Y9)0P>zz9Hrd#C?Ny9VMQYonbib zx)3t}Gt4vaP=e}X>O|%zMp5#ZP%)G6oxI_VVFi593R+gSD47NtOx$pLaf8rjJd4AYmmcT zSh2_2U)g_W<>U^`9+)?ve}5*W2WRJ@hB6VI(|_LJg3|2lypo{>g+mAAT+LxSIaezq zIr*HdHgsUl(0oIdsF#Kv8(5GxFnd6?j07?&n_0rp(BSOCvJwlcLkDCJ9*{GnFNbng zb87K0Ytp2#R!-r-oPqgPW<`B{ZQZazgV?58(J*%)!@h&W=>ZbfK~+_kEtDbQOBn1O zhzTpdyr8sjNNGWSX%aahvsBw56v4gq;T-O+|rzax%0~N`x>MA5`V^z zOD{7_IXu9Z;9qpvkinIMYjfr-99)|{=Zb}#y_r*+9Zn{7r;oMxj3X@rL=d!i3o`Iy z+Uqogoy)Y>|5&g%CGw}xg`LYZc5pKlE=Cu5JRS%;m*iB|w=!-h@08qU6vCU4%eb7F zU*obee>=Pnx#h~`cc6ux%QXH4ABWRi`B>UI!b*MyY{go}23LNa%S!%Tcn9)zu6&!z zO8z8V7P5?EuADh0o0XhTn9;<(TNR&dcvhTcutmg<&&@6?^WTHFYUUqw$c zSd%l?Z3Nec{eK_cp~?ROAJpWXiO8g+u=|N{F6pbnKL(cgI+w>74@-I}o(M~P6;FaC zJrqxYN5XOrm4x>SmzDe~Skgyv6D;YW_!?N^tN1#2CtSn>aZi3DP*};gz!HDOkH8XN z#gD?r;Nd(F`|r7|?n-e+bWTN%H#{_(;o@8jJZg8jJbcBlt+mof?bz$21o6 zPekyMmZvlp^KWY`=J!YNk(L7*i+NVzXjj1SMevc97>&hzn#STj>y5PQNJ~GB#rzrY zZmqnXsmaCu*%3^AqOsUt2(RmHxqg^NExgJKa~(V(In0;AS83(pmOJLtm!sY!t zaFfQ%;P4eNu8rU$Eg#pLwtrbvI8xu8-C)|`JB%ga8y8dO;h+6IVS;`aEaBbi$`cz+ z+dn100G9B|I&y{rjN4!d-{mf^(EOM5xCgFJv5?AT8XMu&8b1IZ+z|f0zXoqco`h*> z52WC+uydJ4I=l;(CnCSrWhGw$A40yymH)|QCI2(LJk@d#`-j9n{-Z%2qYDR69Zn0& zyTSXA%V$C4W8hU<`j3a#X*?1Bt;Un!vDkMmk1++F4mY~)UGB1yFM%aIioXMk|B9Ev zl3t3hg~M0CSP{WTTK;jVX{W!1A$i|Li%dKH?ev8&g(W@Yd^(YDgC#!wF)#1;b6DbQ zrw?3IXWH>mybPA~Qtq|D693Cw`!{Ogk^Ha`j!&1+$YmN2z{U53)BiOw4?CB~*b9%< z`WJt2%`5raV!rjF{)pfsEoYLS#lJ0HCw{xHCZf21F?J+=2Q>2%K9fZe+cU%C2gNQs zUYJHHdTk7{k0mZE`FG$VulOBU z!l(FM_+?m?r}!=oD|tIu!mGFgEa|VfGc4(=I1%2caSwPWtim_mWo3RMEb&o136}UM zo&rmHC_WdK^iVtl4qpLdW&|H;xq$pC?`xOj56b67nq2bhGPq)pWegWNp?uqA$4%4N z4{yk}42uUMAIat&VdpZ9(eMs(!%L)m;eNHtN`5K4 zFE>1%cF1KV{|GjQhRfT+ZVoGXEu4kCmGc-eq;aq(;|-eqIJjVfWfU1seCu5XxlCg*yczqkHhGM@ z;dPpOFT#!3KaO0|E4P=!Vq5Iz!`n3TbKzYY-vsZ|cq@EJ<3Ga3HEzrJcKrR}_!YuQ z8kfOY8s7pB*Z5Jm9-d%_j{d6f#Bls4TMkR;CH&`DgctJxn>@x6c$?#+mRQ&3*%XRI~q%%eHlFybA|^nr_H2l-O^RLVsJcUjXNx84mw? zmzDhuu!VgU{+HndSe3s|V10b@Gg!)}b9oFoh)l|#VlTXNeV7BVls_epg{Q+RzPTI=6<5QZ$R7)MAohRkvXZZbCI2hF3zqVs z_-+@hb4b2{yi-DTk$?v^0(r5V9DQ#--RWAD}E1_ z{H^#PEcsjU2e9OC#r(95oxc_HGd9K~~c$3l`R`TBP6yz#DoawTXpAFB@>VO?eeQQ50>(% zxR6^ZuZr15X_q&}BVj3zibr!RVCSL z!Mgts!P}7+5dg_A9s4@0!qWwg-xQutD}s+}>2nFZ3c0H9SHtTxegfX2<)1&pn>BgI ze&kP0J_63wxDqzbx18V*zACu+V%lFklJNf0WygSNY=tYd^!*Jyd`{T@b8x59FzOG|2`*uK7lvi8tzY?nMM59SjJd4f8GJF(CqJo zr)%l|H@M=8aCnZ1d5u4VS841SKz`IX1|F-qHyGZ{`zPD+_B_UH_?VU-R={PN`Cq`x zHGUi3u9*)Gr2J{&9|9L>d@+1f0GAqCo!+(pFhL$zLoqCym48WKN7i?9^JF4?=&6<%llXMC&24& z2=iI+t{+;)0Srj_xd-0%gRp!f+-Y@~AAk>P{Ge+e>s+SsFf94YxlCgVyz-%N{(J|P z{HEmZ!mDqGY5Ix(!*k#}D9>*GUInk!>^}x?f(vm#^2?v#gPOekVAB7`xMyFc(FvZV z$w$I_NFVjSFM$nB{zJG5ZpUMBe>=QHlYamwz{6d6mm#!wH2Emlj*sjASUAY{Ai*_X z10U1O-zMgXuXCBk9qritT+~y@}@W*mh!8(9W3QnaR*rPyW-BU)K7{N;Y^Ktz*1h7 zycaw{<78OMmy)N!6&m+}8#V3+uh4h^yhh_}c%#NcU@7m){XAI8yW&Dv>JP=kVITQP z@kqFn#-rghjmN>c8c%@7YJ3(vUE|4cna1b9^%_rymuq}JyjtT6;SCzkhPP;34DZmm z6yBrpJXp$yieDux`CoArEcst?4J_qN@gi8tli~(g%9G+oc%{Zy!uojb)$m$Pz7*c1 z@p4$ozjE(-Sjv~;8(=Aaif@7wVX7CqJZyDY$sdEaYW>kCU}@he`BSj8?-cKV!&ks~ zE`pD=WG>^wN_(X_hWd^1xu;i|cKcE458-pynRb0OTb=iDEV9C7|ZTBOXCK3t;Sct$29&9th=`iPPi}Z-nH;L&A*%BnVS3uaJ|NB;4K>8 z0Viw>yLUINyLS&fNt17c;~xl{e*j*+Da;ST*3ZKHFud`>FmHjUKNRLi;5`~Y3O8*I z%O8gu9}e?&IO!K*ej47c#s68j;Nf(`xje@6@C1!_!8EO+_LA9L^t@53Hn$Nr{D0zJ(|%vuU2cITzRG;}jm%f^ z{#1A_h9&+=eitn7bEWHF(f!DIKPtX`ernq9gJ9V4J@|lWr~hKi%Y0YgO@s&cE_Zpa zmVQznwZKQWSV-lfMUh8&_(iyVlLfE&dAdQjPNc?paF!--f+uPGQ+T+>d*JPlSmHRB zX}ke1f7G%`_)T~X9M2PJFQ()>>=sP555ZHl@OOfXG26k#K&P z565f#eK<+u$Kl}`AB1;k@3-SH-j6090Uzi55xc&i1XRM4H2G?Hmc~!Q8#MR+0&mf{ z^J$Ukmk9e_3dgqxya)5DKQ$iS=bnEe^~0s`ACXfXp*+S~csue$m!E?-XyN@B-U3rS z+U9%GklOT0*gp%d*WPD8*!R1zd=NZI<6L+N@m2245q>pnz6@T2JmC6w3tYb^EME<; z)6)yyr^$D~*{_AoKM&7(JF zUI1T#b>}(8lMRt)%a}KNByhJPlcCgJPlr{@p-V+ z*UJ0_u+)c&XTee*E1m;OeX4jaEcL14a(I%)74R&L7r@Iku7+1@d?_sDOSxAMOZif~ z7?$#^_zGCclj5sjDL;yvU?1f}@inlNAH~A%)xCBF-n@~il6cqiP32NJ#)T~_klu+%4tUxg3D(q0ntpS!H&W)bO+ zT*WubWhEa3dnx~Z9*F%5T~_khu+&eAi{VUI#pgzsmHcK{>MOZ2q@!vnGEDKBn<2aPZe*^LyY#jo*O7SHO5Pf{(PUyovR3 zk6IjY=d`DTKcqeVh-K`c07!r0AF#BSce(tNTVd)i)m~pm`&-(pc6%1{=l;U9+pAfw zdoRG!{%qt0iF;46&_v>6*T=Niy}xA63|8)qgC#zSuZJZ*il2w2eYYm)xOdU7=r2%z zDEWR^>Mwgd9`{op!Mr9fhoyd1=Klgqd+MMYzw;kuPKNkhOZcTfu?Cj^kxhhXb5H$HIJF_dTIcKqPc@KiY4aLQX1+@#5Gg}18riTUlY?H}gF#?$aB%-in| z`CrAnX20uL>IaQS!xewCY};ag9Gr>!H`%Uvj2f3610G`$EdDEQfOl%#2ut{t{7P8D zulQ8bc8SkhDRDmYu?AHdr*z7-B%0prIJe5B

    p{~_-+0&jh|R2_ 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 Boc{m- literal 0 HcmV?d00001 diff --git a/benchmarks/guest/regex/openvm.toml b/benchmarks/guest/regex/openvm.toml new file mode 100644 index 0000000000..93998f52a3 --- /dev/null +++ b/benchmarks/guest/regex/openvm.toml @@ -0,0 +1,4 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] +[app_vm_config.keccak] diff --git a/benchmarks/programs/regex/regex_email.txt b/benchmarks/guest/regex/regex_email.txt similarity index 100% rename from benchmarks/programs/regex/regex_email.txt rename to benchmarks/guest/regex/regex_email.txt diff --git a/benchmarks/programs/regex/src/main.rs b/benchmarks/guest/regex/src/main.rs similarity index 100% rename from benchmarks/programs/regex/src/main.rs rename to benchmarks/guest/regex/src/main.rs diff --git a/benchmarks/guest/revm_snailtracer/Cargo.toml b/benchmarks/guest/revm_snailtracer/Cargo.toml new file mode 100644 index 0000000000..e37595eb36 --- /dev/null +++ b/benchmarks/guest/revm_snailtracer/Cargo.toml @@ -0,0 +1,22 @@ +[workspace] +[package] +name = "openvm-revm-snailtracer" +version = "0.0.0" +edition = "2021" + +[dependencies] +openvm = { path = "../../../crates/toolchain/openvm", features = ["std"] } +revm = { version = "18.0.0", default-features = false } +# revm does not re-export this feature so we enable it here +derive_more = { version = "1.0.0", default-features = false, features = [ + "from", + "display", +] } + +[features] +default = [] + +[profile.profiling] +inherits = "release" +debug = 2 +strip = false diff --git a/benchmarks/guest/revm_snailtracer/elf/openvm-revm-snailtracer.elf b/benchmarks/guest/revm_snailtracer/elf/openvm-revm-snailtracer.elf new file mode 100755 index 0000000000000000000000000000000000000000..92552904127624d9bdb9c428ba45f8eb66049dac GIT binary patch literal 1890572 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%0AFS?(luOdZ!KkL5q^t z^R3Q};9dKu$TDtZA8Wfqb7u>V4|5*OGw>ANLEA`4DX}j-{E-`QA7Ja*p9Z6arHxB|HjTTdc_#(8Cd+h}yuhcKkZmlOr1D)4?Hs*Y)27BRQ{PN+Dv4XyKm^cCGd~-rGzP+Bf ztxBoyV~dQG9C}HuwXrC{yq4?9wiUWlhOS(f&{f}xO7cYd^pTqz<~SMh`nsMY_n}f7 z`KyM-#uZ`gWF>a*%=e9EyU5Y7YM^%qw2{wohHYUT{@^vNy+%Ijv6y3>{H0S8(~>{# zouPPwRX|5)@33o2oYqH(g>aW0MK0vqjXmgN*O8BTl=Z97oJ}FdR!y8$wZwF3&fWM! zpIV@KPqj?cZ}=9pE}~%mlfXuk!#NSzFWyCb@kjM6F+|7_)bAd^7iPto6Zo~9_ln&( zuaA6d*Q{))g0bjkuKV|Om2+cX!8@Tt<;asQ@P|m;^swz0_i*C=8E;GL#r-pu=$zky zA6`rSzxbd3$N(mcL?V=2u`0o%*KmTJcW_e0hZgXRG{37k-p{VBM{9&%G17skHT5p^;k$D*XQoy5haOhkld3 z?P_b}To~$}`s*xfYZO@1LW?hN`MI{{$fv3E!+tpDFJYb1MzpeD_pbVVeE5H78S=db zVDJ;)m?i%k4GG|Go$m2HW5rVFIiub#Zt$y*0L;jf()O5Qy1Y5)HT>v;dVODDe1 z1#a2Dck#}(#XTYqgn7n|1lY*CsUQQ`SuM ze&(`6Q)k+Tmut!AUb+-I^@kJpO}*iwIw3V*Yi6P#xaJ^UO#&AMv@PB}B?DC(^#4Y?&HL)a3(SPS)_~J zqBv&~=YdJ|nNG&OphD07*SqnD-OU=MErqk>SZB8`fes#l2lw;7yqUb`qZbmt2F%uK zQDQ*6cMHzME#s;hZDhf|Q|Q0e{s!o3#yZc3tJHG&j(l(I+l)hMOiWzUN&6PyLh=(2 zQ{$>f&o1zBAy=_QHx9H=f3ac==A6o>eYhL!e;4bm@FV$&Z(J+?Ps9&}8xL625;y}l zKKC%|Gc|6gJzy^a{8(I^$FGeeg?CA9=7x#z#=2Js9O1|Kz;rO_gc}6@W&nSSj02Zx z$tzY|KJgt&=6dcW>ii5gsCV7kz*(>3_%*3-nAn`}yi^7savkzofR}ekJJ0GxofIZy$fU7BgB+I?6B;jobQ0w*-iYF&p>vDc2>^BH#HMl zfJ|HN^U*-AEfbpRRB-<;VjgCinlqFB*knX55qZQBc^ElGt>*^dyQ2@9mNvy6Dscji zHIsAC<4SHZ@L$W?Cts*P!M@D)3YRHf`Br<8{BeH-dKHUy9n+HSD;7qr74UmSv&q>R z=acGODER5f_g{KJa-W>ai0DkVQ+ciMSj*sh^e=HLQ+m=IFrCUOk#D%hq#wNUYTOSmYmNwG1 zmH2F8;;!ltm66cM#=hfD<)GBz;rghI?`KZsb{X%#iF_pZclH_%j;MV) z{^fraSw(b4#x45xPuLInKG#96Uw%nwCcnA_-T1xK2Lc_oPISJk=oMEh z*|FGnu5Y6u23x%&wKnL#P|nWFvj6^lZB6iQY`Vq1gXC2pw}?Ed-WmIFpl2;mv3>sg zt_hx7IR0Gh>fl~v{GRrQ!MzK|?+v~?xOe{ez0_5~y?NvJVpj(DE*QV3tqSh>`k?S^ zHAd}9Icrg5^0Urc^wjxVkIZ?mI&X1(aQ#bQS^362^avG4mqB+Zo)xL~p#8tNlg^6V zjxL+m{O{lJ2X15W|KY_hHf&;}ko5*NpI;|p`#DpR^MwAfwTb;Kd7@=M*X)Le;*NbS zF~BM4 z)#P?)5qfpd-d}7#^Q`TUaCRB%f7bbAQ~NU;)H?(Ex*b2F?$w+6uX%>KnuBj&fL@CY zBqBJiebHNN66Y}VYrd}|;13DLHtBs^v0;V`*FrY!Kqnc(K0vNdB(EFjF&;Gm3~cq- za%KLZU>zp;gU8nsy1m6;Pk*ejdzCL2eU8{!^c=s9caQmr{dIr*?uqwg52jmdWw({H z$?6l>6ggwQbO>GGP5lJ^8T0+vEH@BuqwF=zAO1Jp9Q`qQ9n-bT_>3LM<~tMQcNd6} z&1li^E3u^g3NfzOL`rOMKdc##WA~Y17;fs%u$TODG`nH0vX_qB7ozqKv+!4 z*^uovi5uFi`ed-P8nfN? z%yFu*Xiqq$FHJF)!K1&Mu?!CTV_94rOMSMxZJM#f{=q3dIK^1B@4dxXlwTryr|d5@ z8o4E#>4KN62xU80plcp7efm1QRBYeGZ%C{r*B?Qn4~6`;t#5Z5i~kRk1Bs2i4xV5P z0wdQ2H2#^3(HR5&GrUCTJ^CrUpi24weZEt;2-_X=6Mlp*R_Ts~WdVJETfmE&eO^>@ zkz?NseSccM0lf(o`B4k=mAZVszdW#uXR+5%I~cyh{OktejWc>ST)@ut3*tRFBUybb z6II_Qj-Zv_!15*HLsw&!nDvOvYY+X8hWz#dyr~EJljc0vp5R_)InRWG_x(Tq*gG$C z?0Xe2%7%gEl4}`nNzq0eW4s3AH3K?w!fmXk-g258`OVacUPw)jL{+lGj;L6@4)8d! zt{S~v zs7o__-zMqXPv0%{9iVTaYPvBP?dz!TD*e~ccYT$_;4{g4YvoC#z079le? zCa77R;q0_M=pvkl8cstu1vcfp4d_%uDfJbp*VJ%uCjQi!M&rtvUSlb>RC>;c2kyqk zbdcE7QfddRB-WQb6!?;SBl7U@v0|$`NL}sHO4_NzLc5BO$g|JvHSx>nT~Y^|-Nb40tJn*Qxq1@VYW!r(D4f@8Mk~ zL9X@R$~~VxL#L6ye3-N@Kl5Blo>%-){BIupl$?fcfs95@@sUvSb2jtJ2hS(|uyql* z5nk~gfoXJNOLU*)mxzNK>tnsw?-Twbk--=@bfow^b?4Rd;j0~Jh}ay)+Y+mTcfVI~ z8(LGuk%i1zcx*9O_ATq`I2)PEZp+{dVsh)y_odFJ)YB241>?WAovi*UxdcU*fnA);n$=*BxAUo3q@9@SO$kRdSPhZ|cj~t^64L?S0g& zOOrR4uXG>WTh;5CwQgTumAhl8%Dr>-oZdV6{fLRrAO8H+zFF>ebGG}SIa_of&c~YV z?%?-BCNU3MjI-%xyN|ThxL@VocC&)_Rk(dzcbFAp@bS>zD$d-h;+<9Wt8%>#&WO^& z?xwyO?8BSZC18)Ld{``F&!MAhmau--72rcaQ>{ONR&tNA3T=((zFfZz*yp?~jshjri2`Ug37w=s@MvBTo4G8!x+i|m}7 zf22fcsrbU7KW6fDf&7L7esOF@*tJDIB)>%H5crT`PXz|@nu37_vkDwR_H3&%8av3> z9IBEy2KGv9rO>mu#4)m8d7f>9_OX`rL(r?fs$Az*=6kr7H4K5jD)yIgs<>Z&j+q-} zoz&W}M$jGpXAcz*(u??elZ+*ZrTS2?HaEQWbA=nmpBwyRzWbK`Vu?@i3K>Ovdku@T zy)5h+SA#=CTJoj=k&%N~pEl;&!C0|HWQglfxRR#kDsnUNQr=>z4T%j1KWUb;jgBvRfci;2IC+gr;AMNZ#FIhzdk z%exHY)Nq(s-bxO|Xb3N@U)z$7!&Dqn(&p5eM_nzuFW+eLb}rghcB8Kduqz6Kvt!J%(_9KI!O zx|MJ5nMzFa24X_ZE>W-S4PwiUsL`Cp5a$_t;ZJLj_qM{HUWG5?V=^WRE#Mj(WgXVD zp78&xd~B$3%xvge3C~v!b21(1{984rrJMD-f_2LNvXVXFF=yEBF?n{peC^P9<;tO) z$7)VyBetZwIiKLXdGupLiFY}axft0$Z$`8*Z`;f!V>#e8*p{CEQo< zE~{nN$Ej;y-=R0$6VMFvGNI2tt%2qs>+l;|BXnm>AFWAWCTluJYsLQlW77=yhVIjg z+nfK-(TjJ5zUSz~|7*sZ^ZIB@*dKSRrLwR7*xG%YMtY0$3zu_gM+=Eh`b*W^vm&0Ww$Xjgw<^Z#Dj3jG}h-5dwq#C~lM+A8#? zH42?vxE*2({gG+gP@N-&i~BeTp8fVUc|Y0D)cb|J;RsY zF9$m7ms1*)Lk?rLeG2r^(rsvSP)-i#$^eJHAt%BVXfilH?Uecm?W8_?OC(08&`#Z_ zi`^yo=|eyF(?w|FC}`n+x(J>8-$5659Mu`nhU%+7oHk_fr|6>%ZJUGl(wFDtu`95% z?~_p;f^HmQ`xw~vB#B#nHhbp_4Px6E@$x$COl~$L=97D@>;orr-esZ>GBuGuh=Y<; z5Fy$Zco9OY(p} zhOB~}*x2RxuOpX@K|UM3X-Mj##ppaZmop296LNu;x}XIcPGpShepO^tY#0iyA1d}0 zYVJ&3wMYyCkrOA`ZeTs~B#YdEi*tUFbIg5NYlODEa*K@Lr6`0_PRVn0#u z*UvHG(PkC?VIsq7FB#R7BzI~U`JC@-vL`}*9Qd1k-}>M(+y3mAsgcit@K4)Hi@6YeFkO52VCGgJ7 zcH~0jzhm0rq43?M9q`QU@Y3DBoGdajaEX_p$L|JC4v+Y+fd6JU@}uzhRl|H+1hHWl zr0#v+?ONQqH{jpPMXo-`*3>-~-a4kvaK|K>FS_A=2D$q<>}au9L!X5FKj!SfhN|-Wx@Yayoz)%4XsdN^GxT742fEjekea|5 z$gS7vMtNHH7`i=miBEI9E!?A<5?*w#?yQMI6V@Q75la)9P(`DLIw5M<-jzJNRTH_+ zd*&AKt)y*_&?MHTXB@9NBd!Z6XSl8!rY4-o@TAJSSaTlyn;)0gxF^fLIL+DkwFxKx zVtg4cCD!Jp+|m6;FU@nRE=5*vi#n|*>0Kit`{b@7mnK!iE1VUdl#DO$rY+FE3}c24 zICcG|uI_rCN`D6Z|r3o zqX&Fr6JZ-$^S<}GwrAh7^AhCB2;S|g&-un4@9VB^@O>f|S3+l&v2LG+mLX4~Q{cma44YdCJvlh``4eA@LMGp0e4g6mAxBo+ZgAbIk-zPR`|7Cvr zv90$OU-MCYVxRl3^+WB&AJ`8cIR2ge#{a~RIsU=B?;HQ~g7F{!QO5tV|604XY430M z{~i9Y8Zp1xKe|8ccyuUMM_pi(-8MPULE#U3(DOt!eYGn-mNSLpI8zvNGqJciPr$z+ zCu`XI&lM`jjZv8;J~{gOiZnX)YT}fm&Q1IrlHe8^{dN50L-2L{dOLikJuhA^&+5>>C&_VlAJ6o>c-b=IKf)s_>adCDd}b`VdWj(_ac(QxBj8Z4 zBxeeBL2gdb%U7b8CuT_ePxr*+j;8LPNqLtcqjVvoEG7Q;Ia=ziCd)SXR&9jyxCYI0(Xo$>fO8qY-|n>| zkxokv)84s`wIx zMJ7n?UJ-8HOxrS<9V*kwyQ?Wv)77l|wbZw|!=5Q}S{B)+1HD^y5L>aQyBE8E{NBNz z^$72Ze`T#cVG89~nXNLT{bU^K|+MC$lExOyIIM(obtRA0!^*HCf`3w4hgd z#MebR<0%szlgtn1&Y)vYtRv*}GWH>xS?l+jO>P!FRbm)^Vsw)fhl=V3dE&U5T!&24gfU#Vlo=T|giy5muiPX2Ygi}{6B%f>6cAJ6I zzsQZm-IH~dn1k$T1#>!BBc7ZSjA}t9MCS%?2OhQ?(l&lwL;KDIJ=TK66!3jrpldd z{v!Lxb}fKyz9TNSWE0^<(Z)s4WZu03`I$3ypEgzhw3RZjCA*^)9Ix?`JH-FUx62}z zXD+_h2uRi!3n3LsvF;}0=;)CmRe82kazRjH!Ia~DW6uKf;pY)QT zKG)outMkI3UX8aA7eM9+dTDIi5+c(kiu>0~=rnE+n9B~E^3KNlJDJbbX!_)Hx>-}&US z4Qs9G+FEZe`hj_qh=~V%yMCtb73zi`(^K+R9)1GrATMo4v1!J}NcL*j^a%ZgAIo~A zE|%nUo2+|txMvn7?I}|djzz4)^skvetohNL`$Oa4;ksi5@gd#HWGG&S4yb~;C_Z52 zo6$kEhvJp;EJ<9jI`m0AACsX?E7*r@mUy7C)W{fc$=OCdXXov;3%-i4+00(&%$d5g zKc8GKF0Q#Uhdo$=Y%CcJOQM1Tx{zES`TwgLoe4w=}rGKQKkayq}wPJ_+ z2JNH1Y2IaHTUn>amuAt2F`jp3(WNv?TlM&gW}%1vns6&Rer88Her8lc=PMh~zlcpc zeOL)T`|0?oZdw19!MtPrTdaS}J+|G1-kFSz$v)a-A00N3o804)_=@OZ_p`oTN<`>g z&bDi*w9!8^pw010o%*uJqaWhfq3727U7R!OfuCbyksl8m9Nz}k-zOzjvIY)`^B%8c z4U{LD^Q?ig3z_ri1COgiKX|j))}SA}k9gkIK3z>UTEl$3Ap0BUwC;>=38jWuM-aO| zWY1wO%sxX;U2@{#LidQD-kZ8|k zPyITWYkuyjr3v(k#7AD~`^9?_OYz+rXkT`pV|^wmXIY{us<3a_RUq-H(gDfBryA{P`oc zHluR$$G5HOKYx;a`4+w}^XtIesZBF?KJ*NVxq}|A4n5q>GM>o1_i+Xd{hX6mYQvx7 z#IkqCu%1|(tYz#nW8|`{gI^c=V`>XslkvQII{t0{!_UQQGp76FbBo^qIc3=kk>?Ov zX6^2k^_hy{r;%G<{%6;m=68%SSz=s6$Brd-Rfg{}PhY7O`f{emUVN`nImdsN zqu*VO{~m1EdUL*4_woO3J5A0F@c|>By<;v1U*bE}CIZ=XCGt`Ybf%6vtw@N?rCY|B zmNTa1jOnqA>9OtT+UwA{Cqs;Rh%wh0bDc5A?^4$pbCD~;!{0WAH~#sPzMqq^K6I?@ zNNqq9uHViYOK7PJ#us{d&`{B3*KC$J%_Hp6@z|ly+fW)u%IDU=@6ciBQDMF9lh%7E6DYAIA_{b201G5`>itA*Yu`d zZidEIY4-J5Y&(f#mv_6Cy5tOfKW)2YCAL>q%)_<<`Vz6{S_jcNF9x68&-2^X66+@H z&3T72j-TLv6vHQYt>$%}NWA9Ry-xmW@-`#O5F<<8@pY#!`f~Yc@v?IEk>_HobrI`H z_;^B3jm$@ek!QflK76joypVB~SYh!|l(FN5_x95T*5ROM(SaNZU*WvzYrd}WbNlH+ znSX{N@ee*xE_V0WEc=hOTGzI!Vv*TJb~ip-Oj+6Klscnq6zZUU9C%!{2ZpJ198tBTp!G|~%E0~B516rDdCP8N^!XlSpU-)^k zi9f-^citVN8~E2tZaT*Mt3sEMDPjRVsyET6Fdoc3=X#;dXY9{uAhErXZ_(#g>vl<& zxeCvRH~W0Zgl2sTUx>N+=?Trq=cd^Zht@*t#2zQ&MUcDRJq@}>|r&vf?r&HRrqI{*85 zWF_yDKY!XzkbPLHwy@ln!@DA!6%>#Xy}2DB*>A8 zzY%erms}vSR|10ljT5x~Haz{$n4P^1=(wX{FOrbGujX7UXFIQJ?&%{m_sdbuICV7kKod1N z3s$dU*JB%;_cU@we2H%piE0FS<>B3e>iyO(xMFuX0Tdf&LJhJR9rh~{mX zApVa2H>8ek13rswk(Z5QkPWVFpx!SgoNK8=WP)K&ZPlHIzhm3Po|&AA$eS;~6aD$< zlH^RT z+1^CpZ4r1|1l|^bw^_!RIt$)r!P_i&oA|eyE_*Y0+d=u>oisi&*>Yk;j3X{JeX)^q zE4@W)(q&zAYE4=^BujHKg=`|x>!ttLt9qJs=6*=lpUb(Xm%pWX9_OLtLY4f3 zvcA;bM(TY!@e`u&Ing0WXKz$@qPH6Mv^9EPoOP!$svD82OCqsKCTYd~?uK}9N_v0G*4;W`zvvE!IojZzC^{dN#{ZvN`{1WCL z_Qkai0MBYowSV&GAGZI@&oRKOfS;tr>wq&qo9ck;><6o>fu9My2Kavx-wAjK_$=Td zflmj1De#%Vuh-%(a09pt+z@yg_#EJifZwjg>w$-X*8>j=yczgCz*~R=OLHL$HKl=@ z0?z_}9C#=2KWXs{a0_?_xFzsz;I9Gi0sgKQZvY+v-T*uzaFe`vF>)G}5DVZ4J>CdB z3cL|`RNyeBjxoTifS;ttX9Fj`UDIsfc>=EnekSl5;Qy(|=KzlZp94H5@ae!W1wIq_ z^?H0R@OV|R@`yaz58V^U+;ka;kae!RP?aSOXLLfEPD9Bo<3>hd{uA# zFUwjlSDAgXmU~<^>i}76&XLfT0_4$O9V%YhK<7 zk|#Ehwa69!-z00<`3b$hyk#6K@>bh^dCSgw=ab7@Lc=LvnbXlNLHps)B6DGz1dpTd zL_ZLW_fLJ9E0lML%w-q;kB=;KDPqnz=DkTNKPPt~SN#{{EL&vJ?)@1^l4Ueiw?+O-^$5g&`#0GNPMzG<*+4#$zj9(e>u!VPKhC> zlpv=Z@v-GF^pZ~nat!7N{KpQ+G3P({vE`VA>^ad7zRxZuKKf|# zlYBlujy(tG5c%=43(3Ry{k-^bb$RHL^U&Gkv5(60&=cV=rWq?I$(arNBt!G&kyeB zh2DaUx=}MGzk-auCx~4)5H3Em#z)N+>gR=?O1Y;|?!}aQ?cn8-ABg&b8vz$x%m?KO ztpvA%Jv(t7{5+xL2sOsA*X2y@Szl6#q!K z0=;|~y;v-NpYx+{LaXL7RwcCEr0o^x$*OYxSXtkOq>c_;gnZep9ZM}T9)mJEE( zM*|-N{5arafn!U74vScN=dW|jE0VqrHXq$-#qT*YnoHiaW$5aI_D~Lchp(_-Ome>Z zAZ7es&am-Q|MUKGnBT;=YFXpqE8TTT?jCDdZIsv1C+NG-kp*W^vD_KdBsqgxEo(sH zsO9W=zCeA5|DUvSwrP3%ze;GO#~cy6tbmrbL%;N#-AG@t^YkZvZWa2DSSDfr%w?c5hCl0{r&UV5nHQW7bTWVN z>G#h@()SB*@Y}>1$+hkE_}IgS!n^Q!ym=_R4Ih=y_QvfhHq^hKDIX> z25%#W<9&x=S4JF=uN9_-?6KTt`eI`RdaWvSb=cuQN?!~|_jNI}egrYoiVQ|F7i?f4gRrTdQlRMb4-I z7B6q%EW__pn?AK&>dqM3jPX#$cqn5$lrbL47$3$MAI2CT#uy*Q7!P5Lheu|8&|v6aJSukXLm{ z!+t+v=mqws%R)xBlXtSb)6F|QA5duRLB(xy1gUzN`Z?Ont-DH~azh zrQ9s#c2jQ8;N^~{+%Zya4dqr-?sUqXIcT}mfjPMd+%&k&;I<5oi@eJG1vd+BH@H26 z<07xpHj}oQw9TY#=3s4O{(@TrZZ){m!JRocF6WZe7u+9)EC?=xZU9P z4310OBkCKWz7gshp}vs;>-#1&Dq90yHF(p(n>iq!^6?gdmjKCPc(Shoxy8QZqhiz)d^r*36=D~Qw>Y=rpG{?uoXRIR)PIJ`V zfZt_~X4u2Ry0@@iced4Q&UfT2s}sB|c-`Rj42Y+EyplZXmuGCK$a6PT@Vde484yqTcqK9F7o&bL>K7ZRe(D0h ze&AJuHyym01LIvJc#FVGgV!809&0%W&pv!Me#o;m^(}vV!O4Qt9djS+$>F6n`|v#7 zyA8Z;$Lfw>UP-?3n3?ZBR*`Q!UX>rzuL7Jr-9BQD?tJ?sE^H*THQ-c(GdV-Qe{Mh$lSM=qM?4JIq33V@08xtt#yQUGe$u%gG)e zyOVfTdIY(gxKPW8XI00ZT<*ve<#N}tx0ZX7{kjj=;e`UnzRicTXIe&VgQVyexYr>Q z%Dr9eNARC{DIb{FnvkpaX>84RqSyF-LA;DOLX{U5#>+3n*1V1!zuzyUT;gBdTo@m9 zSP{0{$VreAFQ>+_H zo)SOH+8-mI`F^)Xc`}T=CU&G@x4cg5N`rIszH{~5IXm^m9vWUzQ71f^ds1>*aHntJ zV}16^?Ek{DZ&=bMXZYIpuwO2VYt`hNsnWfgIeL@cf?ae>mveaj=M0p4=WM;nkUP2& z|2~_uP2|dO1^K^`?m2!+M;%eQrHxl4;Ht7jZ_|f{zIBJSi8r z+&2LS=5^krH|5LoLOt%^Z{jSG?-exb@uEf46L=x;8sPpNc!A*0)0>LrUZBVQ`#jD7 zc~46l@z6}es{yXJVCMtezXR9!zjLm%k9)qfPyUzoh2r7qM%=35J>b~Vcs0QNJ8*Oe zUMKw}ImbKcFaJ(|SuN~!nQPI`kmv_E3k9B$c5=6*o$^2JD=K=zW&y03Sb!JcFMHN(Bl<27$} zDd+MXVq?F5Z_>B_!1m%)cX=Ay?rO^45lOwZNb1SDV!c^9vHXdLZJ}#JpFuo-@)0Dg zz&E8mCN>#@8_e0ZXV9JC?-uOya`X5l+kBdG1Kb?m3u1p~u&0;#9=Glz*NFKp_L#vp zjh${! zd*wOU&I7Pv)`$Q$E(g=Y`}?KTDh*(ha{(^OoWtLaH3Yv26Bi?4_SducYjPB{x!m-1F!3?yD@xEcq|*<^N4JO$=n#Dcw8+;- z*kM`gPltUvfPM9n7lmhP`;6-LnCOpe(Q$I+XxjafN0hZ2?c;%79x?T?GnG0BET9*O z_ps6P<3&=o(40{2`A_4cKhN1k9sXpW&*PhU#2L(6@)MtbPB1Fl^RQVLUod=blOjKm z69T>V`|1#1x&eJ>Irez?1FTq1ypAxrvNY;Sdwm*w)Xw+O;84y6{l}7TC}%@*x7ZRI zoMlM9Avqu6cOACQ(cD={-EbS-mA3xo0G6%AcH0VI+1emC==%Q%VAZwc3=Rjd>e}Ev z-C0nsnfs>kDaOv% z6B>6_Ywn%M48%)rP1F8H^MACqFkTJm_u^$Tt`YQiA@rKqkD+(6qtN}OexBn3=0tyg zy94E+Z?hY*$&nb$)&-1@l)=UOUIQ^={r9z>e3bWFn|UW=ZWy?X+K!J@hRoxPdF{Yu zBp&%FWq4MCc=-dhqt+et{l0#!hSxWmjjd^&_M4Y}aK9$@ysx~sJxTC)AwZeQd?&|@8kG&83Tx4O&aVyNH zIcI#@sAN7?B9|PKf6u?9d(zdYyEjWKYYR=^SaHqk^A~U^V$pR ze6qRSdKZahC9yu;bP z$$5_7e{BokV`Dwu5m`RIbR~R;Yxx=YIvz``DEwYn#|AkGnFBITef)1;s=yo*$lPU& zGw+N#QI|Omk0O>C|I69;Xk=>HV~^qYarp0<8uM?hoZFNc)z9f}^<$iS|BZ9+cXE1m z_I>X^_vU=vsJ;!{+2F1OckSS~qXhTs;GO~Qx553v;JBjeuRa{yJaCT%_r$?*<-DQ# zIgR>qhWa;+`sU6X2B0 z_LjWp&mHn~zke;ZmGm2jU@iJvwHVNgtKPR3 z2ekEPZAJaH=-X?gYjgfPM+Ix~{ND@hm;I6SkDO-(v?B2}&ZGZ|{zLc&YqdYDt(7(W zS|AT~Y>;`39~ZW&KFxUDX3h$I$^E}Kz?=L~@Ep0#$J1UrmnW4;|aKn)i)u7&?oN3H~ekrkwtXJ_};J`D2^Sjcx5OgRy<#9|!j_J`5j9XRCug zt`Cpx*T;eU;J2+7{oSGR!+ts&;2i%+>1@Ao320w1&%el;^J!mBHb8e^zJMQZ!26G> zMmM+?8RRi&-gC$#&Z5N5RvE9!e8y+dtmAX*>Sot()5Tq3b3w>V50xBhbX^+`7>s!Mgdy zQv=gPt#?407|i(@2WaB^Xc8{?7x{=Y!<!5PH=F1w1 zL)VFR%fRbI+tH7|AXoRv{n~<$w@wnoC;5nSyiY&1orkWIwm09mPCi(U_xX!ioAXB* zky|GRU_HsdbQZufsj21G~Nqbo^=P_)F0GoyffH(EXdC|3||IUJCM>5Jx9oxl_)R zkcIE__mu2SHx4lNA2g>o4l<`7V@^NzZzwqPDY3=EcH>cayA3CRNANe?QI+$zPXM=m9TjpF> zbo_Jv-fT|aT-81!c~B&mDt3BX_S5lTzMsi_A23GlgvGLlTYRI;Ynk^p`9ozdC-EDC zy$+8WNjD~VQfU}iS<&IG_sp?H@iVMI=1O<$F9Nm zPQLBPLU8NBT@LQ5!Et@tk#oVF1nx!PUOhOjZ#yy!+%UN1;Eo#{*S8(nq)}hainnp@ zy=(COTlq5f3&Nt{NOSXe+prz`Y3E zs|Uvo+6rzM+;VWo4UQYMHAH9F`(Si)qPLT^Tu&Uv77INEdPn$G<;^~vGhq1GGUmVR zv-@;aZQIbTh1m1?Ids_b`7xoPH+~Fg+p0&m$N30rMtmTH{jXL-ypi8=hN=g!{rlpF zc>exsAGl<()XLMI*S;~}2-!^*zhr+KyKNjY6Z%=eI?|LN0M`QI|%rQYxI z{vkA0=%!oAcl*ad{!xV?I)>B@73@v4q0acVa*m`CH!G~nwV?@?R%=Hxy{SuDL&THu zVScPdUl%8S>J|U;V?XzMw<~PD=b6%O>gv<{+UF$(Ff@Cplj#uK737Zgp#98Qn=!O4 zVmtYCtnD>q@Q)P(+NhNC@Pod$h4z1BS!_0{q3OhnnbAUwi|yotFQXXew{x^d5$_!8;pp-P6RhLs`jrtCi7w3^(5U%r_mplAZIdHKEQXx`5rbY^CHykU%vl{ofp*{)6~8E2!0yfntG>M z;%bE*^Z2CGvl3WMF0R?H4#aISu`Qlit>a^o5Wi)W{vGom=&M}p;v>-Cmf7iddeslA z^sd|Ud><0KAzxE7f2_;6r=lxD*y8u|BbgHTkywAA4a|wak3@5>nT(vvocr{rsb4ei zCUwqnLtX>99T*eIY3C51RL*DIigxiUc~jOwfBddF=6mij?V2I|o{j|mC0{i|Ml<~| zlQz>1@h$P=bEHeo;aoF_RfGSvA!o_rVDWQmEpBt8#Zpc4)*2gk4wBCH@gtrdT^J6yJ~RUGQm9;+)3bG1n$*? zr!*cc@val~>`*4|S zeK>7*#+TOT&d?dN4~aX=8Gr8lfAVW0Tl;)3ps$UhtB#N2yze0YkLthwyZk@IH^*(x zvTiv0f0N{OlxF zF1oMq{`c~DPk4R5_qs~0_ly;1Qcf%=2mcW%$J6}0k=P_`V4c=O|0pXIlw~9P2YU4( z2bVR(+RHxVpOhcaQ>jrD8qw~jZHf5Odzh=l8Yx3w8MR5;_`Ue(mnidZ#1E=MHd_Xrhwgk9{`r||c>I0D z6N2XPthI)?cnvi*ocTFkrpjq8DK5r$bw^*!yVQ~SmNymJeDS|Dd+RYlE~c%gSG=~;- zo%ZKgk0Vbc*JFW&P0Q!Jsh{GT|NOUq)Ba0ZKj?emg36VO?lk8nxfpfnj+k}nk?>eY3+yEH4Cr_T~=h*6k`)A_XXHUE-Q+MmI0fOJ?OF_ zc1;oXpmLv&J?OF_@$iMfurW2{88)W=9UIe-{4chkau-`r|9`D1%)R6e-LA<(ciW4F zh8xwy)UED7F4#_tu-*IjrjoC>k7tRGlsEH7np1+k)8xhAWypcJf_P@DvBS==PPUV8 z3%-!crRZGD*i9L(*^l<{BJ{v{YLt=A3hh*jbS;xE}tsL7On8rpAj*sX@o)*pcy0U;M^a zVmHFShRD9<@*#;rdn+4Bmrgh)&J<-X6`V89{ELw~)V9XwI9{Y5NMs>|cy&Pg3lS?b5lv%wbQN%b8yZwywgf zH*=mze8X1kUL$|kyy1JuW%fhHYlPN%iNxuCb*CQ-Yg+V0Z*wW*$vl`k9K1Eez9J7% z^wE$rkr?+;+BU6GllD1{tlJ5USHm9KI+1bQLfoyPx;Jzy-vi%~nE30-1JD|hxcIGx zHpI!SPdL_$gyRrvj=P^%prMCYgeG!g56>*_S?r>Fh{0c@sh0a$>uZq9X~&Wta;ptx zUGF6a8@MyG#BF$)90AYp9s04MlRNYw!~bSB;f$vqa<{f7lvP8VzbV8A1U??0zlk*= zWdV<_4#{{p6C(H|@|*XCUOL!FJ5kD<0BrnbWPkoQ`JUOWc_q|i3S&EcHNM-_>z22W zukWIs_iN7T8u=#tfal}sN2?S6$<3NgQUlen!f+;X<@!ynS;4-5`4OGLGv>|25!8X- z7IPTc$!VM+{Z3wke}vSmX_}*k0%!lR8XTeNt9gfURo36BH+3|=L;tM@|9=6yGl2Q^ z=}bsJs7y`5j+)>!6LXldTc}IAng8i;Vyrpo6$U!vJY{z4YIQTbpgrQ4&(oe2@S`mK zmc_ptSt&N1dQ2zAk*0g0sPNgav$|RLh>Pp&nL$p`6}oM0?^TiA^at&*9wo;Fu*?cw zNnb`T)`gxst$u$}x6TA(o*?Q6b?c|*}dE1><{*N%nBGW=j z`e!wLF<}}w@{Nu3FTWePGbhErG(P5R-r*TA#{xIP_cA8=uU0cwuV5EO+cBcEi;1Om zOr4q1B4MXzJMwGNB4;prY8~H;I{JthvNOBM^VZ2b(+#zn_D`lQ+39|cfYd@$Y=f~M z(#|1dH*^Qreoq^qv$kZXHr5QOT>5qr+UrdZHkJwf01<~E> zw6QE{&wP*ZSr&Fo=-JF3>^PQ%>_x}(ULE#c^1LOX=G{Y%2>jJ0Za;fxWQ<6B%!T4# zf#1o|X1whC)KB6};CoTl%@|kfcAE7&Z(gr=)2ER&lHsn#$O&EqSXv#?hf-KQ4e z4>9(>aH^wF>{sCRZR8At)^;ALIi1a#T9oI@q4bl)bHpcMXCb_~0Nz{xZ!Um07r>hf z;LQc_<^p(g0lc{Y-dq50E`T=|G)1^`HCf!{(vB{+JAK|ZjG{a8fSH|sL0In%DghwBKs9y|Lh+kHw?QdrynmN?=f*2eZQ#bzFh7J4L$vzy6P<9y;aB< z)BU`gs+$}v9=JcLg{NN;&|BdHU;byWGi3_?*;&n5G+oE%4cKG&4u*B_j(NIz`40Hs z{p89k(bU$Vx&p_0rZ?%l{S3ZmeDm8Sx_YxpcY0oC?dX>Dr+Pi6yJOld_G%I1Gs%eY zSv}(2By$hBqoPiHvaD2SC9yoPl^Av@x*gW{X;6HJ0dZ9C~1010SMa zB0MkLqdTp{(kvRStNCw0i;DQai2RgmG&PZT(re&Tcf;Fw$K)=wJ$ijeMeiohPF+Za zo;biq$TbL0Bj)S%?8U)D$D^vA;9F~lh)DBtd875e?spYW8hCus{5~_Pp4^Wfthp~uS=xrU$C9EFTe{ELsPqYpn0|5 z@C;~T5qny>$gPBpu<0I`jC#a7gkD9QB4Yclc~o~!dX=#`!XF1G{aeP1I+~QbCd)Ia z<2}K+xHC0p9l4K+cy3;hP*qjbi~r3k>TqttiH=UH=%%DPVX4SW301T-5nozLtXvD( zH3OZ_ptHLsf`b@zbTYQ)#2-JUi?JzAD#~-xmn0lFl~9g+;|Bjbsqk+Yi{EI@4R7eq zRb9F&dRBMTWt9Id{+XX(=-Jyp+oTfTVO|GWKfi+vId%>Mq&?3 zd?i^=$V5)hJ8zPLfR z3k$Ta*r#?nU-}f|^1=>9ot-tmgwC0K>mkgt5AY2K{2 zdevL(IaI0c)7?xd?Rywm9U3KigNkbF(ztxb zlbeFIM-Bwa@I+5JemHCN@q`^gj|8oCS%d6R=v(MIye?h_O&oQACU!Mm^R5d$l=b1b z(D_FAN7XdOQb7lxFVJB3ZsvFsbDVvz@Cqji4}|`AS$DsyPPkj_AjrqU+(Ng<`K0da zfNOo*-!Ho|k9Sq*%wzf*S*SdTtTGN6AO=mA^L;;;!F7V?%qAf~MLYY4m6~m$ldsf~ z^&itxyPDBE{Nx6fD&s3Uh^L%B+1aRUm-&2%@0sxtV&x2X#V>39XnR@-dJFU4uFvq! z$*_;AGmRDW?+W~y0VvI-e%-#%8rNbEAY^zH0e)s2gco( zxp^lZURGdlP9u-={$>+-yuAP&BJw!z)bQMtJI}e3r$glN0(+5%4|i6#&30k~-WNvh zNx0QD=%K37gH1;dHgnK36K~g5nzMKjcEjis2b|YsmLeEm7c^h~2VmlUATYAu~aNW9?HtoUZy(j6FHlpK@_dC(&W$1?z z&2}gwGefi8;hKH2jlA%v?v31sPUISNPo>&~%kje~esiZ|J*gQ}tQYNbz)3x;+vkl$ zN4r{cP9YZFf{u_=+^ef%;^P%R8FE&0S=%WCzBO5N1y8^;H|yT~eZBVi<8|*B=po*G zQ}>SAjJ{)Y$Qic+nz2c9>VE@I<9Fs6_(3M&%Rrea3IFUd)XDiPi=3h;rV{O zM79p}N+S>Gm44BSUTFp2dKg^?b$*{-Nqq~Q-u*)eKop*e_lITw8?_zS3XPyNA z74$c~=u&vLx|{lRB7TVAoD=ohoMnX9?&+cC>QdjUIDI>gRc5)y04N z$U1#>%~o_mTM}yb#z6PVUD`)32EPr?%oWT5Im=C>$Kt$;bC=dAbZUNRtk?6FfnVf4 zyQ8PK>j~>eYWP}YmmxRUqJx~eC+TfTqdQFp=NHp>zX4t88u$-{vz5iK&*Df`fY6(h4T9ufH+ zVn4GNd1Qz1t%Qo~V7#sksaDEwn94K0*8rW^vL_hd3BB~$KKhvU+yV_ahjsDtIhwi( z+-oE7Kh}hElp(UI;|}MJd>ZBdNQ8Zh%|4ZTqm2yo3hUxk)&=m1Hg$f*P>tM;z06Hy z80RYXRs80CU-xP32`Tc~I|`WSK_~1%*T?rF7YDlPt+ucC6`izw6zihlW$I2{Cm;t! z_7L}Ngx~)vI-LFga6MQTYeGu3QZC<;a@Va1*5v%VcyX&R*KVI}MZ{1Yg*-zU&Fk3R z8|Z$wYa*vPjnJa|p;z>Q3NZ&7nX40J&W@ljnX`?rFlQ-G`aMedxjAcZ9nTrn z7If^);l)brNex;Nq--P^i1>4gqweG1+Dw!c2TXNEGzuk_cU z(I=d?Zab>O3P>3e4)?`Etdbz+`RP1v^{&l=KX z+;sB7lJBxD?5wWRy;Dn}wO1sZ8^#m!m3_s@oKK{)>?1mp@S?>2{-JN;W!JHP7{PpM z(4>siLUfNqw6GgLT{GfQ%^9~5egz*7FM#H-h88qZC!Wn0-g_SF@J24tP3)s@_vy|l z+jM6Y_{G~;pX^^x;hjeAQLY86Lr(os@Hyel8#Fa8qp4GNfd@T#cs1)2oJRJ&@>tQ)(e-d8#Im4-!-?YtfY5O$^&K{DE;U-ei z&AL)gaE8JfN2jac)v3h>doT37vrPEo6$$lrm9Ba!psmyWeJSPee6`kfd)42a@p0K( z|J|u#9$4fC+s7Q(jXcO%f(q3jOWX-RYtn23Sb8_}uoF21{h$SJI9cQfzu&3PiiFcL zjXB5s7WqQ(PUd&f^Yq^(tkvI87Ij^B32=U!zd@F`n7-$JGO_}CG4yiCEdqn~&2Q$u zoo6C9kvBRF|38_Wths!*DXj?qHFQq9S8J*H+tJZ&ml!YTP|=sMKjTb9bVOm5p-w%k zftToAAq)Mfr90I<*voOB&e>Dg)I8Cjq6d(7JkA;9jL_kXu&>?TPnn14RAq1OHvhiY zzOl!!t>S&&S-r$;ZO7L1=}2m_r8$4;_H|6gin-{LS0Iy@Xln6h-TCfjU)SJav*^tQ z#+d@TiKxiJ_)b_7KiPZdZNtvK(;FYX%)-Wlc)Hv~Yv*&}Q{~x13=`Q=6=?OZ(L3 z?LJL+<8_u=G*eS=u9ki$$M9F!JB&xpFOjpZi0Wh>%z)naE2FCoo6iMBn)=;0L(c54 zp@UwF4(huhXYMNK(KlHe8P-@QGWjq0A3bCJ4E~>i?izh?PZN9lWJK+ImNOaT?d?w> z<9t?E4^z(k7g&!!)zqr*vW{7I3s|%D7w`@CKlwj5ocwR=>Pw%|)wtVu2i%7*2;Q0h zbJpq44HX{Ad%uu#{-~<=4Ee3*QwC>PYW_O*6+cBsg-%fL=Rq&-rT=S3G7duw=fNWl zXRg3r=X;l-13S`CUrJ-=OYXlgG-_NWbfGe-3Rgp;==X7@y4ZiE>i@x9L;vm;7|sLl zAwyiRIdgW9-$8!=IN^Nho9JnplFB_b>BPR7RHtyJ@xT!3_AX=kobIfB9l7E;zANp4 zKCOK*q>A6so!Q)Z?yMb4KYUJi@}5enlW6zJPX)Mh&Z9lICDi=?@ZVGJIZ5O@zJ>mF z)jsmy?n^i)p<}F{q&xG_ix;j;q{4p*tE#{Fx)}5ZVJH2MgepuYQo{;Nr|Msf*S*Na zrL=Q%BDL@zoL83W>eK>VodvAx25g-S;^43*tA6K~K|HGW?3;=-dtR~DRa^WorwZJD zWpvg4<2|*SzUf~^J+zHE={;GhsqhZ$6^22twn4{PZ$)A9mi_e)YTaMOCi9PC-@1P; zvpz*nD>_`U!+QT5m2-D=OPufN7J8DXx(YeIh54EJ8Z?RD4a!(7eLIJJ(s zmU&+GkIWI~+5&zTGna~yCs)167(v@s^Ui8uyi4D(cVR9XBYnMMZZa?qQ4}a^iacjxRiZCH+1*6ntFIB^NF=oznypBZ>OX+XBEHU zan1tTaEi1A-Cuol=4xa$mx(momGlOEptWrH^AzN6s!2T@_bTm^)XK!JVrq#GR{2=g!rnap!6( z)}wK*rXucgS<9mF=zURpN}AYx?c7ab_i-29l)z#;qjo2-yk*>hargCEyb~`tn`aHg z>=Rgon0>&uG!U~--kC*ALU|q{CZXJC5u=a0+0GeW8e6cBrr&ZlPbY2#dZ*KP=QQ+A zr?(8Q+gd_@4_~6Gl<2h%)`tc0GPfUWKQ@EC`ji0k(zh%Napvmx>qy;8E~Y( zZ}yJr)$L8!at=OBYrV*Umu%Z9>&ZAb{G#_f_;2jf?emY)yrWjh`hf4aAz6z~-hA%$ z=(A=+OBVWZC+$hQdYyWB7V@aKptsjMcbsnD_5yhwZXCgI)4gYD!_W8X-uZ`X z&Kpna>c;iV`>XiI-wfxJ=h!FQNc*<(tuD?0pMw^%=TXo}xw|hURZ$%J#3gzp=%+d* zj^2X%0-I;h9_W!$cJRJ?gXR?TyO=T`W<83mGm-xrp(Ty4>b6Hco;}L9brao)eK@?a zXe9Fbx7m}7=9`zH_u%x?UcUP2G+(Sa002Op*{ z6~EoL(Lb<9C`K<*&pk}L=yPXnJ@78%*L}WTz&V+B=rd>j7V6D?_A$IiUl-kq4xuQ3 z71REQw_5k+<|Dz3;uQ4&yy97Sq(#OEl-*vvjrXb|3Eit}*1yn-y{jf2FIr>_O)t6V74Y z-SkD>nL{6a;XnERdz@q3t~(EMeGxm6-+^Cn6X#q%;#`e)=5o*Hnm5XDZu$}JUCz3= zNmE~1uB$Kp47|Cz^Ux^6$C>+6)(%=qlvz;IYa7Tuj0yH5Br(l zAjgbc7w8zyS&u#(9&**S%qRM1K7D{rP>G)QVSX30e&(~M&plHQ(=W27U%PB?rp((x*yoAm*I1_z(?tq^qs6L#-v#I6>Dq_XL-d(!6U2TgRJ$5T#X}< zTek8ntK0L@p$Tm(V(%eqgmonA$EoKYW=$EKH9zdZE19S4XVn5Pk+Pr*&gIfZ*3et% zHrVU;zQq}(=yPQ4%>w^&c}JJMuAMGozgwiGEc6e~+qw5by0>1|H2dEh_G#+cBF>{J z!*~{bf{|3N)E&Nz%|?9b_3&2C;cM0e{fm4l{i`x>CB&B1DSZ?^!Txi57GI*f#7;`+ zzJEsPmbHJPvoi6)5SxD419<4bE`RaKN7emn7+cOquTq+GRg>n;dbwA0lIjHXBIs4c zCRX&n%4NTGzhbSQ0}Zza zn9GAEhAv1r#yPrexafj3OBHQGE}ajph8EAg0o}r%S=;cDUe4d&eSo|_=fO+9n{>YL zUFh(6w1>IrV&AhM#rU7X#hz+@c`{yh6+GOfzh`Muc2|99mU{3F&d%Qq`TPDk%-j6y z;Xl|p)KdnsuL}PV8a|R%DMYDboB+^oAV9U`d6Syyc^>_=S=pX zy&;v)?}Dw+jk(YsXwie;0S_8>Qg6t|iCxNX;Q6l_YR;v)GZ%g$_t<|TZ@DTCw&lexE}5FND-X&xce2`_#ElKsUM1=KqsU)a^Mj#%}>@djaiOkW>rK zho+yHR3|=19`!t6Pg3_MHRq;oL;bGPP#Tx)duzG7DyhE28kReIQTS)VdGNc`{{{B! z+`m9O9>NYxXl(uugEoDUv$uTuz2Hgzx%1Fm>c>@ZMN)n7tGsgs|AU+VQ`+;@q%$|g z{ua9LJTA{!#}6<+XR>}DNT@HI$GBYuzx-jsDLOBin&pL^RUW=P;jmipBsAlcWa^ft zusU%a{I@otb|KG%Z%d?Zc{1#*-K05>H)-n3b(-_qnR;qyOk%Ny9rhDlL&NXcMKNUl zeDb6J@;$W{yngR@&3f`ZXDxlw|NU?bpV&Oj`wBcPb_KlkPxvoB4&7!ClpoW&GN){D z9y|q_eg5VkE|(Ry(~(@RA+0p`%#>%IS(JNTJ1qA+a`1CZyot|&FDW{qzB1YlJMhdz zkJKIs@+7qt=brcae*RC1y@1yDtnd4UIh>G}#)l}tsmMJ;A3>e=Kd+7Fo*M^0*GA=@ z?-rerA6LOIr?yODN7<&?lgr!mRPcZL^&I{#^mVy!CVKImdkY_>g7|TD#E&P==4j$< zR(_s%@=4;ypIsO)yO6k>-zV;7T|V%9^kU@IyD#6khke1yYN46fH9U=fa65E(Svd9G z2ZkBh!?8)lPNm~md=H_mCFuis=N7St?uLGEV^5L&I(TP*_ifGn;}714hui?3_=@@O z|6>LC#L3G(20n4GI^H=LfARmr-n++FQC*GSGiT16lRK9oKq;kx6C(H44k5Nre?B>n z1Z}OT#i*^VRSyBHNVOWYk3w@CPPn6Vj8tot2mvqDYR3?&t<5O}@PZWuQEROlgVwed zs}ZUQ?|1E)lbmqT^m*;`{@%~0f1Jl+u(F^J3aZ7}?Z>?3B~78)ae@e*@yY{Dy{ z#GHGe1<`HmpxxY%b<=#!dVZ<2=b$&~G0m-K-Tytt=fEtT9HQhZ)b+$gYX@>Z3S$KS zY#GTO)$(AR+ORbvx;1bC`+uQ8HC92nS!Y8*D~xLcu+Z}sXmTrKe=Jyau1z)LRmFH=cgopJ$AVS)7m9%e|64`^ zTYhXha)@!$}@F8kA+5yXWN zhe`au;1oZ92V=t+d=uI@YZ?2yzsp{yrMfi~I$60?cULacktggQSVk`0e&pmm6S{gR zo36spjp5CPCN5n-oHuJpk-P)h^yQKZ*8XlawDs(e-q4oNjI)K9=B-uG6|}XbHt=(> z_9Ew^4MJYA7V7QUt)9!?H)jj6J6qd;?;sApvnPCTj+($bTcN9M(ABmkV)OBztX!bh zD=K9 zYU~jp4q`cHI&%Hthke}J(FYTr?j^3m_pljz{w>Cf_RW3?y;0kXjykM2GA&jzT(@!y zHEUTR@uAH5i_z2PqlYdnV!k&NJ14yYe?b4pOGjkosC3jB zg`5oNUB<$Gy`6RInE~#W=;<=pV5K z`-I)<1;V##e`rMn9-XrlUS5ujc@nwPg3Vl`=6zolBadqL^|78cm}l!%T$)$I+-C}J z))mI*la_tW6R#h%CPL<2tt;)UFFIVJe$40;0Y9GcrTVN=6&c&)+*@x`S+(w_)Nx9Hw zond!WOYY}U_{@X0$b2JhpMwf~}m7*cW`G+27qYh;LemF&oJh zS--m~xC)--ze#(!wsjtIcNeoKn7Ja=S?TTT0B3w7c~w#^_@4PL#eHWR*IjCVyPGmY z(s$Q{E@w1Pv}>-FT+YKPM7O%Rj&_=RC1%oy>4tkYviWM(Tt~zW7oR@+Fp1T1WDhs< zl*9b=9`fc54LM}ED;E;O11&M;_Ql|dImWw$@mwAymiBtRA_{GEt|C5C>A0G`?^T5# z(Pi9~b-K0x?|l?a>|x!oqXT_n9dmz#@^+Cgr%mt&jc7wue-#c!e&V>v;H7;|^IOyv zbJ#11oMlhuV4ZWbp>=3u&RxXOaNTzocx?h7^qa9(`_wzZ&$IjoKk95#+G)?&hK@)d zh`;ez3lHcAx~wdueD+19;RDLAH*-G0@}W=S*x`4(=5oEgzxk?fk5&Cy$%a)zkL2sV zvx(g3CTDW+yNlmF;``Eyow6jjok2{cIatnXvKe<<`ns!L^;Pj0G$gi?dWGW3#|*Bm}v=El~5 z+f}B-(-#`0$wCL)mifNW8J#XL#v}`zG4TTSqZK$~)A}N}l?q_-|gr)+vyj^?C2xlO93`#kRR_16M5~Hc;Xk>>YBCB(Awm)}hc*awCc9 z_+(N)(Cx@|ac|NSzCH9lYoT-Q;cPb62uJWM;Wq(&nf-RycjU+9#~Qe--6^~743(eq zOIG0u>XB!1eoP@}mMeSji|F6jfqV7D^lHw%|M)U(vmuU*p&#f#?5Xg}X`P6EkF96w zPIWrRn4;%8Q#d=~R7s@q8arVq{>0D$`o)L@Z z`8p}O>mKn>YM;U;h*--^@VHlRzr1>%b2599PZ`geA$umLe4BN@(=_Ll%h1E-`a1Qi z(3!-z4@&7Sef1K9^u&x8@Xe-_ooN~UqQ=SSaOl-aS07xD4m?eBrlQ-Pp3t1ruOzR; zNt)X*G-VwRD;MJu8<>xObBGO`rC z8hzqb)}Ip7S?9#JF!g-um`WY9HDfY!G)z2v_RBJFzpFc^591yCfF@7SjHxGz zPN(K;RiEhL({E?r3;kK13hL~a<8{2QWUc)=w!xkR@*CgcOv*atd~#(>rOmVH6ZIWS z_x~^IJc&9_3hKJXnGvC-o z9O5;^NTO>9%=yeS0yB?$V8k{NeNX8-(-sCWK{@mMa+EB-cpG~XDCZgMA5|B+gR1Ks zzb?@wUf;^^YU&DL&JSSb`7n~J#Gbj8A283<2jwu{s+_a^a`3^B(}&+2&9_l%X)}G9 z_g)_xyTki?waPEz>jKrt)i&MzdcCrb?2bD%@B4F@6PZ5-*5gk&+xI1vUC3E3{Y=?I z0Y7rK{0?l;SL8fr&Srt0bCO{zl`nHRJcNxQ`{vOtT=v1OERnp)b@MH9FS$!i)+^$n zM150{UEZK`R#K6j!be?Rt4p2?u`xWehP?}1!>cO2*B;a=a<#g|_iqa)Hiw60=d6;v zMv@mO;QMcomv*RCNFB=mli}ma{jS(etO+Lma+PJLu8JcU26^>AAjb1--Oj0o_tV7L z;WMhoMqaIJJx(B-XCTmjn5>Ik3 zZNRRI6bipb=r3_CReF1Yxi?!TvyQedF(rRMB9fn#Cy{b{l-+tNW%rk|g&*B~=`(m$ zG-i(!Ah_B%a{0G6OpAi>9J9hMQ@;OQVxApGEFjH&%D9ut9#lOZsu6lKE}2H`4dtP8n>aka;o&>YcXP>VC&r6WQ-7 zf6M&!Kl1Nd74-#f%RqE1a%mKh*I@)_zhJ|3pQCu=r7<}ZzeUEc?L6XnjQ+%?qyV9#;`U#<97sUP3RWPEDV@u^)E_|t-R25_E&8vtAwxKiLI z9v$u?)jr@h1NRzm?;aiQQh~b(xcR`X0q()0!r2M&{kG=x#!up=@Nvk#L!W*(9@Ccr z&P7L-Ib3`h8Q-sSTpT}!jvoVG#t3{FWAXXM^uXuap?R~~7=P>%@%b*s=Uak2oS+-A zvVKNl&fU;s#`hZzxu065Sv!|Vd+_}}+U@)O;8c9SXX5+4ko>U!_WerUt=Rw9zF(hS z8jeLTpS17SdT|kPCrh#2Cgb~ELQWCrWF@(*GQQu2rCGk;UuM%)x9|6onfMYbbm$A; zZ#R93j%ZI${oD8ZiTZw7V}J97z~{Hr_x;X0O?S^P@O{7UT&Kx-<4PYSH;i@YK)3I= z{Rj9ew;#p#t9`aNGR^nrGN0j}^?kq^YkNt2x#Ig>fe*I;KX5L#miThf4VK{htyJ^= z#o~8#SqHZ8`MS9RM{HDSoHz#NB+ejqHQ(=REu#EozMuG5JfP+uk(vJ^|F4g~_Wt;P zE6Tt`}~pq-_aTW?D@t^61Jf9rbsf63ST$@+imqAIsd%^AJ(|Kj_#%({Zu zT}@&~|Id8D(ZYZGfV0-!J_#SN*xAYloX=je=|4li5Fcq(uZ+mZ9||32>9ME?-~@7=xh|6gU1qxU}XVUo){f!_+WE~T4D5+257dj;fLaDaSOx`n~@3HKiEG##P+pg{MOn+XAFMe z(fEPie<*6n{@EuB2lQxz^4H>{^ySiC$(<){u+6jLwuyXHzGZx^zI?hNR+=PUu@PTw zQq}_v-#=U{{^7TJ`iH;MBz{r~l$grC;;@2*n5*y;bocfNmDeOGy*E8vf>YX+NAMQW!vk~VB{(^n?od0Xa#>H8eIMc-UZQ=trd2jNbJrRwj6=rYa zLe{)Dws7u%t2ufsa_yySp~D6|vR+=}9`)k4g|)%!U2C>mC4oRX6dKeUB?;)c0$ zZx=L&$c4v#@RV*ZO%Yq(6tc<(hTLZS!=2>&37dKN=)XvLm9~@>iVituS>)dKDky6K z>s=VcxZn7U^a5X;MT4;;s=Kw3Q6jA!u zypH|0tcRzfb?y?g)ocC$82q;dorij~aVY1Pn~{U${p8yX!1MmuUAjdcZ)a8oZ{o&i*eRRL`!MTr>RCbJ=4gm-ID3~k zF8^6h;+9;uoT#o5*0}blb$Q7vW?y}dtiN-n!a#g#e8b*v$vM)sE>9i_ z@_88KXwltz^3ZFowp$P(rY^!hS;k@#zsR%X#N5JOSaMd$xX6F@OLynrCP#W!{%yO3 z|BsWSq_$IMxRE@yT7d|!9JbDS=5FXT5(OMHvuYykhd&R2xBN4T zFWYm>r&`P}K4e9w0x13KHdcE?j;FHIDl@c9H@_=NcfzNoZh940;G>+toA zx8$5Rcd7Pd^3Hpams!)@pyF~|GeYhsp=n}5$aU#TPFqv*bg-_;GkZfVXSdY)`PtaB zZdb^EXmmk}yl(JV#UA*Qd-&2`z|xKB z{C|U-LN(;Bdyf1E(Dg>{Biu_JMh$tso?+kn#k>Q)f_DaG)l)`2FdGMwj|={Y4r1?N z0$IP0{qy`5&_?p1*&B0sE@hUphmfD-4wJI%a`r0`zu;7nkB(>LoVC3w|NTP#7jbVC zv4@!WffKF)9yo{R3n_zKTK0*9*}wQSKVlHrpPZNv-#x-l_6C0ezP+Bf60d=MzauFJ zJ~tc4nXsBM;JUmGy^4KC#9PW-aBSK1Hu5KpY(hSjy&|$n)*kfOxHNg_8-3ZtnO4lF z@D4s>kx4g-E>bxY8H7Hklgl$sJ{BE$l+>N$(kg~bWR%Endk%QVL7Ch}@|`ob5=(Q6ddeqs#a1PsCUIu$*PM}$f!D>vV!-cR^69HQ z%ga0qxth6$ZyzD2V$nhL@4M&^I=i=y`(KbFl)6L~pHPE5F2=?b9jk-B z@LM>Da}D;ZdeQxeqvChC?x^H(T4HR_6(2xXL?%yoMag5})tM=BZXIzs$mJw*IT^_1 z)8NQcnBr>TK5!WS(!ot@QWE z&KLjJ<#(R>H1SN&bj$BMewQV`-(>&ifY`X?0QPqdh>aRv%>K{fSZTbN{h!6Lk_(I3 z|7r2w;=RR~Sj2H!BEy|EDRi>4G;80x(CEub|FKq%#GYb4LT9rUw;A4-h>s<=TjKf` z3hd^y+4pM}xVbuc+xmtr`~xoY$jTCB1JAAK$i2ieYiBU7T1E5BhuJUjMvVA~iq6?z zw#<u3v_hhI%mezvd^>u`(O*UX9ITbf3VjpN<2`p){=wHu`p+^U0aNOyny`- zo!IJwiIrFY+{668i}Oy5)Rnwa6eMoc4D zZ|HIQSxi3W4~*_HsH?H6mhk^_E%9cPYQOkSB(^BP#}|niEaGhBtZynWQfK6tjs4Xb zIqJGd@@w~xg@;?#u0{H4gLk`f^_aTyF2uXg@s^JtDNp&y(Yx4pJYjgDJnvbr_628r zl5<_ydc4ECcsW0RaSkBoex(*4i;kO9+F@Tj@6Crbey9;~%S=Q1y zH_h5jyvaH2JA95khv%~A@M+H2)0=hcnPpl`uhFb$3iZ`mjTY0Ywbe!wF`_&-sx|lP zJP%cK?rAak#2d)Bvs8N_ms5%})Oa2>x$-<>>aj?twmP?#F zav87P`TFXdPA!(xp{>rZA?Gm9^Ra=>;dx$%7R%eEtu8EQJQr!P!d=AL=jy8qc4@JK zHf?nuXyn=XTC7i-=I#vZtBV@6SWz=FayWZ18#(uBcrG*-Rkofcv{>008*`S5e{@RH z#ps*G;H%getrw$j4nW@=;Eah6K;InTj7?hxe2%_p8RK=!8K3TN>H0vCZNA@XONj+; zp_kCg3sl)(=KY`WO%05dCI{ks8c6+v@J$uR#vwn(AU{SSKgzB^o+OKpEi=mT;n!kQ zyk3bsj@l1*gxtjoMtaTUW66KmmmdYc&$F9n=!v0b9`Xa9!4dM~i_9nRqpnqqteOdJ zf8LiP+y4gtZ&Y%mZ{dDLj$)1b+ zi1mIT9~M`Un?lOJLU(_1srYll%Kv(X@|FJ5U6RlF*__94Q~p6;W~e+f$c(df?C_(= zjMgDtGDFF~%KsD7RzzYw_jKoAb09zJB7yw)599}XYN7j6lfLX|XwbYrwc#6Uz$Qnq zma*=1Gcx27=w-wMePbo*zQ)K!y!#4sA~GsB$sU8oBF-f%ij7GZ+2#+FTo9SyntKg5 z9FHchf7q7|Te4+CYs_j3WWyej4e>t8f9d!CZg{qDPr1-q67c?jfcLp7-X8$(7ppU} z^u__|j4XBKj4Z8jKun7l`(-EliqA4u67R!4PyDDo>bukBzZI#}RUEXBztP8*0onp$ ziPagv@J2*@Apt(iVx_}#IiH@r7K(4!Yk{oO)O?hVjhPPL5Fc8S9%w+{@XbK@W*~f1 z4Br&PH^uNxF?=%sz8L^73_3Qi)aA;%qn!6U=J4}=)w$EfBLkkR|4(wdGIpG^Kn@DG zeoCd}Jao!T;+Rcjb3_|-r8@6nF!lF{^_6qcW$tBc!m7`$LaVJ$8&%10qOVDOcG85F zOl(-wDbu07Mx}2VoQK7Eeb5ZHX<0e~y@;)gU-{J_=v%A{BGu4JL{={&M+yu0N_R#JU zeiL+w4-Dg5lsJ9f^JBj)?Srm^Hr}ts^^C+Yvp3%{k7R#Wd78wdQ(lNB=Nrq433VjJ%@giqysG4i#7U-t4e7O)q-AT}ah5G&bH!22lg$+ZxV@?PY39(3Ez+4`%=Cy+mUCP z>}@giT*f{e(EGlM&TDv{`bBKans7z&)=taZ<;6yEU-j*0xIZCQCeLqZ_&Hbp2U$%~7#&$x-N%qu{yG=$fNrrSZ||nxixHng~ZtyZjCDnT0LRsB;%#W0`w7 zH>gdmQN%{A&^RjuUzCP?+`&7&WThswUHKF^DZ#f%u3l}F-Ha}-nFq4q?IaSK(dZs;ZnQwoZXV7S-UzOWbzf_&c;$Tch@C^A)U5bY5zDQktkfho!JCiUy3NpLA83?$a=74$`3Jo36`P>) zg4meJ%nK7`&lY9v$QrZCyNr=~3G@AH@OBBjT>@`|JLcOl%(tV`{ID6y9z=d_MmC0# zi^Qdtq(>X2$2~`Sg;;h?#~Zf zCRS9~tRXD;qHErdp7i!-{e2>pzxoK+6MDkd{gQfLf>&vKl5t)#%k(06VhB7pBsPNg zB|C;#=J7*?ezW?!Q1w^gP#@y+dFvbCRBY11Kn`%el^)IFdu&rZm;NwcC7ElW+fmSM z8FX8^qlo@8pJ9KI8;JLuIm`PJ-cMjY8^>8pl7z@$6b6sw4p!Wb0)W*&-ZzJ z&pdZT`FXt0<30OHljN@HSw3YClRD^Uru-i%z8}zlF5gvmxSQ{_g-7RmZ4dtC9G~x1 zd71e!1)X!IE_yij6m;p^QHt+d;RB!Vos#r$qcl0(ffwM{;qYq-{8|FPmRPzzLip9F zT2UCwX^b3$H^1!jn;!Lfv+nvJE})yg&rtT&jMaK$kk6~_aQ^-ezl`HcR@N!lc^?7$ zrJk^L*V0ZmR@QG;tTZ_*He$uBSjq6qViS(PG&U}NDR$eXu~8RZirsc8@7d?I;?h`2 zY<-ecP{Lhd(Nds*;i$o5_ce2w@I>t7)6?R%^z?PP6oH~vxl zKY8Ea9Pkl(;#M={HY~P1Hw-Yw-7%xv3iT%8}x4A;12Qwf4m_fA`#b z2L5M(|5@OF7Wkh9{x1dpmxBLGjj{Tr&e-%N#<=7q&bas`#(4b_XMFm*^!G9umzG@C zLl@;TB{@6qs@?Y!kZFq=wKNM=eEm9(T-PqT6sC`cZvagY~ig4Cm#X7#> z$Gq#JM+9=C6+euZ~XQ7dOSvDtb(R z+4GO>m%+nEgY)bHJYU9OMD%jmJ<`^)ID;uFm1vG@wzaB`~J!!V9EGuC#B+_S0mjC(RB zeOTF7cu1?V>Ibl1$iCRc?;o9YHS@-H|_`PdJ=E+5#&0?HRU$S(iys{Fp@xyG3IRQP5pV|zMdd%7_$e!4SSKiwId zp6ZNCPUTynt*meB-csN8H_w89i05Met(-$XE{+XzJUPLJ=SrEBLAidJ&iMH0#(2sc zN10<)nK?bnto)NIbFev;d17j8Tw_?_iSxvn`%aIQHj2G^I(^|9Kb^UOtA2WHf_e`= z<(izzyvQ6F#>VN<-gZ^?5c3pOHg=RMyG*W>U824{ojS2GDVwv`RoR@=&ikp<4IE{U zfQKjOL$Nc5VrLGGjpA3vuaw^iekJ-)=2y{YWG*ItMcJF*jg_vzW=)#P?)>=g8LJ-O z*Px@~|JKnT^gN3*%YFK5z09c6hZ09v=|+>ojHa!+)3ksy6;6iE@E=E$Gh-8=k#Rz2 zTj90c(Bf9;aDfI4=Qc*sLwR4y`w_e^K~6`L=pn={jXW7zUVx8*=i?fuBloArO42j1 zyJzrT=e^E*o%ihLY@ES*z>L@^-jCTa!!?sN^gWD!d#cDspRelrfKS$K8ov%c2zfPGEs~}x&;bRkhEZ|qh8QoFoh{X0O9&RPy z9R9|Vwp8gX{6Q^Fe>gX+U zO_Q&Y>sb5{6R!9ad}JX1KV^(d8?iCTPdO!V^4s+r?2Oh;^y*I=W77C5;-7Xtmn4So z?N2+Uar`YShB&b#zKtt}I4bYsj!zpC;^>*_PaB_0;}3Y{)5!50yJkEwGnc9UF%RU} z9mHSM5Gz4{c^|RKDdBZ&@&7YVfMfKyINvoh);juLlDrdbnfGD4<3{rAkW1G8K4f=H zrhM|+%K!e7vxuA&HRO@--^+Y)S|Ah8!@d^(J@c06?)u=szFYwRm1EBjaZ2?`#_0GY zp=ag{(M2cu<5u}szL94J@1_Rh`xl`l$~zOd&j#bmde!jLz~$GV8T>enXDga2kt;Mc zq46w3Xlk5Xp{X(Iz0i=n7aHUm7vIs@lzUDLJ3#b{SSdd>CvhFaZydh~VizhoBD(G9 zp#E36kI_~|cmA`wSDeyxF6HL7-?#=JNj%q|_fjXWyjJTvLY^Vca9YFu<2xf-Y?Z`wQP0h0=zDulfAjEqIG+*xz&n|`>dZI5 zWzV_apFh9I_j|xk9K3ylu?u8i-KPTm)Nyq zxP#c}$ZF9yq19+TbSrg8PKvhEkVitl&==QGUFP}JmPxdsKH^oJfS({|+t*qK^MB#O zXRXK?%mI~*^O-?=>bB7yoq9sj9gu0-B%-t1~}W)C%f(L0(cAGb)c6X(QcLB zS&fA@D7(H4t|e9=#T3Z$1*PQ0py>?nq_n9rw zoV)Piv;2OxN;~?xQQ~BUKf3T@R`)FLf=qemw+vLY`&>}oxBc>-JKu^t1>WkUy!-%f zO-JI*sqcxKwsZaV&G?32-ZpHWRg_UVD8S7bN8;wB>p#B#HwNwPV0>lGX6=PRdxQQD zzQ~HS(%#Fnc&&9sW{hVFul1ml^0SW|L&05ZK|lxJvLY{ckJB_o_gDMxI?tB6GGz}^ z?~FO!_!e4i+vxM}R@$X_P7mbKp3HaBrhu-u_n>RPyes^=8j$&i*LBkOdiJF)ab#aa z?tC8kmDGcrM&Hk_*F^_N40(1OJoq-U6kk-b2%iMLr{Va?h#43cFN}>jvoJR5LUNa1 zLGJP-xy$jtlr$1g@Bq2X8zW9Da(R2PW^5m+IZu>p#uHVV^LVvpJYJ(YkJW0%V=2vf zv_Uf-ZPJ|0&6=^fO>=&?OEZ4gp*c@>YQ~e~L)%oWtK7T4Em!$^Ro>pMH7XCZvn53? zmj>NvYa)iUF%m247ct1syt?RtsI$FIkM(JcI<31n*L+3Pd7?v)X~|sUiB94SuE=#B zH_=b9q4W!LjmL}8Q7(+G*3Zm!9vg|Ca%MCZisu@Sm80v#qpL&5=Q@v8g<>VxS;p{O zjX-$Jktp{+tZ24!@o2{4PcLZ<{gmm0aU@4V3?ix!T;3 z>pa;+`8&*5B%NzK*-ZIqb9Lm39A{G-IjG@bHuH`UB}oK`?>OX)jprvWxEHv4`QLfSAg^HJRsN^^ z|Hv5Dp8CT7&6@BQXS!6j)I9wgc<~KY9`(2X{qFsCb9bAh?)Izh*>9KM)7?($ZGVqv z&E3zW?)Izh1@7K%IO=czJI|WCpLyo`O1pf$W>pdAi;m|u6Gvn=Yb#$CTxoYJ-z{xS z3~L^Pjued*HHz&JS*@# z|B?4$;(_FSnD`)h58bNw2C+l(-iVp%y|G$dp|6N~ACmLYcpr*I)q7}Dt~zw7{zq4< zYg(O|wmO%!{k&w(>b%C>SpEa(=t*^M8ujWi&PC%pVr%4@*5tf2-V=M%h;JgGn==$H ze&7(ZWt0VUQ|8kRHe^KdwI!}v8?npRcH!C?5AE#XS!!)h+L3kH5i9h>Yd_=N&w9|0 zGfsy-*6@6dq90>?JU{W;dj7AkbfF*CJ0hHa*n>u-p7w)l8Plw~gF4#x{_K6b`Dfj2 zqWt#1ui@F6u4ht5``-0DTd$tELieS~eAZey|1`~By&aq}^=rx5<<_hx=bw zy3Op*K*v(&>rSfY`(41X-@$CI4Cp82vL+|%Rf!v$z-t_P@owzUuP8gx>$n7)vR2*O zH7WAMq4yAP?tfdERDS*bW|;3-BiEyL2XYzO^E#S??{DJ!rp)(R*Y{7UHM+U#`-u2H z`|@2f8e7HpCFvsiSLBq&i;U5Fkuy472%i@^W8#JIZ=o|bT>zgJIOF04#(2HJ8K2H) z&Qba!bU{1f*oxRer6chxl(Pm{g{-f})~vzqti_L!GJwH<&>WIBV>59TJR)01A-l#j zAU_+BZ%xR*6l>++bMGJDqmIs4SwGh8@f(g&9T9wsA*X46i1#7hQ%56p@xGMzBX&q!#8LB!#!7XSQw%$m^|5%)%9joJy|P*4 zfUE_rR5)y%sm6~nhHoQ@o7)CbAMKf+-5%x!iO+?1#_SMZ=i%+arsh3%5A9)m8X?afh zjUnLhZHd420ooB}j2iild8P@!D={Us9sk&7@eN=LA}=No&r-to;*-J$E3$z(iLrbD z|A;PdtbwI{*)U3;C9$=jfwD%{j^g-hh{YI@Mpk6wvF;vl$~iIks5G_42M zXMI@{JFkuy0FnJ`geLQ#$vkLMa?R$;To42W4uB+xDP$D%-=i8I^8!(r(ICcAIanDSaHx0&F~~ul@bD{XN^3HruZ|98QlM2^Wv_C=YpS*Edzl9HMv+onQ7Bs5#i@ z!Ov%SkU1`txV0^8&~9jxn4h%i5En%J4g5zu!5HX%)K1zLCuT?|W+)xzJ#kRHFXjCR z-j|R&G1zm&*s8rm=xrgN*6M2m8~$42CqiyS#}AjGH4VP2(#7}S&WW&whYdd`5=smq z_RRN792#_z*c`^T;QBktSH217IOqo2bW|pGk7Y-sP@!gAjn~d*1Opfq-4#w8)n zl6I*!-CXmX>^8+p8%vlAuq_@aiIt>F)VwjFk@XONUWDd`F&D^M!Z79no+JOu>o-VN+8j}1FQwHH`onWuag z*dH7lwnViT*j!*o1N+5e!%k@Y0`foPf@?d~5O05@fpzh;t?~-s>s7hY_bNLeQ87|@ zwr#gv&?s|^Z5*dhbdHNpG)5&SI-}APoe_GuQx-30o+!7TNof_tDROSyUi->T#JzXaaCYbd&YA>f8v8s1=E|-986boBKl5sJmW)OIY`>fU<{ck~ z{U9oLw)gr>%2^ncvoI)Un_muRW=IZh`{Ik)-w?n&6TrOV!>Dr-$oK8NAu!hmbzL8{ z`L}+XIk(7r_50-Jxd<5ae$}t~0ERs*a&`@Qb0r72w`T_JNd@ik`)c zExWJ@yF_d#_Ry5KX`**HWlxZga)aR&VuxT~NiGSY6R&)iCi;g{MqbQ(bP)D+i2a@Y z-k!9I|L81bU(>BHx_0>h{x?;6`J8z_aw+jHkF%HWa$R8TJbVqKpP&rR&@8XiMJMob z%c&E8K*!yhRi4q)D}SbBw#bv)nx?Rsh zUYW>w1QUHgY} zoUahK*7lEVdu^#DF|b2TXh7!gFC9wUzUXqsw2<#|0{<7Zkhb|B@J{Pcqbgk<)9`-{ zNL?;63%$79fd8DbG`d9NK;}x~q|)r|*)fp!6L~+8_pBqPZRXB_%$w{TOb@{R8xWLD zOmaLN=oc^gdPmjRo_a^+bM%LpB=&kl(!+e%%I90E)LK$qwyuJ&IU2;>;+K%NrwhBE zY54EbCD}B~yW9X??6NVy+uhH!XvLRU^UBM+ERYL7k#xaR2=_B812ZHam9r>>E{ouQ&j(k_QKlpCi~k?*w5;JZCXzN>sE`0lME-_^YxeAjv8yVk!2-+g%GJMFFDyYP|kD*qCES8(LJ zx;L|Fq=h*dne`KqS=iWL4#xkD0OmXLeE_q&Cyd5gbx)bc_tym9zeX(m57`GXwkLgc zy?-^k4cO7}r`StMPuKzN4TAPctVjv#q0nHoL~9u&_Q2Md7k!&`*AjF*<*Tx@%Yi2b z`8-~?;qbNv@HfeG|Gssn;`#n&S%611-aXq}X$Jk-{c-wgA{6MQ0|LEtb_20_H$3Zz zuVht|tc#V1KAN~~{iuKIqv)<98byEpm+Pa6mm7+qrK9Pi!~+~Avk$k=4wu=7*=NV3 zn|l0LzMts^bzYnJt5)61-bzhluOv1t`fo{ko`Fs5l*Z@bPo3wCPR}*QB=ZsHF-0=^^$7Q8XJ&Y$ablSQ;wklut5d9-2cI#n&unezw zqR$Cm3C}5?V(Y#D_EMoyWkV@Hfp&55{1W&x@vthCp*3%m4zJju1x!k&ND z=x+7eh-)f)Ag`q@{(-xo`B`u4ds@ZoxtFxO^s9GT{_yg76=UXEEgziT)bi!ee5d8T z*~C4U|i;1=^DuY z`mzcu_3-uRRs~k-wjKDGx!yh~Hm0$_UD7nIqWm-8L0|tK{)U2zT~9p0{PRStv@z^1 z&qLn4UFi175g(+ia}qbaq99f}oV_k#@sHB(e);a=5I(XCSx4w+;wvNe@IrjxJ91-V zj?ayayF$+93VRzZ!+q`qa^Y*wc?&t$K4%zXM}D57y;}QgC!Q=ZFm99>rzH{1xcd}n zTGQLFd;Y(iH4C-&13N2YWpC#iYqn|a|Go1>@RjTQJV$Te|Hm&IKR-oRuyg+SrPzpc zu5;f)z5U&nPB8A{aiX*S6v1z_eea83aMmxx_rm?b7biID zx8bYd{=kdlfQM$dfB(fXz_Z57{r(q60Z;$AfA7UIY`lnZ*EagDN87*uT&a7@7qOEj z>CRob(Cb$;Z_yCVdk7x~Yji`=4n8_T#KqI=uEquA3D1f7R@*pP^4C zc^IOUlfzlZ1BBo55{$c)kAblFKX4+x&OU+j^JgjMEFfrK~sJaJ6p#3fQ_EbnkZ;X!aB2DgMa~ zn)Pk)@aKDV>$Cr<*?sn4!=0`fpX;N!oaHNLTide^P$o2W!yC{9bu8@9Z=vq>`JrzA znlt5=-KBdcf2eue?w}v^`;HvlyXZT}u`~1Bl~LW@$^X|@YW5AZ;rjlXS8)gJmA2uF zIpv4sBN(JvFVgOp$!oFO@4xr@e$J#jQS*wPrT?4~cu}{P z%+kHDU8~tAeT_39mNNDZXR@6{e&Z9#)wV@9#!&BsBF%kqsX8yjPPmj!{mZw3i(%Xs z>t0R`brVl~Vw?Z`lzF;0b(e0v0Dt_19C2@+%9wKhQW1E5jy5jQ?R?gce|3%S70`}N zvovqhHJUrj(yZUV!?_rHJai`*&vNW$fL0-jk;lsuBFJDtR z@E#_w(&9_V^*DokP0z3|=>_O~3Os+MZufZ;9ykwKa5}jEI9kNh!&%^Kb z=l|B7G3ls#>z63^Y~5J@Rn57FJi6yDRA-OcGo#1={9`%O{JePe)KO1;dEj_s9`Eq= zm+Z*1x6Pm*U)8N|<{(E5-M-{hc$)iZ+~c#e`@F$i%Q%F-3GM5J_6dFXmbPr&18=-i zXbT#1LQSwTGx9ooU%z2CJLhxn_ zIixx@mA`KRd|KYZ+8go$*(m(!{nv4f(_r0O`Xlm4!I#b~%|0D`ZrzV8ga=;0C;46c z$Ya>YIpj^{o;47s9mH17uJr{#y_ zBH53e`5SU^ANjJPfm}rXPNpBZCs0N@?Bxt#4#|Zck=MU{j`8~eGPGiKqbF!2a)=Xn($QqDfUp{!FlNAt(vfw{u|+qvYO zfgZ@c?Ed%!l}F6E^Atr7-uF0zK9)A^BJwJRIA?NQj>rbn&Z#A?;x7D~can1wd~BqC zQ|5?to_z{5v3aHDjMq)Ca3kf$O>d##qcFe+G`orV!G{%`8)>k2AtM)@34vV5!iUHl zd-+!KkC9W%gf61h;2OE$J<8eMGoiKHp$l@SKLaj?K?^mr8AtA+3&|bqEo)((Y|Qg= zigo)T@UZw4-9F`;$W_|We=z=P@bKr0;LZJNj__X2(P>kTRa6vaJagTJ`wuZ!MqI~& z?&D#6`C;%vJVL+R#O*n65?dP0=yq1>r@roH-Wup`_fE4?LzUj<>v+w+j)(pyx}Ov1 zXGWmADSa-`-$bty9Zqz+jQ(aV%+c&A-`3rQ5n_wcU8d~Tye%_$1|J`X=qlL??edHm zLt|t-&z=JROo_<7;k7kEJM8Nz+lpSO7kX8{5}gs4V)US-VNZFMGUI$J`ZI9s4{}B# z+uMH0vw6BvmgFja>a=E8wZUWS&@);nL)Yyp=8ciagev^g#87!{_XCIC1bnQdg&4wh z5@)YFBa@WZBrpMNnsU)Ys_=D}p<4)iDez?iA1|=0I;Gq^uj-fbKIGRQ52^Y`twSel z5x7FT?dQNH>C-FIMp^&=0!3-erH&w!bpJ^v5>tPuu#_HcQs@RjvUQ9~1X;tvsdj)w2c| z&z1dGu9?hbPm}m2!+v~Q-R<}XiA&Y-U8sDrs}yXJDKQa;!M6Uy`pTy?i!(m9*yq z&a7_6kNK40?P}88&SH&o$2kLXq~`k)%ok*>%ODQMHP57->7tcqsJI^DOmuPu@EfBS zS?Krpt7LyvDCqAEF%28FB;6mr>&;;9ZI^nH-&;-H*fvskh(Y()lz>N1 zbXk|RUkmB>rE8>pz*PZP16=J9aNg_Ka&M~k0ha=<3ApB?!@a872V5I)9lEorvnQO3 zzW+Kp>fZ#eI7ItGv@hgrDi8H&pTNCl@Kfyrt_rvs;A)SAqde~o)jnWSz%+#j@>_@bU1X*f@o8-97UFdmR5)KJzazDC_f)TPqB^YL3jwx~vD=W|Qs~;ajS%W=#0c znk;#+b+>wk?tXeLc}^dOcdiI|r?M9RIBU^M@j)!PPIq4%i(U0+&HM9D@MonBZ^`34 zOX${5SF>;Qr`U7N*!b-KEPMj{>ZiK(hoRW>2e9YY3q0jKfz4Y(olVr)q}$txDL;+x z3OAvT{!DkjeVT54W;?v{Yu)|BrPOsVbv>-(mt#$xSmN#1>E8CA;TL!qzrlmRKZxyr zmS#`q{tvULYdv-SiuY?YPs-iC3>{SB+na$+1@tHPmr>8pR6Vv?t9z%dk#aTH!Jb)y z&9>xW%KHiRU#seOzdfCLh<~OYZ^=)9PtlgSx*O_4pZLmaesW)P?0$Mn zKA<1c$4}G84?ePw-qLYF|JKt#>}BwK?EZZw=-*H2-`t-4>mcu_>ff*Eqm1FZ!5Cge z|8Dxo{wcfvBgW9nZ`R!H9~|=L{#v&?muTK);NAREni?76oTf5-L%hwKlz|BzUXzk-kX zi@*mo7G9%UU1Kiy_#}qiN8R^jive3qMXF7=z>PhZ`wzj5 zw6*9l={tU!`)J?ov=4bo`>ZaWy_feqKkXoO-m7pU-&uXAufP?afNumRLuuoI-r*;l zjh~yKnX90gUf^d5KA|rBoC(c}e(l{u-d`H{4nJnmdP zZ}OvGsru`_cqMIeRh!&z%?@~-@*Rh7sOvAZ^$BFe{P~RYRrFW--#c8m3vVffw%2n;p;yyd*Rtu-5{6U=!<0!Yd24 zmd8JRgS+JM?cMZp7WjcLkA@$iu>-D-eAm2L=uGgBwJ4i^s=!g((QzbvcO883VXgYs zF50HMQO2e>v?IKC0N$9pTz%{2MW7#a&n{jn23MU&$CdElb+_|vv)^XpO3l@nTe|2d z2EN*lK}X>0I_mupe9>RwE6Km!jjI9R>fK)A>Nofi&;h&ns}@`}^a@w85f?&F*)nH2 zT>s3pY*Rrlwc8aj%E}9H0MW9&%sI@ErF?$mPRmD7>^AH|I?TH=DuD zRq$#J^*2#J{4ev=snG48k^84!g?{?5)>3fR-R`o#>=fNpXvqD2hJNHe0S&KKJg?@e z$Kkb0`R;Mb;w&S(=n;h<_q<`y%|Ym99`#M9?lr1zHCLSqkNp|ha4Pc}cySBFPH2|- z2-s%YR;}9R{=SBBX<}R`Tjr|AY3HTLms9yx$s`Y1gY5bJG}`1HTMj9ibtOD?1NeAQ z>8tK}YiQH-kH-gkMK>N&v?rz7^U-*Cf|%(7?MVsbBO<2Rf`C~_r37vb^tvYYk zaXD)}8D42)y|Pi+`>|1ty1NJ+A%$%PE@W?y-LV=!2DUqPi(B19TWe@*GydMjkhRO_ z8G(tB3xGANkk!W83~L**57;hlOaA$X=z_j33tuSxjrqi}SPM-1{e3Iw?|jyd#I95QokxFf zXFTZd&YFPdQoMUovo>e+-sS9#CJrRRTu81I>#VbNYv2aXqvC$2-#@P%{W!9RZ{9g% zPX~T-z2<4h>23}(tZo&ux{i30iO||k_-+9Av#Iw!>K!Jy*W60v*98MLuW|rus1Fmr zlTZJf_!VpJQ^mBa6I$c`j2YBTJ7xeY_^AXB7w}DMG2?o*<}N``a8~oP_|5_k??40G zpD{gY^fKSHTKL!F;BYIli}n-^1NIT0256i6R0b!-3MXzWa_D7?cGB+p zM+2O&*YS*-Y1bUpF88SnPAr8lw-q^g!7#oV7|dDVJ}fx6i8fu;3w+3YmBB?Spofpf zg_RGl8Zx(La4`*Bcpr-k(U&ZxFJ*8s0bIPL#_6MQVJ$+htbZ&EA7$WU&&T6K%~KhC zOb%qxk@S(V@!Trtq-KNWRXr&3p$ET-uTW@1-rJE{&1!>wYtbPu2mWRDt2p1+Dt4Xr zEz7Lx-;I|m170}>ja&|$eduW3U-2U?7u`tk@(8|~6T!<%;6?8JdhHn-WDdkOg(g2l z4qg5v-`&r=ihZTVuNi+&aX`y*pP>_AQz`sK(8=6KbZ>91`p%!T1UC;-M}}79es;h+ z%rW83)CW#JY^FZ!Q|hxLn>6uj`24y7_$lCJ3uD23m(K^;8ks|#&@(-= zJYXGgL*LuE@AAI@EBu4c$D6x>w(?%;#3$8_n|ZYF_TJ$pm7#6HM>V)_5v>keg?%$f|rwM+ooRPWpfr@ZU-;(dWn~oEShNoFEzcw zOZWVq!OZ}8>Rn_^Z|G)g7R^k8W}fXO&CsV5b0G7zJFPl1SF`_bx{|qG;wr|fjk!|J zAQnG3a~A%(imJ;mv&{0p^^R_!x69y-?c2diHa|6hn_3??*)%G1gYd;);R}53p21w% zHGUT3_f9Z=-Mj={`~2`%_;LGo_~VHze4GtFHXH>X^?U>0UIs60|26Vm^vn$I=hOfB zKJK&V8J>lIkP(-`OWW~DE4v~iSMGyGW*>t_vT^W>qtnMn;lQ~j3kNZ9(Ejl_sDC^Q z2gi~lhv6WMKer196T!jGUf>{`PaXjW=l22!qJzo2DDq+?bkOnfbl`}eYc)UNV;dYi z^YJ){{4NUz$Ks2_a4>&C77lI#2k?OK;9+!NFMkyK=05Z@cw;s=mE%TiCDgKIIAAPB!_OkzGU14@NK8nFd=h5+zk@#r=9@L(WqR-MvOJr2=7E>ndx@89{;7gq+ImSZVrOOWawT|idxw|$ZCQLY z1-xwOC0?>+>Vx3rtlr_J2;S<_*M@ zwrqQY`+?vrGj4L9=^Hpxed_>r9kAPIzu=UgZ?^(FlRDO^I{d!X1G@*e>J^JQtmA-WnKUPiOn&}(&U483R{kEg5z0x;tD|JQpNvs+5wootk zyEA=z51Tg~^6JUuf1FMoawXO>)gsT8zn%Y~*q!_*Hyw0F3~3TOW+Qo)<(Y0cW8;Bb zrCq5Gaxg1c;xCAUNJ(6!9uoU3b{FxMt9Ezg>LFgLSLcHh$7m4$Cl zUFWJ0gQm{sQSfy)whxi>I*76JVfjwp6OUH%p!DbHadqU_XdjllpFMvEX#a=A*pX|6 z{Z}JauwQ66XA+u0e%*nbvCMBi{kU!|?W!d9j{Ad6A-8&$Zqd%fjb_*y_(iS7)atAS zsY8j`TXWcRN4^zJ_OFI5GeUd(@7njY9k6mMv4{O{+vl4HtcdJ;l)l#$kvELkuSvw> zG~$Pn{AG2-;xuwiQU<=6NL&wceErEFHyHWNiBV0HX8~NTDwUkQA>!Raj9-X&w-9|Z zB;HM67;C+|uGZ+`{kH4dw8V@J1u|w1@pe`NXA)n>IUBTH#*g!rLe|;O`hD&j30pT$ z?C$f$Tk{gPXZl=6oFCr@-?h(ZJK%=tfADR4IC8*`yW8^TVDB=yvVwlo*I3C8>ZITJ z;fVJO`c0lzO>&!QFGyd=IY7U4V)yBH$xSlOUH#7VS@7Spp1S?=4L&`+=W}fz-y9(3 znmu9Az!+#?)NuBG9nYSxxFKtX*5W8Qh(g2AEBGOvF)P=auFGD2Ifun>Vpi1CF7I&r5$>UvtP6mso02j?OtY z6?g4CYg~@60;h-qD~egM$jaaq%YMQf)G+7W|_neYmCug ziH*rb`$iB=X3U@>n$2JfnlT}OvS^h4zMoTdd%4|CCS!i{dj0>Xk#(D+|AbgH-xXyJCodEO>+z3#o^B@EMlLB40?QVO7^F7 zI|`svQLY~^rLXwX>At*W;Q0=%SL$XvqlfKfPh;;osOdbY**ET`cC$CVzq4vsbDG%9{1z3vMQ;wc>)wfe=iKY) zbpvK(rI!Bm_sY`8zd6BPDSIpxX~qRpH0OeMYQ}{#H0Q!kY0kU9s2T71h~~V9HA=U4 zW6LkoOw$lt#9E#--zTu1h3i+J^lMDj{yNyfgU8V|d(k!Jdb+(RB>TR&9UTKEwXFR& zY(D8i4_~%AUklE)+pOf^=(?~S`7nIlK}>y^EZmB&Z)g7)=q_#j&#yZL-Qm4kk?l*- z>Fu0(*Q!h1@z6D;*T>{vr!f^WWN(uhS>1sDsJCZr95NR0wa_Nlzo9eU`o0-ld)@4S z4|!K`R+|@GKcTJxM*p?z{gIO1wVtwp_ z0;^#WXTdHh!1i#4$Jzob(NjQea7^f#UPV3meDv;A&M)sg&fce-?S6aolu_5E_%vOy zJ#27pitIrz`_H?(%Gsx9lbpX18k^VqPQzYkpDoj74(E4d!+49|PY!*vX2iE&#;><&wd5AllrwvWio|9r97;7kf z#a{Fwa@K`zjkEUTLiBCCO4TI0UF3hjz5TbvPRSZ@d&d^`0E|bChA!5-^7)2>SXwK% z&ZGuF&g{&M!=3mJCF5#OOkY2g24k5mI>L+;K{v2Vv=G@ueyO*R^~dX5)&7~k7ac3- zX$dcUwybZw(bR>lE#`CUWM{?&^z9t_*fHRCt<-uiTe#5ezHDLd9NTu6&#_y~apO$m zmBYOTcEK^r%u@D)y?gh7aZlHP``k3m8(=-=no}wJ)yrA0c?RDvXU*uVy7|;UvKDL& z-#^R$uY}ZE&Pz|%>>DN$KVH-7-Eb*BNG;#-tJ>Q&_tNw5LvQ6f{%81xka=l4>pNf7 z(`~;nylbD+)88r$yQM z^tT5Tjm$3OAtwB-=yDt9X6<)&bL~W>mcBg}H#u+7jJ+{nR<@wq_={CCkLVkD{?-`h z%EviBn>9wfU*y{?oUHXvh@6sh8`D?btV7Qt^R%;74WhA?I%H~(TYCQ`=Ef>7X{nsU z^I{#`Pye(KdOB>!?`XA`Ms)CX$XvLc|64TYy|PDeD|<(xgUeJuCxYvq_TpN~zNt#L z<0nJrWjpvE(+zm5e_G^qw=f=ZizjQ?mxLKPFu=NS>gLX2U*-AqNh`_O9XY2heFJ-v zlxg51u>*_5u7L~I8tL}pK};(4#6O=68zy@$${B5n@7fLupZUB8=7QG*>l)y9t9C#A z?o)P3>5ULJ2wSOYtY3TGFmEY1W!9Il=Hz#+X1q-EsxG6BvQqad&m#AOTzrxBdNqr& zu?u)!CS-R#k8EydpMb7q(r@g(VTb3Z%!Na@}Xs%ip^HCVNH( z{r{!(zdscDv>9b=^xZ5*7le@u`tF9Af6kgSx082?e81IV&qDW>H`&X1n~`oS4E0CD z%Zx35Pmbrc0sFERJ^j9tkktA3xR~d46!~jeI{A$JuD?TUc^_-nL^g$11^iYsoGs)T z_qE_7Rcbc=8S6UXw>MMXmt)w8U+Y32EAa-pGHj)z;jkH7H6S&B>9*pq8%w}f?}I1F z_b=Y6asCVVl3LiaHX<7*iP3TG+E+Dq>Rf6}*DI{je|zy8*da}Dn4;zPJ9z$Db*7fZ z-U#NxUs3P=PT}Q`4$}0~OFv?QlVu#nUGuecchR689^#KdoUp4u9Jx%+?Q_9CIawQfTw=U*@Bl^f(eC}W@H$w z2IgtdU~1%jgEY8m)BBy7sc<@8GJ5QhlHl2`+u^78%K8^G7`q7{xq|252e+dH9K&zb z*tJV6){k0^OE~LoQOvxhkoBJ_!(0*8(uY1%Zr}3BlpVP;CC^D;vuV6pex|Zh;@hT= zZ!+!9&!o(Xd0b=Nk$PU+xpw3}WDM+9K3Dm`%yXF?zc^*ybkcBFuGHKMUmtL4GKQ?N zbwjH(^F1dATqAzU{Ov0#_%`Hrm1^FX_vzMmpU|y4j)F0{hjpCp^5t6p^7u2(J?OuC z&}HCi`_E_S_M{>`{fMENMZ(K{IyNxmed!_H`_~fP{Kyo|{>Y~^`{mE*_UD^*FZLR1 z%j#L9`zzL;HtW`1M^9OIKQZ8a{9Stgr6ni5eeYs@GB)A#d(_%y^xO$KgG6+n8)J;h zXK4Ep*E`LK&K_gPm(cRCTJu#6=8riuQnBH5>OZvUk7kMBd>;ebB^#xVB9`M3;azlz z9_WLwTbxzbUmBT{UR^Lt?6z4VbH^WZ*c;K>1P{u7rRFNxKV*S!w(~zR+vtyn6HXm6 z{W@#BRuxWDXTWl9w!=Q>YA@**I+VQOvrNTziMdgpjSgUb4EJ~iF|2)@?|Bk^NL-9{ z!QSyG>y-BK>Tbvy)o84zo^;W&ujhB zsz2K;RqQu)`Rh(oCg#HD=H6fH?!TU+5mTtbZwvKbwSAKGCEZ<;Fjq!~@P+sg>O9UI zPix)CONF~aWEYwXZ+GT+xG$Nee$s3&R=k_;F6KjuKFwW@jVz3w z@a9CJ&2z`o#f(Ytj$k7C8}LEKTm^0_07prjL44g+=q$!4Jnj~wH@Vhd6+R`hE#s5# zYEI!(v*Jw6i}bbH(Z^)I2AulyiCv*PpJ8k-66>ov$@={hth26CK8SaavDF-8d{3hv z)Ep0()KJUw`o9)=BYp4(UviKA*|2Z>g6?*LFZLZz*~@lo-nt)Y?q;4V__^}$ByMKN zx_77k0^SGyId(txdLq76FZ6tr=kMk{y~y+wu}yEt`4na+x%V$FV{OJyz))vC2|tDu zuZX^qxgMP7)_DJyZ`}{g_6zUhL&pN&JT~Zm`}+Jd$YE#{U44D`>EUvx;sE~jE8yub zn?H5p&@?p+_OO>Q4T{eN8;GYy_PYmG~0zO6b%H zzGAIc%@O`|!;P27JVo3!-I{GYoU)Dnl(+o)R&!Z}=6OFQ7yP+aZ~0GK&3V+zEL+A} zugCEN*$?Ksk79qjeT*0D!v8EsAC7|`o(rc7W8w4-+e5|%A8)3wtTSX!BC}M}?1w_s z4~^6MTxTvXwY8?bQ5R3Dctan z!~i~RN(=!Wv)EJFjX=(s;E?;N=hc8$NnYPhP>6^X77{dbgw-f z@>V>>{xx6Myax}lcSSm68&B%CLH?!STPYLpT== z`8)AyI)41U>6>1sM#QHJ?^gS1825xU<8Jm#xaUG}|CiarWGA*l-upN{`KvtlRrZ09 z{S+?Lyax^$-l~4XTXBx=t)!1_@5J{wWZ0|Vd3*)$N0PJosNNsF^{96?vDU+vA9dsY z`%K0xvMh5VW402^bfgZmSNyU}=G}$f?$_qY9yEp*x&)pi_Gd)>x$myh>>p3n?E6-S?C_Pk_rMDF@4??% z^DgCkc`F__?3J(S-aDZ4L(uj?zL%aNzjZGA$9$H#{vy|})$Mn^%(X+@bBb7p%a||0 zS0o>0ILv+3v2=riJKRvrpL_Ytn5{dmN6w$n6~-y7dYS%N#y#)mJt6eMFW~8G*)!uw#&@mO z-+Aaw+dCxBdqd5E(m@$RbRcsRVl2Kr?-V;;p?lEZO8f>IoTi(y&QEOovS&20?PALX zPl!%Qw?~T8H`TEh2(|*-u4p2*gt>F--;b<{uf)CaN^JZ~ve${$zbf{c-5aAXr@zJ- zz0eI@cXNBIU?a0r_Fq+JWv)RV$Bdb&02d|jWqts@LPmOo-*v(DS4Up&yEeG4av%IY6uj>N&yn zzE1`33kUDJF!&uY))Dl)O8mE=?bOJzw_P1ve?!rbSeO4!?J8n)C&`C!?oS5ai#-h* zsyVZGHs=eaIBRG@%t|a`kAo%bagf0$#V>8>iLll>;?xo+YYTtcEx@kc0tO*hW^oRW ztl^eerNq;nM(}toZGs0Q33&eSKyMVkK`>fO3%mFt$actUxrBKFOGpgx zdf6-KP4MsStnmZCEKEv{3Z@L>qk6qX5Rh8@BgoT>xP%Cou63x45n%+P4lH=^(lk#pn zsW7?SeM?9_d%cySSB~fKn&d28=1Aove7SjqnAJxGgII}b_K#Z2{~ncN6doo<0(O*G zv&5{l&kMg>O|yx0gRxZ{tFPVMd!KH8^E}Q&i(Hm_kGwmE(h)pA(Xl3O&QL!cV zJHDm+_Oli}{X0$Ur``1@FxU&kJ+YT7{-k;DdX0W|`Svq*h_(~DU2q2WaJ zd&aOE`*{M}VdMYh+0WILf0sV_%v;(|qkfqEgZ+kz9u}`Jmdj!N&6> z-effjUgF;73^B%9b#Adyo6^#y;ZmEm(qLuIHds;WykGpgN%*;19DHsVl7A#NB{B2$ zUsbyE9e%6|z7t!juC+C|&rZ_%+Y0D=mb_<1mpGP-pJI05M-Il4wMUGmtdYLvThk2u z>~z_>ggoCNwmR}1n(a=;_f#>l;qTFE>|@ZrFmf{e>AOyoce#-a=R0P=db|t2#^rq` zK20D?7sz}1OV=F@bY7{-^C;V*{n2RDjdZjy2@VK3N#MPZ>8*xjje*I?SgmcZozAV zxWlN`!*2T|HJ9=Zc`tK8URLTG?nEd52%Y>5EsdW}Ti7LTCO9L&7mnEP04EIPoRv<~ zmOF`TOz@I}Ex@0QL9eLMn29=#sVKfFXA5K_26n+|N<|FzY9rny`wz#jZX2{iMUs~p zvYmbX!JHHi%}L*r!L$oLgz*_vA2yb~w1sen!LJq5T0mjjBZeU*Dju7G+jij_nq`bFfP1y#gD`8uGitU zb%VSnYyEtl?|WHf*6#SG!n$g|$&QZbz3ky}7qK43N}f|(G`$0wC5S0~k29;@ zPuz|@h$EZ1hEG;Z%r8zIPI5l@0s0?&L`#=Z10;HA<4kZU`TS2b4LDmnwDf; zW-)st^S%G|28&pEv$JVF`!${g?$}2C!cufD_e3L2#tfc0Log!muDVOb4!r}P(yfg@ z(E3+L8jX$bM{l(=M>}~pIxKk}^P*F~!(YP^&b?ej{mwQpOb>b*{S(38!Iqj)o%)nL z;h;8w^B2)ioL?vBB3d=~p)davUCy|^wzb%eyfM(<8L6^)FMDs-nqg!${MvxaKFscl z734DiFd(+cy}1zol>A(AN6L$=z~_uiwj-=n>}%Fj2gOT_}fr#>xy*Xq8?zEod0VMuJ*{n@Jn=F0FX_alE! zneXEqq2j_*=5O9e@eHwHhS|;jN;iFs`jcm{y}Ub4|K9wwirGqhz^d7eyc2UK7AtY# zbay0dG!S!?81Dyf*V69=6QCo#uU)A3|FZaXu&C}maXU3H;8F7u_A$G{Z~JxeNxSMo z>O8A7@0o7)`;z>?cTS>nk!|FAQvq1~fnaaCj%k7s*86+!{fn{bBI4vCAJjZ(Y_Dfr z|HNEA!9L1YGcIZSEpvPsbIhLI-tD=lkhlm8^pf6 zFKpJFyXFrVKZsykv*2yyf%9=qVpix7&1;8t)Mp59c`FW3e_Q-fsb2vP>K=A3y*%fis#48wyzz(2nex)R^9X*Z_xy-xi29()Epj*g9^W2sp>g70yJGXYXX=v(TT z(5>vViq0y6C&+Q>)HH1?T3@E(H=CSu&bBzRs}i z4};eY;(VvEPc^YXY?ym9x!7d3$f#$(S6gD;%eeQ;_}(Y+4Y@aV3fjDa?|zlxl~QBB z=H-yRhPdjxh>bq@II)5oHP5Dv-*{cT$N5#re(>dxJi{*KKWiktt{a6md_I=qcdgJR zq2-$Om>B#9jG|m$JWBDHvv4 znVsH8|39Ibwuv9jn(fbhj=D&r*na2^#=F^2V|Bg?E&I{2_{H{P*x5c}9Ctv^D>d(2 z=VevJCu zKZfjazahVIi2daM;QufEEp7jxr%R`i%XpNv0++D1fzSO9>*;T+cs19rXZ^si>+R&g z*|#UH8N_0)*S$Hkt-glmd|c}fP5YxaXBxWpxtG(QysOrOhSX4_@3d*@EAFZl+IR=A zL$61t+OfM@9byZj2huORh}`ghRdllCwVZl*yi@E0^z6bO7?N9UEwta!2u~a*PES7m zK8GCpe^ML6zF@Kru;6LKF66WN&8v+4X~SE6O6A|Zhu+P9J}-ZF%6sVf;Pdk-bItPu z-W=+-mOlYM+|BO zs)>pbFI%`l)mi|&3uHt4A{Haz8{PhjmFc@Zz{7p zH?=xRumE*;=@5!(0%j zC#O3q?;g+P-M{lXcDmSHK@1LD$@_FW`ZV{DvnRgqwzq>Zsnf5D+-Gh4iD2z<24}=L z;8tTgdn!-QmV&iQ!P=!@?NYFI30S)XtX*Qv)Jw3l#bDpEVSeXn$}c=Du?x;Q^L?|a zK@Iw!1I%6Se{X$7az%Dz6?W&qK=9j&piX~$@Exppc)$hw1os;NKd{? z3+}B7?tL-%J~?<#?_c9r8q_*Dcg|OSq+5=ECUwQ)Q?157O8U7MnQzI@h~4gQkDf}$ zi<$-RjbPC zRo8u*eS8j`32Z`vml^k{CPB0YlOTMwHluT8p55qv4xi+pqn8 zvHJn=MA6Fw=@+iz%pCAAaxQsMyW{ilQDi{+ZgxcuyRkN&(V?ZEKUSK4X=ka|@iSFF zqkOf?x;5|QOJJ&Qbry^}0sM5+OY8^SO|550;br$3=2Cw11mmKv-2EE=j~$RYcINtC z{>pVPP7G~%T$kT$$ncvdBD$sicW4{h$TPR?V2w<-zQK|Iaotk?yR{9=`7U_^(Kqm0 z|F@#A`tw>#%wgm@5Ol;_`s3n@57P_PzMS;^IFRdVsYg<=C?$)159IjDmqBfRAYZ2k z^7g~vzJ&Un%#V`QwmrP(b$stIzBRG*wZv?zBlzAbZiw%V-?@nM)bUrPrnGS_zEY3) zt<;x-t(x~^$KbihO9SrdXK~iZT!q1iQ=DVm-Hji0Aw1m^GVbZ%^L%m#J?LhTBAb{X7KoZ6$lC1$+j3*~WbjuqXO! zrv(3bbGPH0-^;svAK8$2ZQ+(VZV3L7+AoP=5tESGB=cLWF#uPJZgR+bqK75l8=?COlR{oQpLa~;oR}@NPvTtUE%*oA(@u@W@=G=E zCtu_Gt2(v6nw*7e-SKN`CO%F5*)6R3ScP4?Kb|h!@zM0DU95v5J}`rIC5K+trAArm zb(E}0of>{h|M8axoaxkrHd2$dg*fb{_wkMol8ZR1p6%W8CUW-!zW;!Je-exu^gAql z-bkItCk@+qQ}b3o!TA#(r(Wg~t-sVe;?40S4{*f5&vEL)#00jJTUZDUf5N_{|Aswh zzo6}$i(A9`hQvnVTLr|o9ypc0*??{--Km+cIcKQcfnSFJjb$F4X7G5e;BfSQ$K4^X z_qU2Z-pZ#!UeQwW`+WD-fOD7Aud9*iuW-iJV(>oKRzFLw;#{!Hef&McxWH*Y;jiTt za`wx?(EQ)dob33Dnj4|J*L^+D;o4ay=K(|SUcTq%qr}s_AAW{?gUY4P)bkQAsW=99 z6&h=0!VeDq2Xil2G|HTj&sj;|(68z}pC5Wp{EJ{Rc{dnI-qZ5Mq4%sgM!xSM-t{Ku z6h8znY*+8J?)o$}k-r|u&AZzX0z-W`>Mo~7;NiylP$oHI* zxWG}T={&|sT|v!b_+Bdpypo^5zdr!yPsQKZ0v=ocb9?)GetSCSEP%n9i3OgKqJ|@- z;-n&r#u?}PHcRxe)JTZ`Au)vSVzcfb?pZ+{e6;gP2U^3!hPUIW=H6cpMkB|$eK9i3 z|J_H~+X{JMt*Jft4*ZU?l)adFJhoV3p<$_?Oy3p_rw>Oax#Sem2bZEJ1Yfs7*XPL9 z@y_Tz&gF@+E+($juc4A6Pk@3YFG{q%7ceWWHSk&S>i$!VvgZY~1e z41+hrPGc$z-V8f4vW9`)25%bhx&hvl^>fi7yK;V$vLlgrP@A9yIsWsfkG$UYX{kT* zY55ZRw=bsj<#u#r%O$>?w@gBJJ~^Z><9wES)*TakeL3$*ekZXvXu14yV(QOBAN1M% zN70vi@j=Roy<-oENijA#n=T~vfBsrauGRL0(((HX(Vy}3(OoLnC$w>>V@Ye{Lfoqx z7T+y}HQ2wL{=%>Q6UUu$4S0Y*hxs=)F*jTAQ(^~@dHAuTlJ_4Yw|b24{PkWE^1}Re zp%c34^9ua}+go3LCos8@mV_y967X;S9gE#Djati)|xr4;{dkoGGdD zDOMwO3k_N9>VEV`;T*+#P4El)&ZaKN+rH74y*D;tr&qzBuMe0;7qw#K2$QLy98LK& zEq(pE8>C*yEkBnyFlXc311;}?|HM{eV;$key7|;K3>fwU{1r4n5B@s&9J`Mg(9`Is zN1$sjHM?Ed6Oo^3`1b|6{f+_r`)4_)B&^$UzIT^$@1J-E-_OLaJ?j~KTE5G5YWKXz z1DsD-NACJEY>?pU1K>jDQ}pCb=bvU4C- z{lJYU`2Ty&duKh*ZB5xv>*=mcQoNg{O*f;+J{eFpa?$6V`DA(Ga7C#-i{E6;$a?VQo{kr|Y{fy<8x_$Nu z?&1G^w=lk!3>lZ*&iD#nkeZ9^f;< z&3R=H{+DL|oc}+MaE_GZA&L$Pj`1Gk`|#^p(LwX(QjwPf1~EVMlFB*Rk$+%c!Hk|R z{`ULbin%IQZ)}ZH7jZr`*a1%oPkfxe9rXKA`tm5a>S--gSi+w^zO0BB9{OEw|Sm*#lH%p`V>*w#0ys8DBOt%+IQ+f^kK-?I-HJ`Z0 zBxsj~R`?Cfn;Vbu47Hv}SI@$pspocqCuyg8c1l`v&od+NWra=M`flWf_<*cE1K0Wb z$0U9rzG;fM-NBF{wI>fA45=7al>h9L=yBa#69-on%Dk#Gx9t1x(7m&tHDpb#_apZ7 zJ#!~mTLZo}HR~=3|B(<$v@8>@9v9bF>P6{D$t`|7)(ns|88q z>9fQ`zM^Bxh{s^dmVZ8)zWMrQBZ(bLj#Iz!R&xLSzvB7NLLc6HKmOImah!YlkD52@ zDZ?&#mRgh3z>Yf&?-puJi@4VLBWgT9rQ7FFKU&nO_b>m*G5g;>g3WvG75gB?3(RqU zDEbGR98>zHb&a_>GeobTx8nAWdFU*i6x zLCw6g;e6jlp9}vIC$+ET_tYp_-(98&e~A6)FD!k7KD;1vYTG z;orL%j5ZgWH5Z=W1P*`T4YOks*nJ&msLaKFZ2<$FsbWud=dM<85AhXhFs>6{zK?mu z4#7vFE5-igu#x0p6gIlIQkT54X%M@ayO@3oHo^uyYH)TP`su90_!}3uO0LUZ3O4#$ z%*RHzf{nhgZkkI@B7N0d{9_**d7ap-*a>Li+cjq^Jcj)Af2;B}?_LA?U;dhT?8G=( zC!em`Rh(`sC{*#u`*Y1 ztcme$`MbB@7ng5S0> z=ikMac$LVbfnRdjN&DQ(&<*re@DKVy&O>zS3Ze6RHTBN>Hwh27GAFH8g4&Rpp9%g6 zgMY%{pD_3*EHx8GBY3AVWq^O!TO=Do&rq|IQhpxzN7h+K1pn9_UasbIj`E{_C-bNM zHn7=$H*~G<*TJ>fL)Y4V6>zf`cOD zXXg(%o9C0~jcE2Yds%0Tu9vm2T09|pAf&H6i0&e89g0r18jggd2GUAq!7TiduePAQ z#rg#~hljXO#LeZdoA-o*m|hvUhupOuQ8{_^lGH&f9En^=?AwirPHipl&iXxZeJ><& zXzxMt0q5S0J|up>8hyWd1Njp2B;*O?Y*f$N5R!d_IHMVxFpiwTOMJeG9K^-Mrmt)D zoOG*Qiu^o(1u^Q2iN{rFw*6alt6cwWt2ggD^a6Y49lwfr{S)x(ZhZ88`e3ZPZFksc zMwYA#h_^q;yFKdZq^=L2c1^Qx8xMxOkU{>3=XZs~jo?M-8OzV(@Jd6q~_M# z%N%^YMe0b;&#l!=Uo-at$%(6dO*nU3t)X8TVXW2EeifXXi>XS^+AQWza@|S~w@$+M zd$+8kw-OoXCG|;brIzd*&a(IEc*mXab`j@quhg9H|2;PBli=Y+%I8)1MC!>ycb@6Y zFAU;Oll}NpiPReQ8It>RsBsdxG^VGRgWS8ddzB1}J{`Q)+T;G_G_AkAF@nUjymQZ1Ykee# zX20wE$j`ON&mrXJaq?lT^$Gui_7_y%%wOw+tu*>|b;h$Zk(`?gj%(-IljOP{24Bfq zp9Zkba)qDz+g?1LEFL~($(O}Q=AQbN;iVF zKK9wH^;yB1q?<3I&V)V|y`TD6uC-sw|JR74ko#IOk#&#HzT(Y#R&3YNx2AL3H%HUC z?`CW-HCEK%#3L`|cvNbbrS?K_sjAnO_$>667;XQmj_1u@bVS!dm9I`8UN>H7??QX? zcIS2asj>lwN>>0pzO+NuKhgSAz*tgB&dm8adM=xslMUTaHG zAKdne{XmC@;C1wq!sB4M+K#tnx2=Q@uBOH< zkZIO${xr}@XXWNQ&{d1TYB?MK4#|TDI_+}egkxN9{dn-47L(dcS9Hl8DxY;Zy6pu1 zdfckb#PP?eX{u%q6xJFvrDFK&vJN<;Y8tDaZgd{O4(~4K+(P1HkJf3F%vz-JG;S_dfe| z>M-un%+uFsvS)^z%g6qh?9uZGe^0A@0_}dhkFSNO7wJ~{4DY3DRK8=Zy>SfAN_2J; zYk71o=Ns1P#>4Y<=i!CA@%U2Rd3>>M{Gvm5ez8t>c5c^=$2RHCV+VBOXUBBsXM1&L z*DiGQ3eEfdMY{V9^pM*3XCZt4%$2@s-j!eHeED&#|6ZfppB>=uJDj(U&w1!^`ibvl zI=Y?yoMxvVma`dEK1QAASlLDG%L!~Fd1rD8R?{NpcfW42{=iD^A=W>hI7pV*P*133 z{;5mA_TRTy7nUTG=#X5qPjvw>Ph0H6TkJ%06ZQ6N$xMk@BpXXlo!jbFy z-^05;#Ph@0r^BxJpAFl>y$i3L<#yD)NKPc$yJ_}*w__ds<@5ZDceovkKSF&;w0ChP z<96)rAa)b&?dV+Wc5J_r-)p_)|NK6;W9}4wuk{|=|5HAHh~E>#KsRC6vF+?Jp+{V? z?}`2Jqb_;ZTZPXZ>OrXG4mqq>GwQ|G-v@nml9PD~`n@3SI_<>KQutoFZZ+OVe|JJp z+G}4B+155_Vc!;NV8TQ;ZouDQgg6)>?o7|dz|t|WwCsmdAefo|$H^5@UxOSpA_on~ zL2@>AHYw_87O*$aBIJS^LDs6%uH+(J_H>Q$NI9|)K@RHR{kixV_!L(~*{3kXei^IP z8hNSBbRH2oL0%q5PJXde?JeaUyh=0Im+EdMJoVy>DyM7gMt&adKyHwqo!eEe*1np0 zh4tffx2m1`F#ITf>+If({Ov-v4j@~{XeWm9VkJC`Y)wYC{+TrrFTSSr7NApB6dbl+ zZ{a$*P2|YEl^DzmwaC-$VB-sQ?}iq2P4=I1zk@9PiNF3=s3*a84$M>6gujK~y+hdE zG`2KN`@X^WO76C3bTeviuA($OQkQ9C@3o8$0Wex%tT4LS$|!GPf9+L>7Ox zPB(tOU3Y$tEdKO>Zv6W(-TC*uzAPd`-t)`Z7p6Fn#dYkBwUC0qO2-XnbOy6j_ouCjN-KL-!O zLr;Uv5?cSQ(UZNmCC+g>uga#Q_z3quqVQjD^h?ih?J4j64`{vnmR!?vV`e?~f6wjS zw>4e*5;5->XME%DUcl!A2iS{9<-@4u+QAv&!>;3pNexi{SEEOJ>t5Ur_E<|CH`E)M z{}ejlbn%^fBQvSv*uINgC!bedg8tZwUJ3PXdM3*6u{-FPxjTM_53v9}5$>(~{snyg z6M7=t+mR|n$55}s=cSqT{Qi49Kis=_$u;Pktvo;6yN>a7EY9-$aBqZhbu4}Af2X&8 z`)#*l;nPZQE&bUv`gxbqTahQa(0@0H-s)Z4`GVQC?kur|W9qN3D*bh#U*nFSPwkJ? z{228q)}M+FLw_ZnLWjM84trJF(O((#SBm<3(P8MX2J}~w_S#oD&w0D(tpfB`0eY(d zy;XqTilevU=&iUh13fkaJ%&DVu+`|V!a$E5MUNGur;5>2#pp5W$!Ak5nkqq$m7vE; z&|^ikQ#ZJ_2s?uP*j9uMqDB`zR<{e?ifks4*ZK(YDe9pU*{IdLhdlcJFzxgm{S^3g zLVK$r8%BQodhbS^T50~0_+sMI)%HZK8Xfz?Uo+R6^k@t7iS79wHVOIbiMPm{7BHs` zvkO|7Q?rmcO{NN3WKIj2)7k|EE!ZNn2wPOMsHjD3Q4zK%v81R4TVxhvi<&b9E!ZNn z1Y6Y9Q_#}EoR%=BHQS69nbRR@)Qo20ZZsqQ zl)m1dPx2cX#!M_GsYkFk)DHCc>%JPY>{Yo(ax=sMvJu*&v`g(cbG(hdL6e$2*w&j^ z6Vq`oU3`9)XG5F9QfTupRtvL{wQ>c zw`{uhDn8G{c60CNZ!#mhuHap)Y0?!9g?2(Sp_K)Vgf>DGp#^h7+)xQ{NDKO4|_GsckUs z(>CZEW$$6lid{a$g_olfb@u~Yi#)|%j9d%D<6-O*wMmw-Q*-x5^bMi=G%NHf zbtYWX(bo&PhRwFL7l;|8SU05`ykE)EsP~WK{UyA=i1!x+?;jVuzm)fv2JbHk-e1i7 zi-Y$U1@AB9{e{8%3xfB@d4K!`ISSP{u=pf;E#B)Rm)!ue+l&mk3^6g{*wGP@Yl#+6MxN- za4)=r-+Zr?+#c$MchGyDRm*31htFqG=g##tyZHPpK1iq+-a$|P3u|OTz3>jY^r+Ru zXLyIt^Q=Zb!#i#Vywk8f6zGdr!2iWoE&8HnE&HtD5BfR|JEBF`e?rx9-HXmcKD4Ov zHPp4%ZEi&8H(c+)|M;rf`)w=qDu!Og&`aw7N`iL~UmH*SLj9(V-w58)$I@4#UyV(> zbZ2viZfu#aJ6q5}$(}-LX$q~H{nR@jDWsh}b2`YE&sQ-%WCGl_2i&$F+_sIiSC0^1 z?L>#2j}D8<{fuuLGf@qEsJ{@{~%B0 zc!mFidDFng;YP4V3&_e}g!#W7{wAhFGKX|z~utJ)to zjIR;VCfG%rL-xwWddo#NvFMA=>*c?@;-dMIM?t^n=DI7%#k3RC-qdPG?qpuo+!U`@ zG-&(0?3-kU!xLm(dpde0{){d)2JFFiC(qCDdwl$aU=r;yr#4Glmi+gJ@lU>>Nu34j zgp_ZVua#nxr|3*l(ODW z;@<1akm65r^Gr}Umo^4(qHwPEbAY^_Uo2v?4v&HH`D6=ee)P#*1wFbYpLYh+Zz=m0YTE_gx9S zWStkk)60XsHg_QJ)UzphkLSsIK_KsOCGY-xd?Jv^_|S7(FBiEC%^Ceh!? zL4SXbPOLx{E6}?YR-(GnYMxzgHKodlyOdiEi^{2!D5t%g_HrxHQx2{$UHE8FM{Yt# zZaxoP83sT0u(ohpsg=x@qAS_Ud?&iGU85ac8Acz_o}j%s3pU(SOuIq5LAyaawHZBS z++W81W!zszJL|35L$rrz2fxyupuL&rH|;4E4CfYr;c8}^g5S&{@LOV$DfrDT0>3pc z887(FEC9bXRgV|^<`#qB8rPZ%zZHVt8WxyVVgY9yf#FKPaLFE1VYmnwj(TIOwr7Ii zII|cWhrbRjbcN+gz;X@S@Wa7&g6AUOIpQJQ9~Dez7Aj0v;zly$1~cQqbgc19#Y8rJ zT&JyuFH7L%5_q}PNv0T64;WWrUE*MSupyaJ+DmC4M?32^u`$VQ*q1DJhW63)%cp-n z{YKEgr6Ya|xbQfARbO2BGl(roE;{-FZ>2=!3 zOYwd0hibrypQ26hUs=np=@-yGjyB|%@0<27AWl?E8#;;a<#E6ufNb#_=B5UkC$^Du(W%kt2_q-NX&Ql7BkS9gj`=+F%BN=`^u%7nZ`fVh z^XXX(J@HRyZ&duK!*9d+IiDZ%`FR9C=Eh?dvZvaxF`4X(=QQcigz+&p8JEjGmW+jU zQa*q9V`x1_AB&v2EbFAeb;%TR!kjlV=j^l07z$}GroEW<653_`T_Iyom_e`uJdrlrsTmoPDw0Db3;49vJ3wsM;^WnL$0mg?XCC5!&SapPc6)-RCyQJhc?99x{JprG! z{S$p;|D|jJb5O_}fZKYCnImu=dZ`AzSC=WIy^!`I+KZSYbRv4Mf%ZmePjSD_{aMyi zWRT@Ny~ny<+T*mxXlG6ENWJHeF@@a77#AToGQJGF#TaXQ#-OVve3MVte7?$;jgfpc zy3Zr|YIL7R@)hw^83+APx&<02oq}8|U1AVV6*|xkc9H+!7IX&fw zw8JwxJd-V;9Y31(TEWme@zb6XKQy0b{!03fx__ixkDk9VRa>0xxy_45`U_W4Pq8-slqE^i9cn+3agYT ztTF+eSBlP?h`eA|dvf}YTHwqCr!G6epkL@S(J^soHH1UzGA8XN?GtIA$h{+VOFm8+ zO@|P4pneIQw>2D+^FYj!0`mUY%+WNN01fduvSrY)jCT0=2$)eH4^7a8)!^2*rU^PG z0&a^~$&6qL8FN`MW?~>~!+{-ob&N5O#0sOwJi-PHVyi~*V-8m}@HvO6l6=nLDZ!XI zECp=_aa4lOn*t2g%x`k|si|keUmRx*<4iEl<_z()Ofln}5R4ODxHjaEvrp{pe~%|d z+l>*r@-Ov+cjMP&SPPz+7|^x{xgXSZ@VMAOa$E3Ib2e(!r-&Esi8}RqfuV5j{;1QC zf!B^mJU1r$^vWI(vbI6(d9ZjhIfDDuxfjfTEM0|HxTV92(+Tgs1KVMZ2Xr=j=!hAn*ll_m4G^gp(Njelv$yv;5DC7%U* zasAB%Yv+E?I3~8#eP||U7GG+~yp@0DPsB%mXsLPoCGni?_aGO4dEOd(z#`kgA!^>F zZ@GCxH|FN8^=Hgm6q$=6b6|uNe#t1AjL|N8OhVrju_@X|;K)=Ny0;A7I}ZA@4@^&< zz0T9!jXmIGFitW{980kD&>X7y%a`fV_6psG+$OUVxc@KHp$0n0o(Zg%VUC9Luc|c) z`1b+m@V5AuaiH6DbX#^j;}|~%9mdl>p7t`@(Kr9cbZG1W4-q@(EcrY-fDhKP4pjKI z^?MFJ3}Y!V8iXEt3G-fR)Mv1(*x34PiFXAuk|wX#znOZ0O5IC;S@W*Ag#709?CTkl z^EFiMpu`I#&ZTOkWGx~2Lzh2dLgg*Sm!9eU8ou@ND^T{Idn&z}JgYZBm%2dvL64dq z*7kpO19?X+x>klo4kIUmqkE+L0xSTEAf?>?aPl+ssLs@SpgVxu`*+<0o59naSX$$yP)46mS(a7O5%Vswq}t(G;tB$t2n*(LM>?3GUi9NuB#8*oxS} z7`TYo)3yq$ISY2!GZ7zjq>tJNZfXEGC26mvy-xPYkv+s#5I=tmImp+21;pMj(rG9D z{uuNdsryv!uLx|{xTsRajlz=m%Ty?Q7a?vW@rz_ng^C?TB=^@-A!nWp#*b>&P7=&# zmPr1uXOiGP;!WiLmQ*V2r}BT>z?Iu{g~1|%!Ft61A-6^zut4&Fvwa*^C^#$?QF%Z= zW;79)MX|*b=ir?b~$nl<|AH2U5wR`jpA35hs%`HUQT-j z?G=n;WISm!4$G(eNZ)=m-9ykd1YOC6J%&9(7Y>h~)D@5`yNF!b3UYOifiq|y<`)aS zh0exwe7t0JrB#~&bMqN`3LUKm_O(-(d>cH6f7mGah1$}F+2FO5_~k;I;(#{bwH$3) zKg8JcX_M!_j-t&79E0u@y;+Q&$7dJ$gXe~0^?d&gd;m`l+OuJJ5BwIy(Hg)3LwIlE zFuXT$7~ZQGhW9Fl;XN=!5HD+@F9Gca=@!t;lz0X-GiIiQ&%rd%ECIcmQ{n>)zMUA* zi}_e!_`KA5KJ?1R^k8UWs|{If+#dYyQJ9{%EA5Hw1gi$$WwgIIl9$-u8hV01vQg*> ze=>$)GVGQR9~w3$V}`_77FD_{i4m!>5vy*};Rk#(#>H65a%1tw(DqaMFv4~_toOI> z{+?#t^?+vGiC)Se7TVhE0@*P6HITM-oJDv?W ziR=`kHZ#QmpBU5iDbDolWTP=N*=bBo2J3K^A6N*i;xwfu88g8`GqY8uu1^hONI$od zu1OxSiacO#aAwm#!;{4RGQ^8h1x`|@2DE3E z)wFGv)tH@SHSC#1JG_)3UJOs+?^#LOYiX~cJ+Wt2OI;B$fTj0xy{cuQJr8U>*Q(|7 z{MX(|&FyNdhR=~5Hd6<|TCsM-_vknlg0? zM@b!3WDe z7@o|XJ+O=QLUK*oqy{2)_Q1pGP$aB;in5L3Pn>BWBTjAVOl0g#WXwj!Y-G$fX0U{7 zMs^M|HU}A-W6ad&AYXHpe969%s{RB1pQZT!2Hu0d4RYh^n)W#>p_8BHua-Zst<}I^ zBY#c&HR}~awHOk23F_Nw`8-&QA=h*DA$%UJ#o+T`Ee4+l>qGcFSc@UQZ#jZI;O8($ zn=T{vvvi)C>s^1pp3m59nLF(cVnyQLFsFlgQDkW_C(6Bp`OqpK+a0Kpxn|6@&=^|i zRsQ*-ea~|ZT_O5Gr`|$pmRfH%>M{wZE}MWS6HZc3$XU|%0sQ&J+hvcBLZdEQ4bN5^ zNxj-hrm6?q4{Vb5IPEpG*U(-=dre+D{E@Y2w`jL$xANMV?_v7NpRW&bts!r|E|WS0 zzwcVypVz(*SQ_ht4u9u2@Jt!&g?|kX{K0A-PaHghy1#IWnSh4QguRq9(myh8`j>wrPy;UfF;DVyT`hf;&J9G5|NoqT# zexO)^fAxUt!S+F21??K`_}3TVUl)MWdq&Vr=w(4CY#+JJ48GD@ zYI=K0=mU6t8+E;@B7<5Wi*>?QLnef7z@Jv}Ovx|En7~quN$j4|=dE8FV@&xuhI~Ag z7tj3vXiSX9nW>YjV_Y>U!>CKC7>4D?B_+0<8x#K5Y&{syb&Lm_oW&;V*z6QFu|4SE z5x#nU4ta#H-m>eHr(+9AM|)E>1{dqfU3KUT3ROr6Ae)Oxg|J9dii zJR(+M&>vrqslJ8-`$Qanu%60^}XGWGYqch{3rqp<2 zras=8nJqJQePVzsU$m0ciPdJRkew+}V6y+}IM1%bFc;G5L-I zyHveZ`u0c^omN1NN`bLCT)^)NM(F6ONSO9Q+6!qfq`fe&o!HyXBHD{+FQUCDuN@sl z9x@?oIr}O&V>Ld^w#J9q*7z{n%Jo6p8Xsm`hib=(zYVjk+?%U&BrccGscYe{mOsH+ z4g59o*Ti45UWgqb7A7^}=n9`-&Jj#P-J7%xQ=Rg z_;PXDC8nL5&p+}Ve$<2Cx2}=E@YrN{Y%)AXTy{2b*%Wcv1;pAG5tk*_KusX+ ze*CT3&wsPeV;DXRQ*#$KwzP+xE$tCwYdGR;-5GJddmeiMogfDnWgSoj>zfuT{`6$s z4|zDL3xrRH@loq1;iI872sJ&$gM5_Wa}J|X|2)V?O?=K_H1aKj7_EWNIgCa<^&lT1 z+srNXI>Y&-Z4!H9US`!`e}?H2^eH)NY+ewHGU|x~5mR>Rv3Cs@(eM2eod#@P;s|+q z-TZI!jZNcC_B8*5iYKc&#Oe}-BgkE#dy8Gx-m92$iPR$Y_*g>X$&62}od**P`a+FM zd`uy}P(#MY6yggd*On+u5e8FG({4sGri|6k`?U2B<|~Q84CX5ne9q-7o58QSd?j(j z!F**Szscn*8~B{dS4!NwJjhoP_qJq@_rz@0>-1pPu^IGJ`X~L8{wRD?D7BH~AQLII z&IS8)m&M*c*sG}E8&_i7$pxHiK%FJEk*;5FAmgA8mKr!!8@Vm!+n6>vFEYQLV1#X? zeIhnycpN+rE8r)OtgpgnAit2z;zR7Iz=r>~u@^Pw#%lKRVcbnUV49vHgR?xWCNNLl z_^p~0b=S_`EFny8mvV1bnI@u)s(8o?$%oki|Vnv^|aU1 zUXPuqXDoH9?o51IS$8zNW~{M?7{Rt0E19i9ch!s`<2B&o8ml>*02e2eEh>?k_#QtN zC%Mf;rdHV@RTIC+QuS*Ri)&h9S&1dO*dXE?U{Z8;V^6K}Z6nwr@ktx_F17IyY?0K% zC;3i&n<+l7#Q0>5qtgGZkCfb|Ul-51$zY9RvYIuK=zQO&t%lDm_&sjb&Mr_G$@l;M z6<#BDk(Jm*4LX-tMT#-`b{?Eu#{wX3xRi~%~a zo*6vJZ6tTA=te(?KkiBJ4vDRy_cOIt^CC;=<49hraY-HX4=plv z@BlO*2It4-h{Z18_uHsnLY|tdV`e0i8zXhQ$XV0uz^-X){4wgpSF$zeR~e`HEa{B}T}EFl4y*1x`!w25qy04IZbZLxeRd1*$>2woGaaMvhUBcM zEwB;`WSvCF^4CdJGoI6e`HUF#DR_K8YmijE&{gz(P~L($oyORvF*f9YIYH(a+weJM zzL=8++8d=km7nX$A6q__7;|jCocZ&i)(i~e(=q1cH2Rf4CzI(n{!Ml&{hmsD{+vvu z-|VqQd!w|cuxUDZxojykmpZ@veiK{Mhia1FVorwlTVzYEaX>GqH4f+o&acA1%S_4R zsqyr03Ur+U&rF5xQ{kz++-znl?Ne!oCsL8W9OIL^ zzI<64nJ*hX{`~v@!n`d&x1e8=8Ko0P&zbh<7;~0C=KML!A9Fsh<&Qa^*Yd}le}Dd* z=imP}$K1DLj4}UJy2Bc!uSU`NG=^i2c$ zrXh8@RkNRb^bzvXIx+U~tRWd?Ux>r!+n4G*Jvy>qhU{h1n2H!PGWghwB8KQA_6CA4 zL>~#x6#EjUFWBTkeI#<7uaENb<)icw^@wL|O^M*bgH;La$jx% zR)sH?jWPe^Gof{Yan&%c(YA~+Gwuf38>M|zpYwS>zt8zR|9?E@)~nz4nDgtc^6lSf zUw`D7Hxa|!L_Blzc@cbo$f$YVMBH;zJMqu+RQ&U=ooA~ig^#}|Vum@FwN|j$T4L8j z*b?2x-nr<$rbR{|lm9UWP2gSTIgurHyJzwkd@vb4p!SybMrltW)4B<7PJlPbr}lt% zz&y$9ROCZ2&ji|s*SLdWX>aEKCUt+l?#t(+eBC#argf=Go?prPsXNV}Cq~H*aV?#= zR<@jW)+y0G%xCp&-E3+c{-?5|eQ6Au{V(k6TfY+xEz+oZsq2#Pi$^J zp3BG4`FJiLNB<3E@U6!&ocGo%z0*oPQ3_kDS2G{@HJOAV@vG5m^U#wzzD@RYesg;M z+B}}YxOH%Bb~5eo;ix&EO#5WoC(%xh;jf-^u>+Ho9q{#~#XG4_(1+{*`+KmSkev5U za^FvdX~$>L@maF?W0`9DOq`MS8rl=8eI%cbUV}N3Pm>$T4GgWpbQ0MHgSd`Un`$to z>kZEIY`xK#sdpMv^~Man-kFh28cms`)09dYGxel1Gh1is`t%^@_ZV>@>P9m2i2Ka5 z64fnM^X$1+Q)(_)VJ=u{u9aLuT~=l;?Q^X}&)nQT3*>yreMx?)^?>A3_)gAB@?mmK zdqHwSF4uzZ{d{kd?<(F^rs7@a;$x3o7v2muY$E61m<1zJ6Ph18X6-F;7V1T5PteZ( zQV#n}8Ps7r>_cTW_tbJfYx}dc++Rz3nD#L3VcNqMaU$-o<^EdkuN_t+Hhox)*z{pF zV$+A!h)o~Ni!?8pKCDJ;`mh?Y>BDNorZZ;A#Yw$PgU{z}nt>nW;13zB+i_%1i9`=E zxoyPevJKQjHPDXUOO20+KkDf-x+{l<48FM4;Htja;Htp0f(%wjW6Yb4=s3B0i(-80*^_SV1^l>JA zoJk*NGKP^fsLM9d-b8y7?M;j!p9VVZI_)~`l1s^_fkwMVyGFbAH=x0kF=zlE!i%-= zVp4c@6b;~G+M8%^R=k`)Z?l;9;q{jJ^ERU15}Fx|$zV(dW0HL<@@W>LJw$tmcJYr! z(2RK}mY!lQ+Jf;`V$pa@?In>Jtb<~Xq#kmP*NPd_Ear6<^O~!NOfu#qV@@*W zB<-_lpG|wN9x}<8lZ-jZm}$?}(Wg54R7an%#iROMOM5NtwX{RWk$vWVau%5a+6!ox z8rA%HCg+wJUZa}N>oXbiOvXHuF~es|W?D^|nO5W4negaL#+>8zCV$L*Z;Ua|?DIi9 zwKhvkb&t>_pVz5Hr@e{xW@*pX)2Dj+Tu+~g!;czslJ+F+N!p>~s4){)$Q03DM7z|G z=8u`ULWVreU=8Wp9CO+xdRi)k;W9XirJOplLoKl&1#*@(_;5S^OMzaM=|dkyW0J?P!pe`%g;;q3-^JD6u} zBV&U1Qt(~|-pgW7dYTw>6Ju^-%uTezyD4}#1Mg-fhTp`Pn;3HwW2T*07`ZIQL`+N{ zH^w{>^UDzPOA!;)q2owBJjVU`G|Rt#1kD)pbgMQs9p0X9B^HqnS~4Bpo(^wMr>|q! zuD)9tQ@-tLX3WiuxtTFH)1Gg;ni+F5V{T^5&BzNi5qi@Q251vqp0A7Z$C0m#M~q{P z`}5~M|Ngf*_pR-W^X<-kzAny}(R^JzLPi;L{{8th%fEjF&Hk#npCxetZRy*cd;0vh zw%Pe(&Y$PMcFdy7eXOR&+_#u9=i?TzC-}2AODtIM=O|qccBQ?E_GX1o^KEv%&CR#j zBW&*f!93@Ux$OgEjG47{tP!fslFyelM5D%xZ%=y@?ah1Gi%Zp{m977wsy)L$`u~w` zSMx6G5Z|_Z=j-9dK9Mmy%t1i21fL3t3 zu4AYLWp#orY_Yl)i z-skqJx?Qzfs&qSiZfCt}XT8FoqSMc!#%{rfYm*;k%>a&{yvA-(^@EDDYST{?XQ|gw z=Qlo1d|V-XnGx}2*2p?OPT+Ci34!O?yW9Af@HLSiRR?GG?lwLq3m=q@&$w~e=dpjQgY${nJb9tzFf|EWABTM zxHXVFT^Z4iAtUOZUA1x4J-2G(5M!{3ZCd!^b$Sb+KdODVvw#!Zw1|D`tjE>*g}L%_ zd-l>?iSI1zVR+`6xuWU^)y8?bJ^LcX2dCO)i|{j)Yo4JQ@d=ywgmnryQTtG1Bh3a* ze8M7rp|c)W>lbh?<@k~B(DzdHx8j2f6>uK=Dmbe?I8{HWKDa8o4&IOZK3w1azz}#$ z)Gzm1uMNWcg1@F<1AKvJhPO68W(yy)o+P&9sgBd+(W5p#Y6~B=ep+puX2O0sb!|}B zLv?L9(e+TlS$n7s&eT;uM1A#s`tuxV1g_#tjwSFQ@PG^NfF>Q#qyw6C)S06J-~r$P z-~m&aqugH|ui~tZKT({=Wi#OBFT9EWRAlr1W^ksT?SA_89cc!x_>6&vfCqsGTsZMO zn|PjOf|FSX=OA$6c^3Jydaw@8>Ub4rb^HWzPG4OIXKK|RqGoMBxx7bO>flUm8}K0T zz!9lgqql=b439qb1^qtg1oBG_;(|`dT1s4TDRIRm#1)qiS6pIr=}Vlh{9@vYi-{{P zHWuiMi7BRvF~$96V%lAs4396Rfu0v#LhJj4>yoGB5Oi zTUQs#lE;e71b8L59@hiqv*%*jc=_x(e8uIn=OTPAojn&CjqfX+J%`_QU+L_*0H3Ab zmz+J9;5X9iRnDG^^SN~PoSaElI(tseq${00M-8^$J$ufUK2`x@+i~(is1YI$&efe` zd*p0Lqc#T%e-M73@!m4*|MTqsb@sZJ^!cjFmCN{^n?en(F6U4Cz0V!*-}+$O|MW7> z@9-Yyf2T`dJ;&r+fy7G9Net41?f~c45VPfVUkmTN?(^}^>%L~*dEM8 z@nw_OeIDY>(p%1x_1tH0jn{n*yz{zG=bhJm8t=UBn?kIM*L{{nZ_%7pJo5_9y1OW>ITtO_j0<@7H9IupLh!ke zv#QQLpgC#Iq`Tx<%~|sT`1&&d9kL>uWHhoUInhbKYSex%r26@;i)7+Z4?V zY&J6QZIJp0-G3L~>A9G>OC#^vrlzrt^KY9qKWF3?d$~yc4)enn|9V?--dvDrY~@@} z`K?DYLU}ziK#%bSx}KRbi8?5Y^Ipjb>H^RAOF#I0gOjjzgIpkk9<7e48-{5anUCB_ zPlu0aa)un|$?3UGF+EBDhRh4^){-;#7S58pfwP28oup^}>MqXg`#bl1KmXTfYMCcq z(34kk&f^W=*ZgyaIq$Je_n*S~s(<-jJ^8~oa|YxOwdAaQoNv^wW&V*f#n-iSruYM# z!#cnj)mL#YALsjhaF{dsrt|w|Jvr-P&41-dntM;i=5~Bq%e~_#TJnWYXvuecSr`nhsB|X*c1oCH~H_vd;cSfgv26}TjdULrGvzDVbmpfhgWd^zr zy}8U-pf7V4MHCG;2mZ( z+rb=^m#a6?Ev#X@isy-$6=#l_A)U2dZ!wGY%oVzGyoNeTO?0XDHNxjo4RwgmrP^0& zUMh5FONH)aZGBwdhyHZWQHoP1Lrt3@=M9Bdk$=m7OZ{{pD|KVU{2ICbII=9)i0QfY z|8kx4hr+8g_xzzC*Xb_+euY?K48LJie24msqCTZ>6@E48#ggE9T&JI1@hs0+c6Nn6 zon4_%XIJRc*%kV9PK7?5Q=w01SLoB(C!kNIwp;q#%`WRx*G3t;vZznlE98mq>BRpm zIY)!ICUM}>xeqT>=k_xCwC#VPKAkP|(R?-Z=~vtwrn~%wxj$R%j-o#O&;Qe>u09n# z>7I#Ipo{iBXywwWLZ5z@YvnmmI6p`eT`c;P{v9QnroXM|Q}!igefo?O$eZX>(?JKK zPfhe`(1_VVCuRlFr$O{-hk-tH;#LRxv;%z_@auZ0s82tRKD``$c{%#>a`fps^yxY? zWUWJ=u0x-$L!Yh%z83gebj@04H~lU?cA(k$*ve+(0dI5R{Mm1~XNYF7QTspC*l6rN zK%a|2pYbuTkKg%nH+)@7e*Xzxk8Az28p+c=K%a}j7T_(wTNF5F2OXf##b7J&R^Y7) zTzWyY$@x+@P5r<*#_l0{Zye;AdUz&ZbNRQdZ~ZgnSq}0nLp+O*XX&YamYMP_2YHqu zp2f$r^i)5~%toH&AkQ+yv-o(Hp6X|r+2}sYO;e|){PYbV_pjN%%_sgLJ##1D2jzS_ zcdl&Wn%6xutML7LzW0C!Jt103>+9#aMt!kd*S&@K;MlhD-;q1$+WP5#;M%0(@ASg& z(p$%W$A7xN8~Y5`rj>v9QF)HB+snU`y-eYL)QRfUzZd`4{ayN2|D7#7e+zbE;W-Px z9oWnFlZ(G?-|7B#;LqTN@;fcZ@2GWg?>VjTJMCRu6a1(XppVRe_)-UcMelbR%b7Yl zXD*elYyZ_hhx6MC|3waO>H5Gg`lq_rPvQ6T#;OJ)8!v#u`>Jeih?aF@6GxAn!axN`$ zE_Gt}S(RpLyj7){>dRDVrp9-wXl6ny6B?P&#)Ky1)Lv*p0~6eN);c(+KU4>2Y(j8~ zgHu9qs=-;wC(Nt-$2du$a$(_xs{v;J=)d#2I ztj45NoK^qr?~e0S@mGz#yAIAu-e(QYN)BZ{h-_E-qg0$#ADoJ_I$p(D9X~;w(~Iih zd;zk30kVAovVB1v*=QZ53lY90Q*V`ZSeF5L84c9x1>koUad=y!TqUWOMIr187^xS;lmAR!=c-0xN z%7Qw6g0e6$1-w<=PEIp1lX!j+bP-umbvwE2Y_styUu+tC0`pQuZ>|{>xbVFJtW|HzeN!ya#v>@E$Xfy_B{8 zQr7-US^F;qo&a818=%s90q_NkU%+_D%devKE0{OEJa5Ik8JiC+dRg0hjfmaL+TP3B zk1c{d63?%IRx5yC2K+MMmjMTlEVc~xObB}>;@UH7c&0Tx(;A+Mxdcuja0-G`z{Tl8 z;1>eF5cq{W^TptNF*sig&KH9-@iUtoc8eT#eG%hTnyEQFRWt)<3teHEv0m(!J_}uO z9=hT@bj5i*D}9XhOTf7ozF7rbF)$09E&-=Y!08fjx&)k8f%7VGUIospfL{vyQs9>Y z2aoIp;Cul%UjWYN&-_xJc`47llxJRA=b4uPUjlpyaQa6>lWIPz<5fPZ<5fPtoV`=x zb5Bt}{u4N@;L=O1v~|uI;R>wtK(HZtK+L^cH(>< z`+OZft80SF=c+XUKCc3&Rp7J=oRIe#oL2&034A5+m345QkUsbwaQ?SCIG>4ZpNVXr ziEN(X1<{JI3j#uZsI$q`d%h~*;b$sPc7w56Q zI`jU7cn_bjeQo?27Jd!=+&Va8JKOk0Ec_z6RR`yZ>i1WUb74O_%rm3EZEO<@+eE+A zOg!i@bth zTr2ob#gFM;8+$Xgz18*7>Kst(rEBH@pi|q{F$LV^6vUG)%E^j?Dvb!VE$t4cd^ga^?nVu>>BL% zHQ4WKfUEML>J4?hud@HKaeA@ed(Bucdyl?e?Dw_U?`yH&*P4OsTKIGky6zI}_uj(1 zPm6EvBJA^vjEH>^_W4EF@8^Q^x!`;*IG+prV&E48zZf`pWLJRm3UEf=53dm3b5CpM zfcUi2KLH1I9;-O0`?e|^7~jC0X<*JYFlQRf8ouX|3*!Fc_0SX4eQD^ftLvV+Z&UgH za{D%w?<(I^zI(vQ15O@r_JFfWGXuB*+yHKnQkU(nt7ymaGB5O8UOd3FOxqA$y%e zypq`GI%1!f8!`KGVxN~AUHautSAH$A&$Uk6T5BxO*An-|RN~^#k-< z_j-&620hLLgY;YXdX4)Ic%A!JdXqQK(sMt!lDwWb5F>qu8z)WvfHPf*iMsL9d)yde zqr@`{>sb0Y@x*pxcMrXc4svfF_a5TjL-ca@aqolNyT_a39?3UwChYgGAb02nUgY!8 z<2`x96I%c5!aa-k`xW<_YH~iNf0$U?dwrZ|V(;|RZ&u<{8P0uj`^+|P%9{z@aQn{-0%+0%QL$vKCn?4v@{&dR*EnS7mT z}Kg%-X`aAj`$@%O#0XQn|7RT z29F{$_Hyz}&Lq#oZ^n;K_e*Tn+eR*@8)LwSYO`OEXVkHcEpjolFJd>m7rWs?>;^eQF-zX(DEkuN zp~D3_Km#Y1hX&9hwD~OL6`KzkOVI1JL<9Qb3mweBNCPs+c@^m8=w`v!UxDLv)=q53 z(dij)YZ1qRU>zK(x2xyM{R1q(=i@k3KWOpIS)jL<{}4 zRQj|7ZwEdDIQ-O|Gf^a=0K~8zP2^AqMj0XxmR(GUQy=UxLz@%eWH8n(P~2T zu0$uJOJu4K-3&iM&^aaAd4itMia9ztGtAy7YLk~}t281{u}q(D)}hZ_ z=u^>)xrRQ}UIH)oJAM)y^-gTm)!3*ltQT2j&OC`-e`f=5^n@jPtHFOq3p#X#?MRb68O;2L0U4A2iS09;*T$lU-QAfF*fKEtkqoR=^}uk;=R{ZWhSu7mWo z8X{k*rvbRk=PLcl{;UEQ8~%-)lkw3@9DMwD$$7-1%mMTgJj_gje=(a}%aJxSQpRge z5wA95K5`x^;WqYY9o&N8Mt&~O9+O;*8r;ay03OJPz%2ybI5*GDk89X@o!gWDkwTu2 zo0lAP^L*Uv1N#bjK4bU{sH+X@bI^yUpbt669DJ+RBWlR1d)=w)(QM$e8Gkb4rPrMz zJJj7(_ZF?9ry;!tW7b)Qt8@F#GF+W&iw;KC(7`bso!fhke+Zfey3fgYgvQykMCQ!+ z$XVcAUXOM@C%M$xo1v4s28Ey_z1pBtOnO||>Ka7vE8u}VIS`vjT9<9}Px7K8MZb--BD133mKOCut08(IezYayYa*A>mEl`>c2&sH8dndTlzbUKovlDnHaB@Iwp6Qj)rUMxs z!S1&u7RNb?*;ecZp+|WRv$vpTth=>9hk<%?IR+hK&>;pLz_UiK>E#DJK>w?t^uHoU zC9IRHlAq6Wa_&eC9^{(n^MOZzGgnRwk0LK4!pp)lkNvO?@8UdjoM)!aSDvYccl7E4 z9-x0!Q2JX@mpcKST7NE8&^`$51JFJ(;wwHsHLUKw&S%EEeMLOh*1;nI9trTEc2}OW z1`qmg0S}N<6O^19OVxww+M?<~RgcD@Lmb|8!JDo+yz2tq1v~~Ec{nlNA%i|-(1#2P z9V%szTFnw2(&vGvs$0p=Aa^JVo-x6*Mh3|#0v;gGCMbC}^tcS`=S@PD%^@<{cF_A%g32<_8bk;I!Df?A&z<_gpHFSm#H8Kj{ z;e7%=#9cn9GRiv3TFTmJhFm!Ruk-);Bz)jZ_!=3fE?!Rpr|#Y6nNCc`k*x$cSJ2r# zD~x%SXI|;ZhP4o!Re6TDd1OOh1bh)VpO8GGA2=&0+k}3Qd9{@PKfO4wh^v+6Ra%F( zOZgx2pmgjAE5&oDGL9XQ$BxiX2acZyc(sh525nA*Hr>#syAJKh>D0S{gNKdIIbqs~ zPFUp5%kPSPF>o8t{95Y*kx`dk1sNR}MaH0$4xRGIsJ+DLv~}|n4>p*49%(Q?ez3uO z;F}Hn207J{)BIw7v)J4X{C?o~0{0Md>?n<`#2vT zT2t*_e!dRRYVM)vg_?W(?s~zcdHM~|TwO;_NH0K}*T7yK*JaqNoMVZ+Cq}%;d!>!) zHC#Vm)?47E_SEk|eq=qCy2heiHE>rQ`r-SBC_|Kfx@vrCct=h|&J09ka zhq>cn?s$N+uhsFb=Fv0u>C7DubH~Hn@i2D;Uag})@u0?djqw`enO9b|j@}LYe&F{4 z|L8Y0Cy=*{kZn1{a*R&hays*ABW99oKdjtNi4Q90CYBSP(wHdNFZ?E@iGtft$fz9iI zuLr&!8m))l>oXqWGDBYcXIU-vc6;Z(Z*IOZ^^w4t`&w@OM(XP87w!Ao?xU$Smp;7j zEu7VdPXxcmOt+uICne`0eQ`xiGUvUP`#Eri?CZYj_dd-UBIm#s&voV;*ovCuSrs+O zv!o_D<9z`eMf}m*#P>6^qAq!6|Mk16Yh&LR7GL!W&F`J@AiBH3KlsfDSObWsyeV&T zcA0v8zp|jy$7kwhAx~<==T!iA+A%7@kFv7_iREh@tqK#CAQ<0*iP0%&x8gelyC5R zLYnyW;357#OXtjQ&#{Kx=N8X;yeR2CfZv4}SmR9eY95^2b$RB_Pf84k^NyK68Lsh6 zvv#`l9$V$#alMw=u}#a-*8m?lIzF#Eoq7ZE-r$5eGx=X1qUJ1pixWC<9Nj~2f-JwW z8*3Kc%t*KFo+X?Gw(eTJGQ=Mc}HGj@;-$BRNi}_mkSq} z;ro6s!!1fm0KjCC8gw63M{`9lqFceO|o_!O_e86LM}eV;cDn z_Ef~vL-KCPGcJ;PNa!WcxyautpWS$RBEx6#x#AC6=qx~g1V>NecjPu@XBu(aVnv&OEpcnZ_&l9VjcA*(Ry4ozzj&qC;uQmhZ z%eeI>*$LCpjP)+WKb|mRLOW}r;r1S24-o9=HUoX#=#GU#A9QTH(*)>%}V~;z#dyW%BKJI+%;ETosoJ0S>(2LH!Jue#f z`Cc@G`jy55+t@qHnEaKFX$Hj#nI|CnsC#rt_59n+-_}w$ZzdoKBk{V>M@7UdKySc6#E4{>b zW?)C>btkUNngHGGhGUbx_c*(#Q@>tx_gIJX;N!>r?dbXTf}YO}J>u$aWUis0zkT3v zxS_Bn3_NS>I#kr*!$lpwrl`Z)iaPvIQHKu~b@-a14#)5B>hOa_9X?dl;XOqi?knnW zY#vvK4;6KIPf>^aUR53Lgk+A4h`x69x4*^J(J!gPjiUbMows*EY9;(paJr(-fSE0WT*3sWXb@X>n9sTWlP4u__ zE@HsY&qT*$JQ7pXc^-6%=$TH@Goo)q&!B_i%(d7kXVutK%}5P>h_7!h(nf2BABrA7 zgdQJ8kFPge&FI(pn!M~@$@qsNEp=<%L9dffLK z=yCLtE1#^15oiouosj6J5qy&!-I-SABy{z2UaQe1^4KSOd>V8|4m+k9F_A+{V$YR& ze2P0KGop^)6emBhYK5 zdCdHD=Wu~mo6+OQp3o;YI>n53OhH~%x=eACkm=4YRf@jPdwdXk#ockrT{w6rd^e*adFC$sHm z$Nj#O%j-tLmLK@L+W*k*G*7(JKDO0!rr$Gz{#393^|9eL_TG8&@VwAZ*Zqxy z&6R5b`9Tfk{fO*AN;zk;2a&VVWj`YOl+u1Al6BV@=Dp!aPC#(P>x3J%V{d=xOr!Jh zk_&#SD~5E3ts~J0lV9X3w>lBXPL+3WJJl$;4C189-N_6rpJBEV`Uww zvmc1cI-=|cqIK4hXq|N=T4x=J)>%iQb=Hw^opmJq>aQcnAM!Y|&^?14y0V6dJSLpt zT5Y&%ioFPVb7iqaV?*{_!M;hx0+GEe=Pg+h>#bZ%(C?dDi}uVg@;L2>qxk`j)Y&Wbp&~fB5%dD)(lqDg!$>(e9Y})?7M~@tY^^UE8?Rc z`}5a!4H^4>m40`1rzWvh_5zltyccL}^r1T%j{SApZqfIuo-gZld^TmhUg>A5)a&Sb zaKg7`H#l9E*NNx72DTmYVK6r(7Ylz7dx}4M=vvY9m1{`SSKLno^X}P>Zr|{Nz7PCQ z*Y{2#k8+_C6TKyVA(>ypt|L z*mS<4JhAWppRU`PThOOc_n5(Px`^M>rAsV}%;wqm+0<#&&;=X4M3aG)(E5M9e#fRQ zubIdqvIm{rJ=i#H@$rbfk!Ju+6Sl-dEA@DjBlbmnq_H4t8f(G-Y+a6ANFFP>E@DSO zAL*N`&}3YnXPex47|lYv8ronBmFO}sm;1hk`+|X?TAe=jWrNx@{+B**FBJSc==5W= zy$@vESeG^nUKMR;?T{15UyZ)Mnl=7vqf@`y>CA61V)h31d>hy!ZonR2ZxD}RjaZMJ zx!zfjzsj%c*GP;fwTit(6ddGjK z{Vn&k&B(Od%#eK>dw|=_K*#N7qWe}eZrzHH@>Y0rs~OpREAU%^--?ZKEB?VhXWV}O zHfmF_d)?TLul*J`ZqxF@Pu-YJ%L_~0{@bkwHcBig(>nMmHxAVHbWUPGnYO1-cjG^k zp8jTLh*}@7P0p^wAWD0Tfk(I|aV1Yi@N(Co^uuOgGk${29Wp=AJ@n5Vk=%g}}V8PbDhgjbYTj8~jjf>%H%zgG{Xb|f_; zz2o-OI^sPo-ha$^2iOBqe^poqr?@%2>GaZaui40GOS#uoX9q0ZJXDKdf2n=_d3xP-rUBgwPZg%l#d z%sr)L3`6U``>_V#4Vi|47jhpGqg47xmoPUnQTw_9eGJuH{bqn)o|?x$R%oa@(m3oBVCPe;YMtpLz$q z!?}O%824YRC372ry;V!T?E*dbOJ1MbsO6geEA4;JWUb#bS5KZkSI^z?&a{k4-f@io z)2v+cTr2mUZ&=CqZA|C3PO*}ozgeESC271>%booN-7&3}oby#Z=e&!1PqF&9`MIxO zPyX_JJ@+nN?|Vv5?zsoH>I@Zo~>z`qa^Sj97GS7woyl&FQ+J)z-46Uw=Pk8-7XHBFH0XI zzW|@VP{Ze>@dYb6`K$1Hx+Q$hA$u;Log1~}IsPJ_kLfvsx$wTp@R|F3o>!62$@hOx zPo`cEtb)(q`*DHK=gotzU#-LE$B@^jkZI(4>tku;xdk}~&npUi-hP8C&t|Aw_qRQN zyT9$4)_te_<|~=4PyL-4=$*Xp<~a*9TQB(1kn2r;c+b$m|E%WS>3n|rkFd+eUGGFu<}75~G3zW)8( zr-%P(+jrS-ex2ER?#~!YFYjqx$ZHpRpIl$^XG71EXM41qXN!&wqeDCnKB=7_aQhux zTi&n884M*q6lXA0_@Ua$ekeKbA>7Kkx#d&LfyUIj$0Y8bTDPT#&ys8GN$q`Z z6TeAue^09Y%Nf7-*{^bce*c5h{oVtIxW6am{nlZg;pg1nlR6+V`DgFp{+`s18&@;- z2={MDJ>BzlKI6;bvv*I>@7*OnQ}$$ME#&&oxIe!+h5Uwgo%=VWRyO{e``p6)@y$)L zxc_nP-;mn1<5X~YANS|;G2%sA2D!hMT5?_|zfW<0Ep;HhjQjiv_h%il`%Ae2+!ue! z$Yka&c`W(R&P&}~vv(QP4Pa|)@O?AZ-K7^X|DANuem;_a4mff*XR#puO|-H zxARiB$AQ>E)v?dOo{*V%l(qH{Ywj~a;Fme{dNb$&=R|CJG3;SY1|9+)6u3SaI&CoM ze+!LxxA3VEGv{1sXmgdZ0H0DUiw$Loe`$jg*M%n3XIPVH&k)9|x%gG*c&OTC(XVI{#w>sdhelv%~`S zj(-ju*jm0Ge0nS6sd*VT8E-N^R30Dt*!b@vd&fUVE5^s3-kR~*Yh|BKZPj>fr%HRZ zw(|sOFLW20SJK;w3%y7BjRh{f`-Rp{XMVC7@9uMH9THmG8?kSpb#K2D5?YUJ#Ev`3 zjCP!a?A4?1OfyuXZMx40w}qVWA!suUZPu9nCiu~`lU@(RWvk-0ZP4%#JQ#)tYmh57 zZtL>V>&kH2t*QTXk+(js1$MgE#_-WnZx<$>6(OD#S##V}=@=%y6(+tFA+{A+^J1+G zE8}C?%dqLlC&-gOApIGY@j>7L;0faH@x#R4N65`W#ydrJJIK%KmVE%SJ6fbaxm%%; z4Ha@p-$8qQK^DiprphAo<~ro~I_!>(#PyN)YFQK6hYuUgDDc?fjs8~X)cTkBK9su7 z8aj;Eb-Fd3HS(m4uc3o7{w3&8qQNV~|8Z4b%*4l$lh2_4o+K9f&-mC>IRPF59t0i` zxYh53^?r2JMs(E1TK-!bfo}xf2fXjK;{S=^o!(c&_uwAlJdZY*kwfIPJ=0Lb_ZaXv z@C5L{Gw5!mcD{z+O6~j~2fsh2^1G-XrktpLU>#^GtQ~p!ImxJ#;Np+x9iL4?u3O@l7P#b02wd_}1#U2&cYGnC?DfU@ zJPlpMTFV@4{EJD2b#?50es@iN{`Sn^j%l(E7wxSlxZamxeX71bZ~&S#qobP8QBCM5 z@{adV1NCT(bvVX4OkGzSai~M=Glm<16Fb_&UIcguc+iEbtPr4BTt7MzyLZlC^~da7w|6NUBIzT(V-D^XcTzt@MZo_@44t)W59d{AgmGassG0AJ}5GJu@QcWa6ncYlkX7yI%h=<~^v&DTcl)*^KGY8u?S~z#91rR@;GMSBO35+7%l_7rL|)8&GH$6Bx9M zx;CHKaq?TS<4Wt|$wk>(;I54>-Ly@}&1B?eGIBE+xtRhlhzUK~f{rBj;h7fTQ-Dta zJ_Yzxc)@u`z!Sg&&$QLCv8w4(Yhx*NsgWs#E;Tasd!Wm}S|i*x6J~}zcrIhC5OFa(;DHGckILN&3Q-ZC*r*$H4_`Sk=l~Ti$5bjVik@LmTE_ac?H}{wtoBDt)?;y%0Px;fZVC|Gw=tr&C8K zcdy09X3sgwT(AVMOPwy+b8hZ+; zvhVCYiM=ZO&XJkuG4`EV&PH?BfHJ+q`%dzy-F@f4`)gz?xQ8{Ebr}7IK4YC$ zZ2cJUIPe7Uz%x@PYV!%*DrqM45?TqJghsCheb`5~o6(UOE?pvZ=~BoscjsH0+Pi9b zD%yjm)L9>2X1^%D4SXIxdyX5M7;y8S@b?saA%2e?aN`s1^>m`n+7LyzMX;IhMLiP% zUfo+Mx+j9}ikKnbLEz#2*elzxS5{!J(AP7thg$nbId}FD_5aUAfn%>!^!1GHp=SZ` z5b&VDkwa`4cg>8*JM%Ln@66Aj`z|&|oa@3ig zJj68-*2V~HV}!MFK60qqWb=W~2R($8#Old#B^m*Mw3MuT{3RlrJq1Pq5E(Y`J-n>TPO0V z`aS5WG298f6F7UFYQIOu!#ca|Zq`}m;V$OkZsy_cI`dHN&#TPCqQ1d@QX}ii9;{l{ zW$rScEB0Wo6|E!>v5o!JA!soSE!Gg1s_~IPt3%Lo7+S7D22>wOwT`XTRc+O}RiP2O zr{Ageu_&~u@v;1#Xrq0rMvj7ern9C}TXJYRYwC31)p8UA9tWNP9(ZO((SNqEj{mG` zF4pv0tf5hjo>OR4qvw84G?FuDs^zCB^YiMgv5Fj3>$#f!r@NL8Ji`4||3kH{TkF55 zvUMx;+$+a`c0NqpAz`Rdp|eFfWaAkOt!$gR6)+4-k#Jf7IM#Aw~$o?MjY zM&?R@wS69I`#je6d1j3b-Zl^TT;Owo)8}%JVt?0+SJt(f@rn&uy-z`Z;RBf99;HCr z`N*ESM^SA+b&s-tGySCT?rMPZK;aSt8#{A*wMx@Q}%wIFzVSj0a5BZJg8ov{6o8d%<{e|3Kaz5SM zUUGaZa(gqAr;?vbZZEmKZhkL$oo-&Q4^G!;g@Ak*i$;s~^5AvzBQOfB}7IS(V zzfBJ0JGB07kL$VI<9d>uT{kCq>qhcJpCZ4Qyxz&za^JTV@_WhqOup-vdhS1e$!{C< zOta+nzD>)W4%~Pf|3jYVdm1b!sJG-At|I@m0URvyc?JGfeoJm>@(a3=AP4yL7d2y{ zA#t!|K{joBiuH}2_HHITblmgYfdrMy-c``{@;gY1D_3iwz`k08DF!1QO2wL?U48o z?F~k!ta%+*JF-_|4`aqht|IQln%8@^(IsnM-_=f+MI3$e)lOWO9KEZHYu@<&xOss9pCIUxbqHsM1Cquh2&5A~Y${Lues% z5E}dz{8klIn~V>`VaSc!sY*6-+%Xm{Qmua z$(VZ>v(g>YNKSvN&3X4SCjBF2%!b04OFnedSN`cksU5d-hWX$e?4C9gpI&Oy#~<{2 zSFS|&wP7P|NUeP5Uh>OFv4h%7e0-_B{VVyNGedmG*OxkQ#mS8S5@RK&dqb*yD?ND* zT+CSF?0ny%{Tcc3_|>VuCBG-to(Pc_|6#_Gv%~knIUgtY{?m+=JdSHpJAOF?duQtRGG&A{IOW^6O}xF+?&){Ch*c$BeX z!(EeV{{i{IPjfy}wvl^WlY08QzasDdKE^h3k86yWt|QL|XLlIovps6``}o-&a;}G} z-&2FlclkYo)E?NEr4D@jW@-q3#{XX?ed$u`zHlRX=kMYFFQxZ~mU`j;P0zIK`V}=E zy{V_y2Q#hhZzhj=ZR$Yh`I)v|=eLZ__;4PXHUQKS%o#gR72|jAv zuLWPuYU1j55?6oHwdbpRK9zM01)uLPQZFp}EcnbsE*imiL+U{CD6+B#xscq@4XI~8 z`>)9ASD>@xh$7odJK@zvquS#uM5=QoCO(J=}x2 z^5W}}ZK*erT++I~$Q_&U!oWANcO6^B%p%i~tJ>tfg_^fti0oo#IpQr~x`&V+Qxk zO+9-X^xFG4|J}edTw}&;WPLc8@%Y&1br@zOZn|fTM7qg!B_A}@%YKYp(BNjn4BQen z10&?~--9i&hy2h-O{Y`rmhOJ$81iaSSJ2mIbg^%Z^Zqh>bwl!ZVp;Z5I{RFC&rgC* z(~ELg^5aWhpvdBMW4=uu&(Y~SUHc|2KAySQH~2pf;s0!#2TrOy;vXHxe|iZ2X72Z-YxX*o)B>6pbIBg$c2*!=fdfW;lk;yCGUCmrt)sHx0QDby}5@x6dir( z!r9xpaAe1YuX8HUiCfyV@H_d4NxFY7G59xZxD(hIW6 zUuaYBl&9WFhb9(h&T{_>eP>k=N_t<$8E|l@qb? zf7bB&D&SWEzY;k8H>-Kg{mF6PgT7$9j_%<9(F^j9UO-;}#}Bh7031Kep1CC%;CfXq zotdyD-`9-|nlWti=t#*v$KTpPue$DOW~45^*E6^2Sy$rq*c^B{8(vO?*T{cWzf6_a zR{*~PUPBY>$~wH>RFuaGUTY)B0P!5#^;s3{yn%zx{QM>(V%=cOw>LQv{RZgt1|w?U z;DoI=IMMtKzpduG|0BP>-rEV$OALRI-!oNX{`kaS;QEJt`ipWsu>7V3|LwKGPZeu} zAA6Y^@b^)FJ&_u4d_=$Gh2LPjHux3PfH!zfpavX2(Ytt6)qvw0693SvR|Eb!GoioE z4CJpxzg%mEp1;RNdI26%oWJbwc`$JW>12*2NGMDsT~QTxVm-%#Be@N28; zzKeC<<+|^3t-sWLkMsEt&Re(c8-LJk!rK$9`-Zo#yzaZe+v>XSB5z-|?)zTq*I%Z- z-}MDedp*2;J-odR-d+c9uYgK;Y7oo;@LbU;Q(;X{Fj;?(xR)J>l4P=^JInZ1zU>mg4=_7wgLDZ>eux%ok0FJ z*74h%kae5Uso&;w=5IA(_N~-`-fDE|w>n+pX0#9A+h)#Y!7mXUSz-pV z_$Nk_($7A_S-O7dSF-MU`h16fAZG<5dGq{?Z!4@6+6I+@yAR~F~ zox^j1lNWO*c`>WWi)q0o2Oa>P$j_nXleNj}f`(nj_*qNDjyQXeGw>KMwjFU4om!qe z`FggT7ZzlEknsV=2h1R6Zw0#NgKroc1U~i6H=~>9n~{_*X}_6 z!aE0C`FpDowohfvI@O5i*t!<$u+%Bj|31Ka9X#9s99uY#Ev#efTJucm*|A@+?SaRD z?_&SEi~aBJ)tvXp*_O3)?zH z0!{&Jq~Kvs9h}*t$vy~p>@epAwD6tU{OumTvrbmYf;I!1c){5V&R%fF9;=ZB4{#4~ z4{+Jv{oZ7uK263hszVd(LU0b`u{RHsGg2c5_(Vq8%L0!9-}Ph@I5mM&6F9M7sKL1r zcq8ye;IgMyasEBa!NA#daK@GfrvUq+;Nj*vI1|$w#Ww^zc35t&4hbas45r4(KuI&bFR>fr$G}{KM;!np2%|^)nWRiS;W`$c5ouzX3waR%dj;A zI5D}rAGjZ!t7v8hZE9D$$s-)4-&B@fQ+=ix-E5*)@nKjdeCmdur^2g_f=-qEf1C59 z^4&&6KMkFE8sj32k04i3=llY)iKFrDcJ-OTSskzPSskzPnVv7*^nMwY9Qsah?gHm7aP9)TM1=P*8?8l3R~Ri3+Uk?)~*f)jNGww!CK@|j#3ow|ekeBg4PsLE$m zAE-F1`e1@MYtPidSvf1d2Io28Ts}WtbU8YrVjURxBG>RuxjO#jg3cfK0N=y1R$yOf z#r5JK^Fp1=D!%GmuELk`_^)*QS9$zfHh#JqosUmM$0w3M8MvG;JwaWd@yrv}`4gJU z;EYYHW7Fp6fRn_hRQ*RxzUoZw3F16Py+RGns?JyK=qjC$Jcx{t%T%%z(hqX2gKJ_3 zgo`!>@htau_%X3Nw<9O6?J@Qia3*J1H^Dgw&cQnKikQ6~1l|Fho`^N`YNER2CHEh! z8M5~%t&_#Q$H4A7^GdZ1)OAv|4Z`3Q2B#1>QR|T9%vjEal0 zJODhAPhcA)fUCMh)kUfbsjQQyvQEx3qnqckPO?w3=7IA<_}2~p zPA%@Yc7pRl*8YXY_?elioGb#q2zWQP0lnI)Z3FJ7=m_@z1sTDv#8xcG!-f0~xj~o6 zHFsa0-d65ahK*D1RTkiLsaIJdJEz>MEY9aruQKe9a<8%|pG&>UB783ODhu(MUZ2Es zKLwow<#XQxd@h~)mf$y~bKl~8-qJFe7}qWEEl@u9Ey`!keIpLK)Qrg3cN6zIun{^0 z1W)iP%#pMk4}T}u3Ug#TeL`K_wKI#qE9hJIcLQ(dnyYUO&Ri?}ZeSVwSLci>KkA%O z9r;o1ELDC~J4>B23Fb_KIg?<{$ed8;OoBO+V9vyu zGjZVR`mNGTUB9bn2F^+53^`My-OQP8=1h_~lcZ)`XWn27Th!aw3o^_d=1q42@3DUH zX0GNJFfS6!3+8WDwY3t!6TlY&Ux>U^*;?FBZ1hgI|E()011B2`^Ipfa8l8mgH4=KG zVOmX2P;YV;<{O=m-RMNEW+SRMJCS^oLEm8~ZuyL`?lb1+o1OV~bMD#4^yH6@=*c&c zulR32(UbqSTF-5IM9V$9Qt!Xp+u)y~X_?97=NY^=@RBn^AAsAYPlExOi$j<>qnb(|1!=^S$&F@+r;np zwv#XO0<;N($0yUtN9ZZ)Y)U76rbU0zbmqNneBVKiX^!)D@;nRoY*?>l+S)WDZsXIs zn|=Myd}iqF?Bn-yHu=AjvwMWzz}GkDHho=79-E`*jy*w-RWI-4l|D<~)@Pw#;__zU zX9gcSI+f?&(sMsNpl2SQrDe{Y3mrdI!M}Ew zf4PTu@tivfJzP1vGWXssdUEe)`TraBu2Qk{42RWi(AbIXU;{B&~tM?{dnHa z`9=4$)_6S3>k2)u&2$3!r3U_CCuA)(I`ySaXMTwhvzH))OYl1{!SB2nSy;?mUX0&) zF@EQyU)NLOcjo<*W@6gKX58j{ypfB|XvZaHr27&xWL-jkj!Voy-z8>Z^F_cf0)CO7 z{z;i__?9^w_=+KWAdvI^*^JkL+O%=;(`9)?GJNk!EesGdtd*6`$K3 zTX^n)U%Ss8AJGf{S9-327b^a5F88CJUu$;#V1@r9C&u8uahEO&iy|C@T35cg{E;1AXtGM<&qqMQAmpB;zxzWzoJe(n9okG;qHBIhB}dvz0M zunrO@I*|4^4roPwt-I;DdB0&@()-`zZISy3FZm7c1L%vi4?Wqyf6DcllFMBj_s?Zp zDssP8wxvRRF4UswEoZ}I!p#Xj|~V;#~9 zFzsIMaomhdlXXmFpM08C%)7#z>)+n!al+dfIB4LYfrHF@U7oRjo2Q}F10J2NxqbEva=1wDb8M>j*T~p^%e~z1jox3~ z^xSuT#rWUweB?LS#5YD7%s_{cK_55~{m=HJ1K=k5Q~u-ETRYyCINyVjOl@*uqD zfA98sGVO09#y6zpyq`{|8npp`)Ar;2H|}fb|LaEgH^`n>asp-iv5n#1_SZz1YJtAGCjCJ_xO3 zevzvRtv(vkp;H5NYJg4+@VWt94WX6%#vr$}`ajbT{8m~FLWjR7(&Cog4H<9|ocdqf z)sR`Y3*7)MK2V@VeHsjS{NPv`ckKHIel2t;jXkzar9t{{ga#RC@Y``u|MSFgANbI3 z#r>t_ps`vG)*}blcPAzX<$Ki1f%g7_99#h%=&}E@axftNn+eLn*d4E!7Po{AcTU_E zHZtg<^;Qt+TLI9mWY<47I20F-f!&eZu$aU+*Pk^r=g0CQi4cA*!jdo8`4^<)XP@x)`d5szI#Jk}%e zSaKjo=?6v*Rp{_!;H+EQh{vuV9_x{KEO~Rl6XX)c54XAb$X@c1<&3}}dAy~ZWQqF* z_+H9MrkA;y$WE15 z6~tdX5`Ucy-|=JTXTf*+g5-tYb9heSGw+u07k|DkeC1v22Ny2&kpgGGF7LWL3-5WC zUyOJ8B>WM+2tR}mLVtco+-8)sS?p#bWRdUN-Q;xY%zyi2=z0qKbD=9arz1@Tx(;Ny zAHLu`aUp#+bR*X^OFh8obm%ezy37EM|2mKVS|>l#I)(q30bQs803HLr%R{Vv1+n&R z#M<{uZZ!QmN69J9PiOpe;Kb@z5UbxttbV`r@tw~2>5L~ndU$$j@5iYz*!%IMtkvtn zoWHz8^S8H)jmy6CL39Xp7w3kj^*3PG^ZD5H2QMqvMTq>CY9d5-OZ5=+_AA#y#Q9vR zgNX5)QVm3u&!zf@h+Hq$K7{yOs(T1#XO(Ln0(>sjJ0$o`sn#LR=Te%TM$QFj?*D-AEx=rzM>U@%eUmgkDH4Lr+}A{b!}NeC*G$Eg$0k zvrTQ zw{U&SD(+v01_M7A8XWteoZqd|U?6dmcIiCV25%{xg_J3th2(E7oQ0Gro`vLZE1ZSI z8A$F~Na!Q?ETjx)A(=tuNMPh7o}IZf%G|M-JH5=EKIRT{D6Z4ThgU$K#h!AO8R8Y; z73CGv>pXM%-(9|a$k$f;%xM#wGMZZV!YJ;kDU3rZ|-<8)lbY6LFL+_Q>HFRHj zO+){c*E4irc`ZW^me(S=#lTc4X;Gt}H$MH`J*eINOz_@ZHqCw*RLqOX0IGMDH#W zSxPPW;zs1~Biw&hYSW7QS>ry<{b!}T-+mp}4|9M1>l^a>ySYEMnG@pv4|0F(tIgef zrdCPpiAPhcgMZ5Xu{myK4c^hk`W5{@IV{WJxK5MvzsBXT@g?Mt8mOa<#r5kue|S0k z+UJpn@3?aK!f&F;9_PFv4?FH$!S&^?9Bz68w&@EC3OenRjmX9kR}Nozhty7s4LURR z!d2J;-q*Qu`1D^A6W?{dD~IcLW%>LAR}Po_jJkjqKJ3cjvnO|<_x|3M!zBkFMTY;x zmBYcdlb8#V*U4VsTO$8*4mL8G+{^uc?8@QZZ*SoDKjHq^i=O68aX-8ByJF|3FW|fD zYjFMG1^a%0&mOK%5+B6Qfa_bl-3jCa2EGj^WCe^)J>Yca=NU13o)fd?8D083rz=0# zh}(0WxHZ>UpwD#{dGUP$H zIBLs{u+`#(^%jFOC>{FOK;J}FjC;Q2bLQ(lgFIhH&Nz-8C1+30zS9?&p=k^FeURUe z=ibMT27m{EcL47w+kdfah;u}>vJZo^JTvlLd>CQ}Mu1a)UA6^7z~y_%9t>t9{x-f- ztKiy%fovor-%EC3g7K61Ua}42jORNvh-bWZfc?efaRVIKCxZump9p@R zD1MHa8?82}a=?h~gk_$<0U|@uLhb;9Dqv2Yd(~&wj zSNmLQai(q-pG*Ln1cfH_7YPqxzxH6i`t(|y>E|9E!v5{S{`HB!OTqb|7q}O=7r2-4 z3eE?KT?~1Edw^3*kew*b^ysMJa|k|%;4?nA!=XBSR&uTm($8SX;F%1biP$AL1>j?X zJl(kD=^ktV-T=G-xcE}Z;U(vlx)t~&@Fw8oOY}4Wm-CbqIXTz}yb*XKaH);2q8WVV z9AD1tjr1{>Hj}4D-d2EI>qM6P>(LJQ97DF_$abJ`{-Jg*IK`0dm=V#*PtL-3s|%dn z9C9aYckv%w%Xa}Mhh;S4kTcHx+~UlC$FG+48(`?nga(0cUr9nm1F-BQwe6H<@mqER04dL8~_jbl!+1UMf|^w_joc-n|e zpr7-sS+=ZM%AB@X({$FfJZqLM^s1WEj1K~@%rjPHssnfj;{%LGPjUYWJHg*dZ6x!< zS&-Mb&OGU6y)Vdy|1MyG-uX_)T^7RlhwI4Y;(g0k=8~Ftu1RikVuKXKv zP9bt{$T@|`JM+yDIcL1s1FWSwJzL~G@5(c9SB`lE3ki$8y92Vx}?fiDCL$4xeI0YJVPFsx}P60jz_+;SH??vT75cuybhi0q~ zd$U^pc;@=_PrLa<^31B-5pQ}3ni6-49`OKI>5pFpco2BNg-_<0Cxg=@aGF#HXJU-{ zB;akprDv9k^MvFs)5aQ9#@i~-yWfuY*iCitrl-(D%!~chhaPFHgE#wl;6dO47q0SJ zoi8e{tL6*$|E+b4z^6gCY0zydbmL4v?4YW>MTyrhiSzh=%H{RIb;vZl&R6cIPSDP_ zCdzBIZc(L~TI*RwGxpBd*`wIm*xR9wqMe<^&hEv|-dt^G7vx*^7OK4&DcRZB8#2$4 z?>u@{k7I9$y{XhTSP}T(+S%}d^}c3Khk=LTQwVsdj(n@NN-EB3-OvPauHIXK(;vXb zw&p;SInadowtY$+nw``oN3mdzmXk%xwv9Y`3o2zYXm(OFT!N&>N z*vvOo_o_C8Y6Da~GvieoMCG$;gQ$Ei>h71E&*L^j0q57%k!^K8tFo=^n=MuMs(UGQ z%~$qP)`V=16X)~5#dY|s&S!Nm^=i-OxybHZWcyTP`&49G<@2e)E9>}FKA)%#I|tcP z*J$?V53w)b&z}59GjMf{W`7Pm2t44znHxI$&-{Fzc|Omq%C@>^R%JWD_yFVQF`nG7 z8l34Zr_TdE7dUxI+`qy;K5@ORNgbSuGdc7R6>{mxsjq`GIrqSW@znjIsi$9lqS(E(^_Wj8_$6SBzXUzaP zS}h*zC5t?4Pjh+SCOr`UKYMQ;A4Q$#|5tVOm5>8y5)L^+suMzp@hC_FB6cGna;+DL zcw&R7<1ro}B4Bztfgliu?NMiE#?c5thw)gZ44{sfUWq!oIO{6M%&zN<4C?N8*U?cx zXGZuwKh>S1K2@V=@*RJ(kKZ5l=<0gc@p*kd@B4FgozoWPzkObt@KXnO#BJqG!e8y2 z-&V%|u5;YzSI7VDoaaX0I(}^DTsIM?wa<6U67$`#pB2N^j<`*XohuS^*Dim9e18q! z65qGxz9q95=TX5p!1B}7j<`*Xt-~h~aT{^kAM~<~_$M2!vD@VQ#XL9>_wl}txo{%x zD`Jd0V{yb>d@pfPJQL3<|4f}RmR)5&AoD}h{`4!fv1}*gd0$^tPkV*vI~Bqvo@c|hbOZc)5kh|RxZ33x$yG&eXQ|(y%-Zw zc1s^C2cE;22-ak<#`EPcCL+8sWaYkd852?56cTxF#?9389mc0vbH-RlL+x|FrPFH_ z^qW2ZA=b_;XHAoelvl5O9e+GtndmxaOsvgW%=#bUlwU6uYo0`9{Ug_zY@22MCEGc< z&SYI+t20qoqK-t}h&mB5n8-;xFcS~PL(oIeg$|K1%lsf?mieKZn63H$GG_8PV5$I9rPU`X zW2P^XvAf|^Z!k0GP3Qay z9JqrYB>j+*`Qe+>4;JQ#7>{VziHyC(7i8>aYA}5_*cwScFxHa%L&rKRv~#y?74H}M z$s*okvsdT?=5ty$(6U+BIQnkLAz`z0%U%ha86PNov9#S3dq!G(DB@I4`dTeq- zZ6fO>xlLrfB<_KyH(Mv`IhOq>whj?{l;XJ|TWz8T4{NckrPU z4>|Zyj+`MGee*V(#q;D`(*5$#@xPjwHv(_7Rvgb;F-tOwn5F!* zA=Vfk5wnyeZKCWu4c)f> zmSg;dTxaCgY~wHFI_m|!SC>A0xz4hockR=+)tRU(QAeU~M4gDb5OpB1Q&tzut^dab zvt-NSGG@D7Xx_~no;v36Okxg?SM*uhF*omK4p1F)fF>~qi2Ol$lO1#O?kwn8(6gXB z`J{Pw5PA@L5W0g;zB=aGe|Nzw*)j)a*4oF`6{UuvgIG^in(tNI6h=14Niq(if^iV? zd@p$oEO`!vv(D^uD5N?Aa{=vKKsy)E&a6Rr3o%ff7-*vyzg+-t7sK1V;q88D-j3`6 zGkM_@eR3-OqEXgQBo-`X4csy?m4m4yPL4FCLnr?q4f7t>$A!*VLokcDupjRf{ndlh zIwJC%<{YbGZ+qwZkM_2Ajs>*M72*Bp5EUK5SisV_XnSN4d1ReJbOhrpPKe*rWlr1F zqup+M=eP@d+dIc?Fg}JcFr8}&=YS~(OpM#H#`4K^h7M5C0UcxcY;^|afwcWV+I}Ey z&zfU-U7d)h&cxn#_8JS=0*15?+&RY|W!<-S!}ubl{H zq02LvYY(_!#x`M}%CJx6!ah0pU7A1R@NHzwvOg$emitv@%yPeKH!(+k;ey#V=f?%J zZ9Zp5PFLh$#eA#1Cy_%f5aR_zerd2Y7N;|(o8EV(Gp8$Zydo#ueDD$GS=IBb@aa2q zx*|s_a>AYKm!)&Uookq-bHW8L9VUls@~jxsz*=dUoNjt7PS^F!L{7Hrnr31wPSQIuD#L) zGyG&5dn03(#@_rw#jjHFyHtEp5r;~c9b=6p%nn~!!tC&syNNk+o{Ox@zN&1`WnWbT zvj%1j%wlYjjM)R-1Kk5%$fJyzcC?K(mNCn|ZZ|P2Q5VdzuPS4feO2c1*D;TO67%@I z&US9z%{l;etOGEKbpYtskuf`cT{~u{uiH(`t*5zQmVH$jv+S$d*QAig!OLq>NaJ(5 z>+7C?uUdo-E4F-9ONZ5p8~}NR6#ca7aC}knJPu!#yhLg^^kV4v++X0Urt<)O(Gi8{ z>O%ag0{kwqZnwnm(E{iN(8=M(MGjZu_o%GPWnWd+Y*U>16%lt0o0Uf@oj9K6dQ#nqM7r z>(5;<%j0Eb%+h$-Zu^SpkFTE>Jps&8Oi=qcJT2#b{@T9c|LeS_ggNqK7tDWcU-AES zUQ@!%T64~J{%iY+_O)STAFFw{oY$1?$d~0c+jUsK^d8x*cY|5BBXV9-ww-@DulbM| z+hC2Umvy7%HySp@@Ogj?4^lOsS=HT@1;uEpgqm-KxIrK2}V(3M$d&C%D ztG~STG+#%5c{u9p=r1om-`CM!UNqm=(O+J9i?5@&InF4bh%uz6_VBQR7=7JXQ2J@SuPBiMIGY9Fc zGkXrwS!ed#mb1?6>#a(4#yAR}P8~6h!lzRwI(4B_2aKce5fi##Rty)+Qm#2AW0rHx z7iP;`MI5FGfhi+q5j<{f!Y>or7Y;#yoHy*_11hF|mY)$~16Ts#K zusH#2jvt%j$L9F4IezR-*8gvBSW`)i&-zOCMrm?sD`{;3M_c`k+nd&nE|~w9+nd_& zxM2R@Yi|^5{es(EF#qqhHx_1PfeYsUz4pe!+)ei$Ag zzQNy(;_u@Bmd*DO-{23&@rO71+V^gGu32*rv&4P^ zr)k#QLotrGII3B555-;rMdxeQ+(R*rw{pH_%{}ZT?8GgaHTO{LB~TvMtht9ddl^@> zk@f4-aY?36<5rjY{c1Ks-owF(SB@!ccm+;@Pv8=G1P)PtQEr#=E^;aFSJUtEm;`5e z<#?bw<-N?MykAW>%VTGq<&}N;?v(d@m-2o!y(*7Sc9vK6!@E=7DK6#xYC2IKTkI^a z>_c~_yl1$S_p9nNzb5v34C5bqRKCL|N!+-YSKl|{Xz4*`GL`Bq#?;H@mbE33f z(MGf>i8A(iDxR!pk8*6{d{e!Wc%)4+8a?dMcP)GJu}5F_0U%vMgWAz(~ zS#<~J|H}10DCTyKyhZHG_km(=ctk0{134k^ZhHA<|3y#=3sL5&R%^H&tk-%(>;FY`ydN^DS8QEVObaVwSB zk9g1M9ZGDlxUZILS1Jb^jvOyr$#fj z*Ql|-f6!w*)2NuQfaBE%*|+n0u4Q{}Rw5pws!Tojod=H@&v3mfy)K)1HQBt!&)69D zcRc<}_NaVKG5+`q#k`YaT#XvKE~JFka!=h<)p(XeyDn;sy^g&#i`d_AD#u**%B+bR zpT4Y^PxJkyuTa)3?tf4b-%E}wSCX#`Vn4v%ijh4%YHoNiV%D7%H5(fv=FQhB$>)bD zp|eAZ5!2O>!MC)Jj~lmrtQt?<#J-&0RgxQyA2&YRzV(tBV+k zn<9D<{8J1cg%`pjwAsfm(3Zb|Kf|h-H;3==o=^XY@*HC?N{*#q4E9rv=NsVDl^pM= z=54P*|5vVYqULvQjlknkqahd-?>3ga ztQb4tn^i|5<|;pXb{>iti(XJe)%}&^IqVVn-XbNrgY(r#j~hqf!5x`=V469b3mcpIQn}f2tT~!N)(!vv}Ja{epTh_~|j@ z`2aGV$NsU-=VSMI`z1E>uAj6CUh*3W?H1p|Ms__cPxu>Ycb>(WTFw4S} z*z7}wzGvNcFz=Ml&9TtC-sjC?|0#I0!JB8v(nujoe(HCMV%&8Re2;$my)c^R{`&!jCEIE2^0_RyEhKAMLSu;2g<2M$-1^ znbKA8;w$KZS?EIcO-r23w+z*I#!$`Ul=F7V%RaQ`XuiMdMfC1I#R!(Mcj^Jf^uMAQ z+ozzXz5IV!No;Oo++{s=i5~ySWW`*Z#%kUT)<0gtp0$Trccd43W}a${o~I_oez$AZ zM2zft$oBQf?BS@nm@+@}8g+A}lFUXQc+n-}9#lflmMfv@>|?v;lBkjYV8qD(J7n&) zNT@2TghmfUHde70-e<>++tDXap_{6H!`_ugjvII0M;S-5KkloF;lCav+-))ztXD5FO!v69pyDS7E|x5eyJK0j4TXzEbKxOS-$su{rkxt|_4?sy;lz`d&j)_rN22VccrY{+3Hle0Ra zSJFpPK_5vueI#Y{k+4S>IdtZ2ozJ?v^XW68kE9|_p9y^=Wli*%Yzt_Qyoi1Jtw(!g z75Y#7PC=ji){}Ug{npUw3FJq}4R#e4sR^C;R3hgiCPQoTY9+j{Yzn%o5B&^&+AQTU-o-{=yI3*a z#U3nU@8P@P$4}l=jL!tt`Ch$<@)vJYV>$k*?BlB#x9wGoF)_`oU!)oJ&FszG0$(iB z*e4LaxKJ~ETd1cduQ3MSqbmJh+-I!1STnp^6l45uo^Mgi7XFLtIrZ$d%lmvcb-u5P zb3g4{&-3ly*l{8E>`;sV*L_!L<_2_f3w}V=OZWj-a6iARW16veFE)*GR-dgI4d-Y^ zfVQj&U?a}a%*H(A%g~H`u2tu&Mh)lC&9xu!Y_(A^FKzP zPuydS2Ky?$Q@2(zT6lk87IpOqFgFzV|h0gxPJ1JZJqu4&~$(g{t>h zHSgNVd4Tc-lO7WtW^BhM*CaiLpYtH^XuRKJtfKyFxMv6F!2sXk9f98o{`VT=S5uY- zeAEK!bsxI(QN{Q zd#u;}JJ&a9#^=b%vHyTS9;e*sEOC#YcBsGD6Z3AN?zgB$Zaw_)J>Ge-$Kuue-@|K5 zRddHlVBgMhl)4#^u4hrUs>k6E!8`D^kNR1+78#8PjGE=ti;s67QxYdf;j2D@*sAxD z>$u<8`5w6Vu75YWjeA-iQ4+)o#?IT|la~XV=r&BnmyA?;y&YU z9D!CoipJXp| zYtMW3Nl)ewD=|Jc@ld_0J>I5j&B71!spi6F)p)Nz`?~KyZ}lPnGvCV|$#c-nbMG7*m)WE z^4oy^MCNpS#kAbPpXeWBM*%X7+@AsOmof3(kBqV(xoJMjcdz1|H+Fuv`o^?QTzy`L zE-`j;F66L*_XRHJ8}O0XlYPSFl;JA$8hrmJju!M`{S50}#`qR=Dd+3zX*2X-MuyCt z)!efa9rSZ_F}f7pZyw$&c+hXIZ$TeChYuO|n|W`*6T8qO!Tlo%l+~3IcJ80*-MBN7r^IPy-3_Lz! zhFkoxRRL)GKYdGol&VO!yvOU>Da6&MBLbI8`(9xK?u$vG1uC z-AD-Dj&RAuRceH_}8UBWs(LdnunJeE=jHT$3&p3n* zO;n`IXHx!M71%1uoVXvIO5Ir3(489Byp%2RBae}nK&Sl$nUd_R-G8Wg~Vh( zLKmS=&!8>Nq?{`)6f^cqV3Tiy>3EYk;$FS@a8tJrTfRc zn&v}e89ddCIw-r^CBie#=$;oM!~@Ek6Km z^i#_suHBHne**8=$+^%W4HtKL2j_`J9`g>KTl@yR7WJBW=(?6Ch^OPKv1SBu?N8v1 zAZ_s(ZNU+Q&+0Don5)mg|Gxx(`vH%z9p<=2;Qdc@Y9n?K9WHF1AO5Q=A&x9Tr(^qS z`2N$Ed5m4yzdGW9#O1^fGl(tkQH@n?wBa@I$03zm4E2h?V<6i#Pa;dyc`%E2?#5TW z8Q%Rb+HShV-zND2(>O?skn#zgDfD-&4jZ=XpNSEcQlHe9pPa&kYly={z0{(I*LT)I z4d*g&urx3Vff`e;vwu_3w7s17mzQ~PDy!V-oyBJ9Q8j#SI>t3UxRmk4X(vJ ze~|l#T^Z{VtJ}o&P3YiTJQ-cB3O(7*=Q{g*Svnn_w|v8U&`o2WA)oUoI=od)W?TB3 zH5Jj*=x zc}E%kTSG3_(4`G;q<;mi`a+(=9{I3yS!1wel<&PUs<{Z6dr!Ov-TsID;(dzwq4Ixqdm8}kINW)3?(J~^>+a%361V|>0>5w^#;17Gy$+h84xPcx*`$Eo2w zh<>hzXWRWA6W;eB-x}97c%eR~n9nXoCN*>v&j&uH%@?8H;F|!y0qSA3MjKKOCiT|~ z8ddk?t1sdG8GEyf^SS{Z%Z`8YCV7Uq z*J$}O?fH4y=8SEDw>V#e?A5R9Xk&BNI&97^?8npK;(p-=U~{zclxo~FSvBDsY>r3R z8?*6k_;o!t=NP=pkv|*xCDtFmUNfJeOc|SFdWpGrPD00{;5=X8naTMF=pEwp zMxGTh`5BZuaX0mO8!^aC+C}hQ3_ZD*c;)w2{Tn-X5C^@G&fiWzU;1CPVvCq}3Ey2p z9b?y?{wcf*A0=K@kz>ks0J;2C+Q+GZUw3d0Mq@Q?kO%HD;M>8uCCli=4d+s~JaY&5 z@X_HNpCQVgk3Zn0yt{r!xha1h=NoR|8o7~Yxc2iKh^fH)XXV>wzL1gqd} za#6njrflR`H0(&?Cj8#{_(k|DjnunwT-8pFGxqFtVud_avwS9WKoDI3KM6Z!j7i%i z(=3B`M{1^q|FesB+%?kTWwY^G+MYIr@9?KIGr@Tt_iVV1dj%gKw6K`F_%CFpQM~7$ zsoNi;dk=HKgN;A7Vui#h!cO3?JAk#RCj*a?+UQG}~2)$u0-D~*{ChZ{N zUUM}%ZZ+=?`>}B;uJetI-y`C9;oHW%yt{@&$Qklx>H6}IyrN8uW%Y_RvdqQQ1@F)+f9o-q z@s4`xOyow0|3U%s`=7w;%MOVgEO9D2XUtRR&+Q$$(x~QK*uzTfVc<>lCbA&xVfCBb z!?};L2KEsHVh>M&zZyQ*v{O>}j~hIuh95y4805}7?IHK_Oxhm)(qmR{uylLc9>+mUGMk+fvDGnf3%@W^PsW&G*qotV zY!2sOG<{cgTr;b$@hIQ)1o`g8RUv0>P}3Fw;uGPL1t`1cO}bBsY3 zW{pQbT!d{riX44L`;Fk9$ZHWxWqFBD*1&7^wBu3Ad@uFMu>(7m#eEIb&sjB;nRZ%D*~u#iAH{qg{`CJR z_buj|uzlHo#+hm z`D5?qo;%U^+_#22NrJi@_XEZBUP&G7#s>VDa#A)Qb@a?iY;+0NO4Q`~9CB0!amciE zTvh!Py!DAyW)X*wg9sQCUWV6R0#DK^zh$R$)*$ETK8@J^Y3k1VvWlOIoqL%$^95vZ z3pNH`t9pU*-bbv1ZCQnG4Zx3M;KS{l3*Hp<*h|-pRWEDi^8Jdjf_#bao2yR2UXl~b zY+8LbZb00R+SotwL|Zmhlu8;O0Ut%S`p$8ADhevS>KJ?kGJ=e3o(n~CgCCe|{9e&&A*{U+2w)obL* zczyyt0{t*1K9-sPxoST1B)nbEK@6FFF3-TXMXzzc24W#`N+cxA_RoF9URMIUB?mG3cDAA}F@K)+=1of<1AW(F5>&k|yt6f(rSOb*{7 z{E9>LnZAMDz(@J`fR#Hi0`Fs!&`Av;>JYny{)&08Gw*r-zU^=js$z!x^q71|rEk9L_7dc*9ryAG1OBwu`GN|y}Cd#nx zxY+`&>pfx($$FnC?*Q{K^-n&+s42is2WiLI$k=Rj=TFsSkUHLu58!W&;0r{|`q>=5 zs1YoP7{VV}d_V~`1bBw`?_8%QJ@^4T#TX3_{nYEC=ITGtSN+qd5qnp$`q$6tuNc?7 zq=c#pX+Qem?zjeCcn7)u(E4xQ#{VjGNdxWb?;XV#jF_tz@$GjaTA65{owN_R#PIv% z(m$nrk@p7lq|iUB3;Es-#W?(H%JY(_SK1!A!=E))y~q3fYNA-g8Sq67$7&yAD$uLd z=;Sdw(m1?xpv|%P&#W(q;`>Am|C|VRHzMxEmxx%l9UsZ0?akE-_~!nI=`W8O?;ldE zJ~uFm{A;qMKuOjgK5ic7`#a#h)$h?izde!=eD-LwqHk?e^vCd@o;WPl5zS((Ojd&a zHuPgwVq_{vToz1}M}z38U}97%pwai1V9t_uvKmO7oD$>Bv#tL45#)YL+ZY?-qu;hZ z-A`6V-6%vitk~s&Nx`@ahW{^PPWEW3`?^U)IO2ZRR}>`xNbo z$@Jyc(_S7ml%>IwL(#88RqaW>|D=z+2fXr(usP*XvEN+Gi@rJIO~y@J9}S%`D&0?; z_h!^=oE61}MM9%TD#@qlqrLrmN^%W-w4bcOt|f>I{)PAR|IUBFo>0eGXP`$>d+tcS#4(i~EdTi^p5flD18h#A#B_hVbv(Q6V;SXP@ zB+X&y={qB0T!*;}UtzSaCK&_JJ|@Q)i(U1GqlT7*?>^?(A2nA0K4Kc^Z2#M|-x7G? zwTKy8z`H`3u_K8zZ(CzWZbSE7!&nS)-!+->AuaIhZ1~lOJ~>1l@-RMg8-DU$a%8D5 z9dAMV{5O5GtVtSY&Gn6a^|Ik1z4SEpEQqq+`1$NvFh4}DiaibD>}jx(Jq?=J(_mX4 zG0u~*ROpg=_(Jdq-!J|xdylX-d}WHhUe?1OLEDzpqf;kS#wNyJ`9%K}{lDATw}5-X z+#}ClD{ji+9ju?u`tlX5FE5W1EpN)^dDhd19)6v*=+zv(jH6U#t@+;KJFGvi=IKQo zm0Yh7*WvWjXsrE2y?C|eNuuxAuQhwAfAN1ex?TL%q310+b!5@e z|NLj3FXcs_tMq^Ko)YS$9C}Hdxr9w(Zb&vX>QvmD68CU#T>NrRv={FX&-Q{Igw9?A z7G2!$(MCmcps@}=&sMNzi;PUKKjDm!#}_u{$zk+em)c(I1=4A4IQ?fca4lDtA;6|bI?gk_VYVT zF%~|egvOxveTR=*ea&l{BUW6Qy(RMX+AZ>Vy4_l-m#93qwl{pkT8t^yq8IDXN9DC4 z^WYoS-G?52JrAD9h9~kmd7}1ch9|Jq(O`%=&`wFgeckPS1XHZ30?Ih zisR%<l3)}pm!Xs*Eb^-Fhcn`r3t3{n@;(HcP-TdK$zd_!_9wLl|`7Lt1k#(e^ z=*Lu$U&g|u(3u})(Wcy!ZVPCP4?mxIzN!{F976B>R`8}LQKo7MF}Jt!b@-C;Yl@Hc zOSvyRpLO=hpRa2iVVI5hrqKX?;RxE&Yv7;YSB^;YZVJ8uli*!+fW^D_9!>u*<^R2c zcj1fs=;OXt@F@PsqU}m(?@91DJSF&c_F(w-W7YU?!ME74!au3TL3r>|?%6B;^K1-$ zh3^xkYEba6;Q!>_z?fKDK(nZtjC; z@B5=_!n2_xAtm|iK}xchPf30U|8tPVs{xBwJ-$CA8yWN0s0rTmn@bAdQ)Kl^_%x{n zGrS6~S-d(7zwE?#)m++7F^&%Ti+q}ZPtDw&__n#K7LJlHSdD++C8qlXKapbzb>POM ztI195tj6Dr`^GL6dJY)IVvFyHJAP%fEWme&V{`jx=HwlU@!|s2e5VZ^KpSa1U#ybvK`$N+k(V4w zJ4J)$9mvq)!9pM5ho2<)Q?y^evRCY*Y#tekUKHhcU5O3QvSW3PnqmAqW4vzh#O_%Q1`J;X8!Hk5amKZVb3@f>Vi@VRLa6Nz#p;FVI<6C0$J@_kRt{{&-D z=}%=XFl?qLHlWR8n9nQb3(qUYEcD*N7u4AIHStc(D(~q+52o)unA7%W!{DB-_tsIr z9(>(?-15KR=iU`D zf&++`=0?aRMvTSO*OLD5>8r#@uM#_~ikc0J@KX;*&G%L+Vw`U1g%JMw8)}#F$mI5} zCfC zO5D%*Bfa!>^wR6uF)uL`{fD$OI(;WGUje!Q6!{L~Ci)RIUG*pQln*=VOH@XE=sNsJ z75?{;XC)Rs6a%B2Xmi_f6 z*yq}4d6BsMhm;+^qyEK+am`UHHcY;VoV@$4lH87bts+i5!hIrlxmLWZEuvT4(#zs; zd?&p~_>=Q^2=t+xx2tN}h?GB3tOjC@)5u+Lv=KMF$nQeN&u8Lo zYbt6IzIz}&z1;00p_*sd4f7&pkYAj>veM8}&VZzo~{7^^E*$l!D>?VtS7D(JmK5-r95HQ!4m;^ zqOuR;Q~Th1tIW+(JM469>lgDgeq+qVqJ6d4pabZasMj2GL@}n||4cbRUSprIXXus)x+NY! zru+uJmAL<4_JKc}V;C#KGq(HN^Dx=IJach>p^GeCY316g;2HY9i36z1h0GOMnD$3X zReT`6yW=J7R=z6aIp%#|_(!U+XXYP<@Ez=yXAZfWf1?|zptivP+tFDFle-tg|{8~s$Xs-J2c745~rSR13| zSByiyf*jvg^gh=P547@Z#&%@Yhb~>SmmKrc^ncH`vFl3m!L8&au8bJZ-%Wq( z-H`;b1NDbqzB)oV$&oH3=Kl{>#Qe$EhAPGfuc@I4`2Kmvj+?iwBnL~}KjAzj*~tH6 z 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

    <`3bF2YvrWXU+e@wR8RU59t}R<`?6h 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

    8h-~T?&r(@*;(Vi;O@k=zYd!h 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 z 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 literal 0 HcmV?d00001 diff --git a/benchmarks/guest/revm_snailtracer/openvm.toml b/benchmarks/guest/revm_snailtracer/openvm.toml new file mode 100644 index 0000000000..19a1e670e5 --- /dev/null +++ b/benchmarks/guest/revm_snailtracer/openvm.toml @@ -0,0 +1,3 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] diff --git a/benchmarks/guest/revm_snailtracer/src/main.rs b/benchmarks/guest/revm_snailtracer/src/main.rs new file mode 100644 index 0000000000..a266ec21c4 --- /dev/null +++ b/benchmarks/guest/revm_snailtracer/src/main.rs @@ -0,0 +1,25 @@ +use openvm as _; + +use revm::{ + db::BenchmarkDB, + primitives::{address, bytes, hex, Bytecode, Bytes, TxKind}, + Evm, +}; + +const BYTES: &str = include_str!("snailtracer.hex"); + +fn main() { + let bytecode = Bytecode::new_raw(Bytes::from(hex::decode(BYTES).unwrap())); + + let mut evm = Evm::builder() + .with_db(BenchmarkDB::new_bytecode(bytecode.clone())) + .modify_tx_env(|tx| { + tx.caller = address!("0000000000000000000000000000000000000001"); + tx.transact_to = TxKind::Call(address!("0000000000000000000000000000000000000000")); + tx.data = bytes!("30627b7c"); + tx.gas_limit = 1_000_000_000; + }) + .build(); + + evm.transact().unwrap(); +} diff --git a/benchmarks/guest/revm_snailtracer/src/snailtracer.hex b/benchmarks/guest/revm_snailtracer/src/snailtracer.hex new file mode 100644 index 0000000000..e69de29bb2 diff --git a/benchmarks/programs/revm_transfer/Cargo.toml b/benchmarks/guest/revm_transfer/Cargo.toml similarity index 91% rename from benchmarks/programs/revm_transfer/Cargo.toml rename to benchmarks/guest/revm_transfer/Cargo.toml index 275d5ee93b..eea02dd155 100644 --- a/benchmarks/programs/revm_transfer/Cargo.toml +++ b/benchmarks/guest/revm_transfer/Cargo.toml @@ -11,7 +11,8 @@ openvm-keccak256-guest = { path = "../../../extensions/keccak256/guest", default tracing = { version = "0.1.40", default-features = false } alloy-primitives = { version = "0.8.10", default-features = false, features = [ "native-keccak", -] } # revm does not re-export this feature so we enable it here +] } +# revm does not re-export this feature so we enable it here derive_more = { version = "1.0.0", default-features = false, features = [ "from", "display", diff --git a/benchmarks/guest/revm_transfer/elf/openvm-revm-transfer.elf b/benchmarks/guest/revm_transfer/elf/openvm-revm-transfer.elf new file mode 100755 index 0000000000000000000000000000000000000000..0aa22396e60e2e77f00474ae7463091a5dbdc9fc GIT binary patch literal 1885496 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

    iAd|l!PspF-1 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

    XP%EB3u)AnYMXPGuRg* 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 S-Z}Mo-7UJW*SL40+I7DJ=6n+X literal 0 HcmV?d00001 diff --git a/benchmarks/guest/revm_transfer/openvm.toml b/benchmarks/guest/revm_transfer/openvm.toml new file mode 100644 index 0000000000..93998f52a3 --- /dev/null +++ b/benchmarks/guest/revm_transfer/openvm.toml @@ -0,0 +1,4 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] +[app_vm_config.keccak] diff --git a/benchmarks/programs/revm_transfer/src/main.rs b/benchmarks/guest/revm_transfer/src/main.rs similarity index 100% rename from benchmarks/programs/revm_transfer/src/main.rs rename to benchmarks/guest/revm_transfer/src/main.rs diff --git a/benchmarks/programs/rkyv/Cargo.toml b/benchmarks/guest/rkyv/Cargo.toml similarity index 100% rename from benchmarks/programs/rkyv/Cargo.toml rename to benchmarks/guest/rkyv/Cargo.toml diff --git a/benchmarks/guest/rkyv/elf/openvm-rkyv-program.elf b/benchmarks/guest/rkyv/elf/openvm-rkyv-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..528106e233af9471ab0cff30036e85022db2ff95 GIT binary patch literal 65628 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
  • 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 kFZhvr$gh9@^WcE;+tVw{qa^s+aX4`Hc^;Q#;t literal 0 HcmV?d00001 diff --git a/benchmarks/programs/rkyv/minecraft_savedata.bin b/benchmarks/guest/rkyv/minecraft_savedata.bin similarity index 100% rename from benchmarks/programs/rkyv/minecraft_savedata.bin rename to benchmarks/guest/rkyv/minecraft_savedata.bin diff --git a/benchmarks/guest/rkyv/openvm.toml b/benchmarks/guest/rkyv/openvm.toml new file mode 100644 index 0000000000..19a1e670e5 --- /dev/null +++ b/benchmarks/guest/rkyv/openvm.toml @@ -0,0 +1,3 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] diff --git a/benchmarks/programs/rkyv/src/generate.rs b/benchmarks/guest/rkyv/src/generate.rs similarity index 100% rename from benchmarks/programs/rkyv/src/generate.rs rename to benchmarks/guest/rkyv/src/generate.rs diff --git a/benchmarks/programs/rkyv/src/main.rs b/benchmarks/guest/rkyv/src/main.rs similarity index 100% rename from benchmarks/programs/rkyv/src/main.rs rename to benchmarks/guest/rkyv/src/main.rs diff --git a/benchmarks/programs/rkyv/src/types.rs b/benchmarks/guest/rkyv/src/types.rs similarity index 100% rename from benchmarks/programs/rkyv/src/types.rs rename to benchmarks/guest/rkyv/src/types.rs diff --git a/benchmarks/guest/sha256/Cargo.toml b/benchmarks/guest/sha256/Cargo.toml new file mode 100644 index 0000000000..6526600801 --- /dev/null +++ b/benchmarks/guest/sha256/Cargo.toml @@ -0,0 +1,17 @@ +[workspace] +[package] +name = "openvm-sha256-program" +version = "0.0.0" +edition = "2021" + +[dependencies] +openvm = { path = "../../../crates/toolchain/openvm", features = ["std"] } +openvm-sha256-guest = { path = "../../../extensions/sha256/guest" } + +[features] +default = [] + +[profile.profiling] +inherits = "release" +debug = 2 +strip = false diff --git a/benchmarks/guest/sha256/elf/openvm-sha256-program.elf b/benchmarks/guest/sha256/elf/openvm-sha256-program.elf new file mode 100755 index 0000000000000000000000000000000000000000..9524e8f552f4e23eccb04e3ead5166301b99de80 GIT binary patch literal 64708 zcmeFa3!GEcwLiX3PLg>*0SN+Cs|PYOJcN+s!G;z%*9Irm_*N zf;n-E(gL8Q&o2C?kKOzfOQT;38;39YP&yk!cW{-{N8_I{m*F-(4!UoqkGUE@zozle zHWy>`vF3k%F=Nl)r11}By9*y`7v;b7t&Sx9JpAJ6xT!MM+TUDEosOUMq4Ig#ib?sV0q%yb1=LoOYm>N6r)vdQFEWBP}Ima00su;uWfPH?ut82AkcZ|(dForzL zUA2L^Ye3hbF_(SLrWV#^Q>$07T=ug}cLWtTt5)1K4>Q+^%b9*bwUS%oU`E$^(A2Vl zyY4&aa@3-HJG&!BWykil>}@!xR&Qq+l%dwtGWU!PHuv<0ZSJYtZ7zqRBA<#h)jdP8 zyQkwb6`vY>s_>bNkA{y&vALYv)jKfiZ+Ed#XpbXPUF%S56i23JJLpkn70R5v-R9O_ zp!V94Zb!Nu>8jha0rfu2+|#!+_tY1_S4GKGE2^>90bbXtE~n&0tSh5!cdFoDrmEJd zPE(wjY1F1c=unbX0-CxXu5Sm_2Yw{~jaonwQ` zv4XkE7`sE`Jg-4Lg>jt#e`+E7)x9I?H`}NlqtZFb%{H?>XD{-2*~V{eIbD_iSPAP54aTdI)7H?iskB-tTnx;@-XZ+>g%# z_)Ok<$X$g`4d_0oXSugmDY|oi%vH`XrpVLeRQtO3quqNIs-sZu;pIHI1-x<|%5^(! z15HmJq<-i22U%{*c;*U^XMKD2Fyk)gsNAX(nXBBvGONK`{LVQiGB=y3xSadZr!eaa zKE(9MHr98*q2yLgfb5kq*J>vlxU>9VZeNHQH#kP-%9zb)-ak19UK-u|#^%a2+~0Rn zu51i5zP)d9W=a`zckO4nmsYWjU1--UWlAm^V(t}A)Uz|6bC!W`Oi}Nx&*xrVrQ{~A zW|@1s^L=k0VD7v3vD}rb71y0Nu*|(X@_h?&@1A`q;|3-7ZP5M5$@F(@ihGkoalNuy z$=$gMxLk4fqPQ*9GXKzjFxT15jGMu~>N4a#5A-x9=xcX3 zXjidZXFc&~Jf%}wuDc%h&tquEiBwlEJD&4~^PBTQlYC&{gK`)j82F$Z#s>yID2MTZ zfe*^D`7j=Q=qi`v;(7(`%+|1tT{Iqh%<&jwwgY1|vHY-hlw&+>hqc3o@c>=Pc$8y2 z%8t{H8jKCbq0^}t-*%L9Uf$^#!+EyaVaqtc)3OOnEuR7&Z9)6?vy3Aw^Mj?luq+Q(jTq94C+(MujKV* z91EHIhW%{g4NfIfwv@RuTab4Z((hm!GiYPkkC=NU+Pf0zj;+j{rF%~z{bjZ>OSEq@ zH|Fq0$YrMN1Lj^u?V~y2R5q@X?dxU(>l}anByHmIm+j_l5`C^`1GhW=0GsirJCxn| z+=|+7O^B1-+y10F3Hp|C-FXt}TiC{OH|&&gpoh7gut(6zkl9MtOPiT7)?stKlwz)w zW2D=;fw}hWQ=yN`H_~s12D+{?*Gmq?IEm=`iEb39TVJQR=JzNCS~H)!jPiM@e7ozV zY6bM81^rvBgx->$=aKdD{4waJ?d--N^cn0r`oL|vX;XT5{~b=|>UOdTv&kOJ{=tpG z@tl^%e#GVzvECoU!muYUM}M!G?Mo&MxEoy zkFX(KrLxFIyR{9r@O&!Ep@YsQ%B|}oo8_)~0rpZsngX3peIEn6AZ=M)kIV5e?C}cI z{%y;RU|MPUrk`St*Ucj^Zl&#ZK3Z%y`(pTZCwf{+`+q==W7n!jjYYRJ>=5k`*U)Rs5ukPu+zc(h@ZIDB| z$#>qi5on9RqHTn!Z3eU3j5kS-I8dKm*f_|E;4iz0?qPh<))fW0+FE_%W8lSB_vFoN zYhCY^xomcVTf^`9e>8I0ew(`nzf;fd%w=EN>8{#*MBm95RC}}NFZynC+A_U$Tn=(8 zp_{U@?$~eL-FEm5cBI8%mp2vKk*TUJv;}f^D6_-CHmdNwz;kz3KQq4TgnYu6(a04^74kbt<^FG-<5goK^a1=tmjh`>m;Yy}ZqgC(DUUh_FekwOK_UNM(ns4W)H(&c zC%+f+`bH1zH2jQFn~4`H#zX}#RQQrA+GZyiQ>V>=J+5GxDm(lU^gnAyIb@?RVB9CI zS;Oy{XvCWh<_|=$8sPiT0$dB9_={@k~=zaO$L-j?>gZ`Jm59!OED&}JMt1h%F z=fK$0d>l{nu|9zI^Yw=ddg|>iCu<+Ww#j=mU-sTy@u6t0G-Rx(YsGt?;nIWxmUK63IHrRu~G-HR7-NTy}rHZ(j;_5IX#h5Pa@> zrruk|j8n=%hkIqK^0`&3*ueO*L#`}%_inGIuj!2$l@;S$Ck9#Hh+eWGig8=TDSE|y zF=JH4Sl7A>8Lhosj*;MZ1=dIo)>jci9s6M8vhZUaht&I5GPTDJeNtCzB!Z)Jr$m{4 z)Ay9zO(XdI%>DnuGCiLW>FN2Z+B1iKE3WQJcE{d)9`f=9z4B_%--Nk3M;W;NCx1gb z)Ewrb3qCN(AIVbAQ3?BlJbYcqx-!*}Yt-Gc_q4wnYb!<)FZvvfisXS>Gm;s9ewy{I zc{)b@&#haRca2=f25uWE`rmY4WsdrNrcm>uJ9$N1Z^UQ^ZSm~+!H=T2AD%<0>0 zDs(|+My*Yqsn{|zw=0kf2hBs$H<{}G|5mHB|Lvaq2zaoG_f_Z_=esl>!nSUE-Msfl zS61HZdQIr7y5EwWxf(*gJ*tNsq?(eEu!kbcEi@LHD|+ zVvbipx7sHuV!k@icg$C=d)O%kbJ*0n70f8Fu8`|&_dT27%Rd5H+on*OTD2WIw@NV* z_x%s+rr1r^xoGOEb)=gFZyX=EXPCU9HFy=)@nk2UudueaiT-3iKz|g$huBW=;gEVB zbPuh~e)+c3uw#C8JDiysC*)IujoA#lqasIqcWwv&mf_jhiZk^8ZP)|rvCp!pZz=F=WQ5w ztRqc%$yC)U(3wSflJ)@nA%5`ujPz6NG^&T@_0jn4uJLi3sZPs+*AA+`HfP7&T+m-= zPq8iRjpMZi`nxbU3wD6o!^g|oCN@3?T`b!5`iJE2tG#uv<=|(#?|JDpW3JQ2@9l8B zmc#nR7-Qnz{#SF|{a9;&?!o@wyKm^_dWGyYmp|}_+Xh-cFvn~1w_4r*D*dMZP2h4o z`%<#inHtD2Vm0Iw(R^|_%gpr5WhBe+Kfw1D1>cCv<@ru0@rPtkg&s315liUlCOv0U zd#H>G_*-)9Vqr?pp8T8$? z9&4K9dRq>d%Ew%ek&ZFip0pX`wnEo;;rDv1b7E+JF&(k4LoVO}hInCeJ)``3_HFQR zU%t<=H`dp=ndw{BBR_+0<#g)Z>up%ub?K}3#f$|{m6K0OY2brG^4^!-1AiZSO@nWr zEkjIm1JbwC+5mo3nOqyZP4>|^1w5`+6wXWSHsXg3I@N}`U|Ao_Sa0_!rk&kDc{0_t ziqIkQe%BA>7^6Mqux}zBVTaAeT!Q{MG9F<^+hkmTemjq$J1ET(PuOV5=XOxO!*mCy zf2$aeI4nQUBkSe)W8e||dIx+7AvcKKbKOwz%h9)j?Xv1tH|fIz{UYvSH~YDh;x0~` zYiEkN(oV!(z<<<-7$@Q`;D_Dp=S~OWE=1Q)bcnlbXRh1ft6tFyz3l{TF`v7P@|peI zS*?H`aTlUTKP~ju{O+=1{*63;4C^fDrTd^Kd+b~{VNGrqKC-DNorSq}r*2;Z|6wJU zFUW=h*-#)GN7s|)ymL{0t|zxWNA;L`vSbcn?SZw04{`Nc1#1rlYY*(BT#Grn0d5chy6Ky zCCi*X0zAHusWYBsnHe|2UsagC`8K65*rn(x*wQtyzvG}I)?mHxPT&N6ZJ^djUah#+ zR$|_t30nod?v!g4%=7GAQenj(s zYZgBIec7M7_J25<>z?twrf%3~gU|9)_5M2eRCcs)4l~l5?cCqHp$BWh0Qf#fAw7g~ zF6aQ*LmO<6f;EJanT~Nk9rOP5?daPI^sScW29Kd-?#CLwrxJ37zQNaYp$~iw-}42r zhVNa=@0s@ZKMQ^`WX7CtzlDGJLAYB(-@Dh-x*|tu!XKGv>Y2}#_)l)`KYdxGIZrz> zP5qLYPdhSg_7|nDg3J}{(LZdh&UH%c*+Rb^7=xqO9^w1_>M4UkClulfn#rSBALYS) zjFYg-`2Dfw70RuYwwCOcdU{sK>$IZ0>YKk)kX6^(3NEXzwIr(-oY1%Sf?DIv@3P!l z=#K1#LRM*wyo=V=vH5!T%SVyb3zWW<^B}8VG-cI(bXh&Mm)p3%NB)kG?PjcLD9*CB z2X?S1+oX#=o~*Km3S(A~)ol+#RzE7pD&hp>dzrTJ&lr;<>;(CQD(PK|e|l7(kn?d{ z>=XNhBF@oa^$CyFuJCs-=PD`&)Veh`vM(DI=-gAYr*MC&+OgYM1R25FgnT{tE@J<@ zI=h?v$xKiGZaocKcdFAyu`;!~`;AQXjyHJxBSf+3mslUAuXdi~uIhcmU9;s49`l{i zyNiE&w(xJny9d-7=Rn^M#INi7nV#OsU>7S@iv3ZncqD#TSHM0z4d2x7Xb|Jv0vlCKR%ZmvX3Q4#yxYhYio&n@V0bx()R zh3<3DxDS0mJs!j(t6}?C1!VF>tfTJ381Kuwt56^ItB5!5>5eztQyu85W5Dg?yiqds zPoupk$BA}!Ax?al&9wUSTfr~)z2M3HTi%d;8?ZaxGuNKeOx^d(48=!#juId3G2^4X z;88&~S+*dr&@pEJGSqMECGCYjJ4kJ(Hs>5Z8QXeZt@ANg=ZT0*Id(y|-xq7`*f(j6 z;UhA2NA@*iBCX3A@)mSY!JntG%+&07jn?w+m2bUftc3n@0z2!$N3317-h#ff>MtrE z>*Uu+7txx7$~S$7H0^)T+7$6N^1*pLh}IZtPrs7s!I(R{vG&~o-M!rwt|7bO{GGdM zyAAs_w(u1k>u#K@a8KV2e;71N=-!U$?i%P&_=`w`Z>+#Ct_95t7<;1+c>hSJ zldKY7CJfNp|5uCf`w;O)-I02Iql$KsY~I-O8s-Gfte_u`)a#((agVK?oQK#aco@FH z2BgK%w++MFC*bnWXdTP#2*m(4I(B31aDD`SKsdyC_BiJ;=U@E{@ECkTd%#E97t8e4 zV~XCXRZs3h`Y!T`Xk0V>j$I^!#&`RVA{%3%gDL*(gKR&{>9KCuwH5rw zIfXM^&RV|aEX)_7!=52N$o`WoQNP7J-gYjRrC!HwiWwS*P-ivP*Ec)tYRwLe*Z#cN zBT&l)T|e5L-PN}TYuuZicH#x^|CA?pXL`GL>-A5vzWyz&?=7VNz+uKM`_CkKHuoA- zn)537N_o{E?bwBUyY%`!$On6Xd;{H%gEZGodXoKD5EraLT(Aafs~W_urod)SaaYw& zaZkQK(eh;U=)K}UUqkf|8la1tk@FfwG8}5Fe7^jJac9K2g_qL7CXxpc#RV${T-&3$g znF707qfTE@gEdMG)+jYtqf}#!QVqG9O7lSI{`xr>f6bLeoKxfb43`^-fkO{ruGcY& zmFKX>Om<%1{}SmO@Q0CX7IZ(wdB_)X*+H+tW?+7Do2R{n-k4&QSX{LWj)0KDh+3cQCut61#T?7xwI z=IuF(4-8%&Cl1|x3Gt;6hvs{3u>`G!$(EMJp<^Qpap+Ttw=b}gIE$UH|DF6y3w%SD zV>icb&BdrILe{)X`pzYu(<2)TQ z?gL(#XQsp%A>gB~b%z}5dId;7^;j;j2_1-{U6Ri!){vw|CE=?`zFCK72Yp{@ZG3&d_{< zuY!Gvhi$MkPQz(;<{T@jtv0ibk7ckX%4O%6Hn96@*dj&L*Hz($k4-v8l-V^2ZFS;2 zJ9H-e`>G8#?jvHZ7HrvghaGLg9>z9R*i`3Ns66@V7FbWV%<%JXVi z2MIf96LrN-2k#2!fxtVvX*WuE2tN>KQhchb0y+YH%~gPxy#Fx|t%=p%3%DSp2Z?x@?%`@6Phmod&+F4h*= zq$qO(>^fqgH5Y&jbCt=l?3$XXUV;3DamlzDWW>TB*jW`ij@DC>PkGWeY7P7l_#h-hLRO`p(dD(u zBbPB;@_JY(9ey;R^~ zfp5r9zKm!m+fV)FzSV90m7pou0i1(DSqjFO<^k~*>)amjTl$I=J3!1p#hJiNZ$H*J z4#XtDA1;G0pntphoD{MI{@7^_)uKE_5p~A~xgS^!yM?xAYHGzen9pRmtH7hl7$faP z>I2uyXrF4zW}4;-#X`0^F`i?0I+4cpF!p8nI8qvXc&sC`C=Y7@--Lj>xySI)N4_1!8fLLeWuC*->}XyW?hys+jbew zcp$E@UXIa1_hj(T;!mPH@oWztr!KQCUB5H?y-@a>`{3{!2xrh&6@BIF;X>PHFQm57 z_>yn0VvJ}$8teAp+_}?kjCa~;EttbST0c_!lEydlBYb)U->A$?JP!buH->7OuGwXJN;0)$4Fpw!ZgD?2Sz5>qmU_tscZjv37y{V4kt?6@N4k+p=-G z^s_thoW@R0x2K2mpJWZs(KwGBAp97Il?9d3oQCJxt%TgZ8MA2lfs7-K10c9N1?k-dcP%@PPYi`2NW4 z!I{JvEAYG%&LmEq*|A?S=E&gksP^vr=C1}{!^j-gl#>^k%qbQ+z395qSZI10ALp-5Yn zf!-cVaZzKG!$@5Y^7h>DG1LKC+Nnhs{Gv0=^AoM=j<8YAp)_*tJ3tORZ9T=|W zy!;(x#XMi`=z#1w!dbeX?V`4Dy$8MO#&cdS#|j1Z1p9bLE3+1SKsj~1%<;uCv(2I$ zFZmBN zgB;2D;)TdtVh6ZBb9U!*w}&W(2)nQYeCek6Wqx3_{Sd_m;X`8G2OUg2!>gDx57dFL^GD|=(cI(sFZch)O=S?;?5v~w-Ws-%7L zN_84^2+lQQ|1v*NUID(49iX{aSpVX@BhDFTvERSXtlRko*gPkm@%Syy3I8_6_uAI3 z%@cnIZmSe$jo;bC&l>BMKSPXp6V^8sBl}iviVfUiKLDKuzYhEIyQ)X1HI*p4x)yN@ z#jQO9{rWS;>F%<>FL{S?;<`h~HZytK^-MTRbH4wlYIXLf^1Lu~e8HzzO`lbrzQTsM zT)}q@cT@j%{FtA&nCFmBl1cckysemr zB&%CNgLwG{(wm~JZIdwWM~rul?1}X}vB>w3i{zT?Dt0B-4A40%KK=8=d>+K`Ovg6x zDu(`nFJgW_${j$g`kdr@43iJpM~i&us{en>hizMr4_sYQQ~UUsc?a@|2P;c`I63Oa<{<-TX7kgu*|>Y|bu2-#0st8$-{muLEQu#@U= z{JOCYyIMVjU-y>q>u7J5WJCH`Sg$)VU(40rCvg8L^&ZRDLwVR&FV?#R{+%;@Irjjwr39fBdj<1*+|SE z?iZ}!wkSvToAfW&0o$BvHReC!9yBK6S%NABdafi^hPH^f7{w`2*TB2|2V52SzPjQ7 z>F?s1xY%dJ*ea+)`b2D`2~nb z3x8od*4-N@c87hK%CYM7If_wUIWaTM&d=Vs93SOfC(g&Y(E0E^PQ)2J#E(w8n)dk= z*9h2+5o0iKE8y?LXQ^3%^;Ip_g-_?P7tG^4m~Z3NUc`=fJcBj=TC8i<=GC5O^1K}k zF%i#h+MBc)-|bYm&3D`f8%h2N>4Qp~A3@vUQyF8@Dtv9kN$R-Fi8RO~rHx91PhZFz zW0t6{_3#^H8QtI;_M^ye;_F|;CRCiSqk8(B_u)6%+*=RcfG3dc9PAjyrf^n&WNytG ztfMLqp`W&aF_rIOT~S6cAjk{e>#&mLK8rFcq6+PSQoN4Jbj=TP9=R&NfVD0B6)R7w zpDFTWEXqLqS*^K1)CoNYxv;w`sLr))U~Ckz=sC>z1D+>Bd@N^2?1J!hck}pQ?zRBy zv#+=C8)MZw2YoSlPO=0a5q=B4vEJ9V+u;w|Gsk(x3G<0R(}eFM>>bvZs@wGQ+*%yx zP;u^b#tNK6y_Mp;3gVyGr@%88c-DsRPhd_PH(>oYy-vyf^&}RqJb@W2N1$&H+4^q0 z5qm%IrPev@IeITa>tjxQ<2jrPo8CPQdja4Joe`f>cF=Vm-pA05a|7A8@LczfLwz@P zB1Q(;SnVhWUmU#r5#vzq^EN6I&$@j?djXv0P6s_7>vW9(FS4|E0R6=EAbXH>r^|t7 z$ar}paPG)q&&;f2#=)PfxqWNtyi#SRF3abKaa%u^H+|hVYTKV&J+7)@KJLpm(HS6KU`%}Cw84C>ZH6li{*Y6ZK5-9kR9kWjL$KBK=pLR zmN|X9qJrNUoc&d2;ymfh?PQPbv<6XUIIuQlYG!U0=S@XB+*3F6HoHCpe{JMuQP)x1 z#l}O{o%)(@)VeA@3mfoZ-YBmaqt=YzWl|eyt%@^NhcJiK-279}XMDbV3X^qZPDlOg zpcmF1%p2=Q+9|K-+lWG5lEuHfk6o|@$K)%klzbhy#qm+5rj)NVmo4cB`s`ik=ia=_ zzBjLDS7I(#;~g-i?RDA5u>qUokRDvA(7CSTmU+A5J(^$csW&O^k>4l!K|Qz*-wlHp zpAsL(jpvFmkCd%tCm?o(xdQ)*_HGT^e#FWv6pGW6?x!{jTR<`kdBItCqZ|7I?x(Ht zqF_E3&Xpt1P4ZwPd7!yOb_D!BIt}sj7;VEG$C>6!v95_LJVrPr%lh8lgZ6@thQk{aBS~v6{&D~LD_FNeog?G4&&aKAzGn_Zd-7pdJ_R$zUXWy6ow^(kq z4QCR|U}K&t&)iVX2A;Pa%DwmAXycvtpy%*zjT_FVb8COg-7pp3KRlSbA;QnGFi8XIf`&S}6#L+{aEuAIlhE^KpT zdY^#~q%@&}taF9VDD~N6wXPACxx!NLM@q|+bA{U(JI>+<=a8Q_bo(KLkT0|EB9@}o z6R#j+Bk{brh#6bXN6mg|D}3Etw(cpH^Aht6l=`ALqfWXU)He=^VWJyjqRC@DXV2EPmAyKC;_~P;9cj0#hU!*t}?Xwx_!8J3(kAL zJreqKEc}$QmU;RsS>O zThe?f#7y|P*X`!o2eA@H@ma*1;ctmNb$DLkA)D#bk2cfg-ZAYt{SC2GtXC-Rt%$hy zd=0czLBquv*x{4tUK^r zAL7>V?d*ti;k>$xcV~ULPxmk`8|*?3vR<^)j`1Mh7JDqX&&zY{L_W~c`6pI}zT@0) zmy)yB;=BN!6MTrrlOsnfA8S;zY{&PhY+hfDr9RZb>zj`HX2|;LaK@8p!8dIK&KW4M zSKAS9eHicP+km~P?T(^t>Dt5n1_#z5o&EVfTYt>hKi@|F37xO&bKt#9&|kS;=fT_# z%r~6LrFY*9jNfvI=1O1p{8;Xl8aA-H{9vE$3i#-VLyzyrIFT)5yd1R*`p@*sMSl3@ zb`N#omsq`@}I@9eKJxT6g>i`X)wW zruNycWPPihwXXIE(+~Br+;1|h?=O9VdK@xftBU&yH?p? zi_2NA95DgBx6OESyaL@jGB$_}uBA2<){`?oT@ zOOEyJ+X_Dm<8-@2p)taH#W=r z)VkJqQ$sw_hz8z<_Qg>575G3DS-c(Pbu_j#YYUoE=?<-Zd3(dsw#JT>*3qJ+lV`WZ zn-`|gnxxj)oJ=j#w6?~Di#ir)>3CyPDtU&cHMbyBXKQOqTSqGCseB*hV_C?mt`XmV zUwfMx6KLxklyMfyy4GwfvumvGvdb>M>^sY3pq7=xi}B0R5($ZSl6{v)Vh7{3e(^t9^Mhq=y{;{hg@a zz(kSH8lxl3#no`XRI~K8~#TuLPX}7zvW!B=B zByad#sDBCS-;K%hsq>HI1#M|;Y2X~1)!AH}d61Z@W{us5w$ZqM79ZKx*U?rDSj<_P z*kXn+UDN`tlITpQQ*F;9?QNhq{rs;y}`Wo_?(urJn< zjY-lXj7@COxL%U&z6Sc8bm*rlqkKNLwluc4K!Y|LDUAARw5tp4_#Qrfd?en9-#&aU z1{u_2dj}*qr7eoLLkp#rG`4iML(e2q=(s2^m4rQL)%g4LTbffdI~o^LzQ&HmcvItb zf^&=G%ehKTq_oyl8}S)jwCJrbBYy;S(j{%trq5}g4v+Z!6`HG~jWlap`vYhX)F-AHY`aQLf6c_R%6T2w&@V;6Y#wNGA!k~ zsv7N^1dMyu`&N0k-aiPsM^4k&9DIK&eUi2U^BzANThJw~P4N6N^oMN28Tder^6Ort z(Qo-J??X6^YqSLZ!GtwZXH;UwrOwbUZ-EFVQysA8?OGh>uw`*$2MqZPt*x_JTiV#M zNLz5({LAMxoLf8l!g-g~&aOK<-PzOx``^;0#kD1=wnR%ibcih1Q~9YfrLBWTIM}YS zHuSk0AJWMkZJjCd$Ij|(ZjNLAob#!+sWsl*Xj~&^2V+m8Z6tdqV<0^Et`rttn=(Zc zgrp=pv@Y04)it&#ps~Ax8oMNCk8$BQ!p<9eV| zV;7-LYdbZx^KqZhjn?~jLRZp7e*%W|``ob_{w?CEXQ5ALqQCf_h)+4nAb*=^HQbLy zH3qkwJ%an^wk$g}VQ<76^?7|hpWmnZ z0=}Rxz%;fnYEg3WkG`U^L_n`9l7X9twnlp-?CsiiDzJZ`c?1hxKqE z91MrT;cz4zjd&xzh(Dr70+C=O6bVNnk!Tc6jH3D|ijE>%6t~jxruNjiEeHxN{g=*; zItmWOn-_TzRE^eg&!5L>jv$n-sr%qd-AzTpG7F>jd z#{$@_rcS643hlr#Y{U9Z1b13GJ1C|gQb-5#btc^s%WsXnZq_r1@5!joju-{mABoRC zd(zoh8XAkRelH0XRca_B-EoFiDej}yZ&`3iO|gIiDSk_uab`WsOd3f` zbcNtUuRZ&hJY2)pghbqW&_`!0JB8hY= zJdM>(L-*Sn+l?hmISoJUV;pTubbq72)z`4t-|B6+Zt>#ICSR+!z@@?u@&V*!XM=h2 zUs<`vG<@0MA<%pyEG~uH7tNCX5)uf@^jGjB2D}UfQ~r_oCM?rO1J5yKLIFh-IAFmP zD|)n|NS_8CgLE2eqQAw&qCCX0fo1%a(tlxMnZ6B}%9r?8z*N7)JAjLqlRaI62lLNa zF!5&(@BvHv{&*PvGcf&KK5-$3B|rUzzV}P;VEzN(O^|nSsq7<5I@MQA&RV5RSJ+g- zh0DoKFTof;3#R;Y55rdjms`sFiY1-ex4?oae>33`npva5t_3bO(aAc1>2D>9OTnq{ zQk(%EXG#AS@GY3<B(4DRzE}nSPoouuPu}JP+e3@L>M?7EJU{ z0KbU&LAMqBJJtbypnU<3ZR{-Ir+`VusDEkT0~UTa0(YIDA(bwLH36@*;1*yiPh2+E z22ABi+zCwei_6ZI0T(YP`+5l;%wKQ8)c)^TF!lEbC3rBu!GekY-z}Kvx0hh>!-9#P z{LbR#WN((>!Tj46O!PQrWVxIS+l`iMFptOD3K!8&v0!S?^b$OnpJ~BF{{;&s`hO|G zgZWD=nCKTnxb) z6BbPLsS-SxUu3~Vk1ch}K%3nuz|EttyxaS0yGKWM>3{|vBFZwOoF`$6D2F6ci@aMJe?IB$f-rLZ%BA89J;<23M#7JMu4mlqe)9|vAJ zu9*LS0Y7b-@4p15eLr#8SU>Q)7W@?O`xg8xa2M*6^uGqC_KVBTUI3Q+YownJnpo14 zGb;DxC>^i-<5;H81g8E;>;;zlbVUCp6U+3k0#pAbjswemHKJcbHw_@g8y89 z11|(7escQ?ydzfJhb8)o+TtE4;km%p^1pQ$zSGivlE+7YX%9?)4t$H+@SO?n^>kd024nYP5`r(B2EF*9-p{uY!Ps)1z!Wa%z~SNX|GMv zUkhB`TErc|6D@ctFzv5N`s;w_S@1W2Y5z>7cLCpK!5QG<2CJDJ0nD+j}rLZ3Z2d*{w0r}Yp{QH~C{xUl|2ZBZWhti+F(Zn+U z&A|4Pi{;%4e3$Gm%KJGm?Kid(|55+RpAlH*KNYwN^>hA!;sRjWqr4LYME@fbOZxkP z&-z@kzMlZEv*3q-@3i1PU}}%JY-|g#+#jX+vfIQm{Y_wMkHl{S6MrQB12FMNTz2*+ z;NsXl;yqxTT5_cFl${T}pnqTd}a<7{3Pc7w9d!GfSy=QSL?AO3_CPU&EfS;RG#4iHVzP7j& z_A>A*sBa=}kUT1*F~2S8cHq61bPq7?bIbfb;PSR&{x1P9K>A%Ep!u`U#FG91FvX1} z{wpxWZzVniO#AE-D_{h*Ph2);2d4H&j8~=b`X$Ee_$`-{eWnBt<~M_%#IN6jiunHy zF!Adwlm90}krBUQrvAPNnD}*yN&ih?;*Z1+0TVwY-VIFsn`+X}kBa``&pPw^o(87= z-D#$ev9yoIa|ZAwQ#7Q~rLbARE2n835%vSWW10U!VDHT`-N7QjbQVBdHg+cPofdo! zaPe}o+7djNSD+}UJTHh8n}gK@Q+om?KiYw*JjzD$_y{ny2i*gC~ z@@xXp&#}};{apY&a=M1xbSZcS5&F?0Pd5Rtv!vewTs+5MV?Q&o$d7oQnP1{Cx^2KFm-6p-jHnzs3mv|j;@p7_nmEghrduKAXU$z(H(R`L@-vVT! z{>?la>j%^?{e^E^@>72w1fDxXGpkV8!-QuR@guVfH?d5&xr%2qD1D}hWx5xb_#?3nT)dnt zRDu!Ds6#6FA?MfYz{D@kPt2!D_0WGvm-DR+n8xdFWTWx^DKL%KGIRb$&lCLQ@igSW zA6TB1q4^oL)KBs-A2{jNP#RqdyULPI_Vi0781V|UkLXu}n(F_mC7sH<4w%k1aD9pL zo-{Ep9{3qxI=@gw`GL7I)_5z zMfs;p5Ll*92d48W518paCYI^<0@E3mk!Jd769ty(lY!~{iY)(X6U+3k04I?y@dDs` zW5x040Dj1lzLe6zpQ*?|@_Y~Q`(a?SfA0f7Z%IGxvm#xVKN)zOlwau24Dk6&MEj_` z2Z2wCYJwa!JPaH=tH^&me#g(R$nrh|d@Ckrg;PX?wlHdG&t-w#bJ)9(SM^EeXs08@V?z882k z>LdB5{{IGelLa3Fe#JtsfN&eqsXatL1NhCeHBlVy%mR)rE%M`P;PPcf{$_#SL4L`v zhk#dup5%kd`yFr<#$Q|tdky$0q)UEQd=B!7bjgoq6HEGQfk}QO?f{l&!>Ifpm{_FS z*al#lZxU|;rn6fT{|NX_3%(zCLBSq4*iV2-9wq%lz$AYX_W{eZRaF0LCYI^Dfl2-( zeiNAFQ(Sn@9Wcq4xNPhXz$9N1{|T7nMdH1{G@cUw1(?QD;{CuheiDBOEYDU^`>IYA zSf)<_mS>|V{W25F^!dQ@%o3${nOLT0fN8uX?go};u896&6U+2RfaMu1N`KwNGW`u; zk}rwh0+wg5hO!6l2dBE~)716huSf+OZlYC3O z47hklZz+%L*LQ)R zu*m!Offv+jpr%VQjIW@#vv+|>KF>m>G#|bW|BvKDmjAsAg*cb17LY>k^8Hc6wfmf{yMNcOGx+^!1C-E;XJTB+eWzdQZe2m&Guw~X*{nmaX+xN ze~HUVab5$Vd69mYJPGy*^Go_iNfQeag)Ibr{yfdhp|Gz37cVDUT!IJltrkq>-)_O= ze}AV059aT(V50w}1rvRL2_DQpWx+)MXA36!!4f=}f8TZKn|ME*P2)qfcP{pl`rv9;Ns!g-?d=s|MyGqVE%3kCi-7kFwt)-!Grl0)E`m-vLWH z<=<0+2lM}B!IaWkq~1@Z%Qz zW8l3O{2*}oCnw+ncV1rJ#0xjdBM!MqLS6Fr?Xqw*g( z4F8vfp36%W8dA6*FC`fAV!>QqfXB?&%p3}v0lWtN9fdnIAFl+SVM)Il_yMGso9S7T zUKC(stAXV?RLb9HVwt|h%rEg{z{ShS9xuUz`Tu3X)ZX7)F!Ag45{&qr1rvSVf{ET% zU91f!R`U)ECi=<1%Pjq^27UznJssJoKbHXCVoARo_)ZJH0{CtV{vzSna3R?wSWl8@xV5(1C*pCC2=WVI}T_%?41Hkg!Ev1jD5m=_508I5uJPw%7>q}FR=6{2Ha)Avwa(E|YVWnc0SmqhI09T| zrauY10GRs&pnnf|C9r0ue{PD%4~WagG+-)UTsGzgrt&1N0jBfB5>Eq`XOF2p^Gqz$ zuLPFoj4AyF6U+20FttzO)xh$6GST;$Sf+0QruIwx7;y1|{Fh+JzXfyow_q;+B^dH= z!Cd|cU!|Elwh2%vtXis)`E%t*Clu`|AGY*{a-DZ=ns`(?3YX{@{j0G zw_u|8l;FX<&w`2mOBPJ@UoF9d`M3oW{f!n(^f#B_!ThZjO!PmuV50x`5{_7S@^w*bQ?B7~2 z(f`4ZLz!ct0qcS3ys+2A7Xj1xV=`NmeibmCH(qVx1f@rd=^emy{#B;00PZ?LV|J7N z7GOI6`jm-(co=;j@C!F-sEMA7wzC(3$$x*&q@OqgKPrX2r}kV5O#VCRW5QWrzJG)Q z2tNi)=ikfC^jCrDyt^#lH52it(Hc_Wci`?xzD9{~j>; zi{yV1ejb?Yk7i=UgL1)-ktY5!FxjKCOuPn|{IPK+eiyh2>t(vez{~rkF7_W=fvNoE zLGW){k-v|eAAZ-@v%1Ih(P4C{OZl1MmmHWIw6=`#&%I5y|iW1}1+*Vt=f(zyDDy{2R$%$GO5j z&p`#$-&(@px8%=q!r*tnY|k%&$se3+;>Tu#Z{VNo@4LVgE%?+qkXH+S_dK!RAnR*8 zALEB~;>QW#|M!6@9zN1+&u@U~dDbcuf8_!Z?|7@$7BI!< zWq%tk6!G+!P4xFqz*RAgKif?GKLAYYbxD5Dq(6~1lA-iWV_~Pq%Nnk}NXOIK{${Gz)~HnT1I6B zjFz^P-qPA0Nq06I^b}jDzL{RJ5%3y#xUGR+%26zN3EJJ1LKhkrmy~Y!lEG9m6ing2 zfH#qprTcwH?OTA}7l1}3!y#YN8%RYBJsJroMK;geI37~=7jbHy6#O! z@VI9{N`;WQLawOD1dKevl#%iUL#c?K@+I)NCeLGzosOqFBk52APm6lPkzfF_=1btQ z(*zy@O?eYuh(vLqha~m|KMu7&@NuYh2u4BVhHOb7Y)Zv&`{@f6#b~&B0+u{NV(C>@ zi#v^LJb`%9pTtNd<7uy<$ECz^$u>n4?^)=e*W-91U^zW#8_*NsU_2#>AvC_=VYDIf z1}$Hh-g3rYbb)^x7ve=lk@M?nFKM{s;>$7MMk4J`#pB+HVFWO{{dLfBW}gz_G$bgP z3MVn^BX}fOPleL)U>YLe)5G4lCopVEKGrmcN+%!~fwzP$_N2pczX5e)MErQJI2{r! zkhA+ZBv37!O~)bO3g!3}L2idC1>!dp3Hmq`iIjokG*`;vaY!OVR}>wR#5XiwZ~}X% z9{GkI0N>Eu^$pEk(iWV%u)Us;0WFor6Xtj*IGIQoTwJKNLcq9TB_kc=QXe?~;)^dN zb!bEqQLi^?_(O?EGUz2qH?6rK^aqlubiA{v!<;Srof{2{T3W6_?qoWU)RR$fDijFn zenTizbD~5dc&Z*xC;QW(WHjuHhogbC?n5q>z;(<`cLy z>{jvd9X7Qb>S1S)qdM#ia(WCg(q8URpzCJAX4+-;n#1G;^B5r>I1>H;pQq#-J-+{*$*)bhh0PIc#7s7=ig&a zZ7o6-FYbYXHfMHJyut@>w(3B7qINE{fDbPmFhT*mS0f1dO2LgsJ;I-A z?Pv@5lWi@n4UNqWu-EY0=gzC*8pz`@-!A33oWEtN>b!ZhCJ06XF!-T#+8;ofA>nHk z#d^qIhNLsRq&22X%Ja1X@dIL zbh6ZAQw(XaywbcLy9}Y=d4CJdKQ?tlww?FDoGW-IOwb>WCZhp=BppuDdsuXs!EhoO zNXPXcIdMgi8Y77pTnF zDtTt}*DFy{)n)Znc%3Yl@T$&WqN+23FD$z;!{i6jgqPqX{SjX(o-n*otn!bLrUG~I zCr1dB*uf6eT$RG75!$IBaDPiwW#L~QqrW~`? zaP*`uEWEfddaithVK~)HA%$eP?xNar=hn?39hcVQajgE~h~t$%$pHCD=AJFuR;9OkCx&{t_*MpU#DX>G5V%a!cQvVUQZP+=bVi4MPbn6JJ5W71YLb8tRnnztnosHFe(rD{v&Gk1%$;z+dAN%CDDeUo=EyI z&b}zDbtod7uzzIlec?v)CHV9XVc85{BB=)x0k{c?5SF%nE_MINW|-a|1`A9`MWP8` zJmp1b%Ii1MiGO(Q!E_V;!~klB=}4wSA%7y_iyB5Mba>6&cRo7H@LD@~R?&C@b}*3+ zr{zSwc>cV(7hF^~r=foSMYHE!aPdVA+@6|Bcj(E*L&7A2mbHvuMk**ear~7FIu(L_ z$D9qt5tZ;J!%!i^uACcObKL*V`hE2mT!wcl^Q9IVrWv}?g*8RNeHuCsU)x2aT*-0WHk94E zoL)w6z-~#Sb;R0_m*DYSLiSD)!A;f|rYP_ar5@3}2&{Pn$#h!xO2PkB+7ODjV;_yy zed$zEPxy=^Vs(Bv>xD^FbohqmU1a#;%>xU=9rKc1g&~`v55F0~LdbpSQim^hfsdtT z0^A)7StJhI1|ARomWs!7-8D-VQw)P%$c_*O{-l9vSw(1p%V%K~M^?3S^Z8=9u<$IA8y)Teg7A@aB<_s|!cij{4)_f{ z986%J+K+df>V=5w(4>WVIy7lvDLFK$Md=?Yc|~y=x**A4QHsgsp|i<>KWgRHn_~UL zUu5n^TO}J?lxW@Y;Hxu;L7MJrwfom@cZfC2JCd>k1gSK>)7^gZ;vlbL5YXG z(WuWKP2*LtFe#RB3*W)v?~rXs;*S})( zS;wK`{-WRsq^5AvAS#yC2pLyFpQdL`AwaY#^ILAnDWJswKpB$MGy z;S4}BfaMZmfOv-kr?8R|Nib{5IEB>5F zTSKC=u?c^4qurBAEN*E$(1aYWwSoG2w441yxrg&jV#0;n!piT@>#t;xV@1?2!XXg z*q=tglf2%jd8W=h8_bW0`n=@xiaW??;M9=r^{23v=L-iz2%I3JI8aom+%L8l8hD7G z9OP&i$1?rNP#kCflC&&F9v)@JvEpd)STXmL=nthLk1qv_V&E@yAY_G;ayWowWuhor zZevi=!iJWX#mAvR4_Z2#lICEEGpqDRH*rjrnPb_|u&}8mfxo7TzvxGQp|y&d8StAy zsgf7~S9{`k!5r~tp(qZZi$kSh1CCKNmGGyrXw!WNs!}|(f5{Av)5F$^5;MTngaGbSRD6weS0@=l4- zwrnIEtB*VkOg$`VOIp`c!6;&^(O?3nCJ|9QvMoVAIcPk+;WYl>NfHrf_y<0Cx{{cf zqBnOg*0H-06x=TCa~y@w6zG$C9i6)0!uL2Gh>6A#{*5N^7h15N(SW~gTdarntp46j zc|N;59&8y{cU8afqEdDBuj>`RU%qb83X%7z$GW&h_LohfS7s8g39_0H+ za+5_w*dtN2j7*TQjrX-^|9%872Nh1{X1#w(G?bX8}?4|Id z?L!}PiX5|{!z;k={iFr>K4}4;xC{CxYypll3^Cd|Y(;?n;$48Aa`1VJe-SvqpManT zARt9JX&x|eaMK&WQawbwa>E>i!2eJK3~vOdpQG_WBAiJ1)0nBlYk=?A92jN+(PQ>t zcm??VpR|DRCoSOET_ANQc5&$x4>o0wdRXm9YZ8q6(s%|1+q6DJVQ`L@6q#me>2CZzV(g8kB1t_SiR*|gM$#}&1u_1=&7Dhc9Z40(y@MSCtXMG%wpd+{ z?yi>DB$J4-lw=??5e%D4^$VLMwq-k$I1=9lq4@xO3HE#xHXyO%cdDu%*Y5jpJQ;DN z>)e~$U0q#WkN^3f|2Z|{M%A;;JcSf~p z23G?V4tKJ4f@^w_U=VLZ%XYH*-M;m;6I$CaDQ2<-Ak18c2bB|CHhGdqPu(WH*Lk*`TWV1_V~1p!fV zUnl%ogtlE+!2IboLe|r3X|M9?`n+46h{Ol?0UIl7qPGxMF|Kw#QsNsxAEw~JHa#}u zbi!ogDB~{~$yckmdn%VHd|mpwVqNK5wrz~-q^wc1ljfRucXCQhqQ8{+wnzP0a8A{? z3~SLw(22I3tK6@jeDQEyP){+g$g7UI1${e4y7{ zt0oIuR%Psbi8YZE99k4^XqbhAi7Ad`F*GWh8ah&kvSw~ah_4(^2f9u&%64mdU ziwmN?S8-cl23P**#nY!>?}bx{c_zf!H(`HM)`-}{?>dydf!I(?1-2HA!_+YmD!Tej z-*>3`Dn0~r_CmRbZ~8EWh86gCVImFEGq_;nrN?yemVoP=NzK)+jO4_4^94N2<=JVD z;=OyPEL)^@?_?zp6L#po(td32$~=KroJirWr_Y4dc4su1N*1F+3QE5w$XmjF6pO15Bb8DeP>Hvv1;XJ=8y zd^=d{w*9LzL>dIYH9!Kz9ZzV0=*L&DG!AxAw5N@eSHs51GP~reZvmjJ>b2<$0B(5X zJH;e6(Fm}3AW?D&l-3eg>Dc9W&l1d*5>lTTJGxrt{yYRd>I;`BeP z2IXfjo;sg>GyE zV@eVTPZEfV0g~{~=E@16Q97-}RL{RE@Wou6ywuqf|Ni<*gyo2XHr7=2RYPM)<_R_{ zkEU0c{w}TtCZ+uB$>RslUPv+wS9cxtGlVBW<{Cnj0xzR7{>K?e8|Y>1V1}8B9dvgf z%$5>T^QSJLl=!<6=CDs696h5#ro^SR?fgqY0d6va0trs|STvZ7D@s=I2R|(iq za0bpK4@04SAwgNwx-grl?jQ!=4vn~8Z7mX(5~z%vj&v{gZ`onFSb8=$hyI!&i`CMU zIi4Wj5hpjUaXTMn!k*h&epBPo0Jv?~-yUnFa&UEa4j7{6M*n6epq_-wwnO3C^*t&v zU6!N8fDEoumeH3R8Be5SK>(6&d#c5dqJY@j0-_mzS=O~(v-q^_d5lV0jhbnV5)!Jd zb%j{MX_%{Q@Y7)?gqpu32>K2|Pq*y-ScZ zq+~ZWa~`0Nv^?IKgvqPu;0s36chVYom`1~DhU0Xj@E<$k8oYq-Xl#Bj8v6Nj=)f0+ zX(8-9F*K|#(&efb*o3URtiDK=_LQV&n4 zSyQ%kCSfYnIype+fxZh&%ZA!OL)T5)W}1jS0&amy)1?R3II9$_NvKU+D|Tw|2fxnZ z*bazlXA#4sxM6nqu4MSZ>SSCJU0ebDw8(4$ffLG}K$i{2&Yi8;B48ny-K@{+;62?i zT}L;a&8h}a-8Ez)byjg0EN(OH<8AP@MBdDm#I`NRZe0niE0#T5_3Hp9M@Z0jx}`B zSQ%9M++=PP(Gd=n4%#dn32{j-18Fg1xJGsV24*=BSW>k$uMxZts*g+|rDs{PbAKCd zr939;vG^s!r;yd~QW~C|Us%koCm9`NOho861a~BaIQPxT)%EJ^o9?2Io`0ANTmeW2 zaPWcA2a6jwE~X@^05tvNN|f}L0eGx=Pt^@qtS%eaH~2sVZGG!TSL{MrVUYJdy7}Jq zsxBRr9sb)wSyo9zgScqgW^ndHxNBQEd~fLmH;U`Vc8V+S5`yNgSHt&&bO}9PKV*u;!MEkU<|o?Oj~>@B$eTKcrwGRg_=L z;lvOa_*@;CxlwrcW*}^B(h(Ybaaj+X(mf^~v|~gSx**jn{fOwPyrL@^7vi@+Na;cl z4%}wd5v5G`Y$DY-_JpyfDh$V|rcnbp)RWHE6Qltott?SagDY!8J&SnTvAYPJh)?P4 z0{H>XhM1Y+mR%UJ_YIwdlI}Vvv_S7HT%Cv)l4R3$$rl3hoAB$r!jewhnM7v zme&t>%W*&9{mGxnk^Betw*M(#(u>o=>qq>R<4B==@a4+U*>knFXCfquQbh%9d-^oa?3sbIA&I$w zc&rT!6E31hJ9ug9X+=!D)V9)yXzkYzS_9VhYxNxO^&W3+JuR_<)FSi$y=(0?vj+l+ z_0;eGd{6hoF!}BEuG_ob^}g?V*V=o&QNO4`Q4}UG8~Y0*w11q&0`&b?krH4UD`T~6 z469&H+@iDqDCzSu{-%%J{1i*0zZ5nJU-Y4LHi7QoDyNUeKkr`17=0Xc-%LOBMaB*_ zY5a4ui!u6G^Ix};vFonU_=mFHf)BNe@?ZFRXOjLr`r_%hsWR4Rs5 zx4Wy>+TGI?yIaG@quAVY@R@~AEj~5)R4F!>V*+zI*V=NZ<0f$P&FZOmP}gSl&vUiCQIyOxEQqMdff zt0ULHmZ5GNwZW`^oV9+cTdhVL%=$B^+dXF++92w8&)UH<)o4R4+JO39_ILB{svT@_ zlKl|Mv7wzdv{OMl6_f>D>;NzJfESOW+&Ts63ep+U8Tx^8&`a(`QiQGmGelh$7vgE-glV#ojVw0x%($GS9mh(f8z~i+~ORU z+i)^-l{;8wBY2CybIz&E&88|Y=Rx!-%=&}(GCi`J^&fI5xeZewH)YJV(a8pHEv{mb^v9pQ*z$~-5pM*zhzV0w>uQqGaHrM%^QHr6?Y%no5ek+GY=jpgNc3byEcUK zt&E+LgABPgI2g5m@SBczF&7l0`F_mD{fyeG)}GBWwHsJw`aaZu5cN4x{$!N7417mh zWto2%IGpS1VaB!KUv(Mso(*~$6ZEyG2ecbluB(A~G?~&VE!We4`)4z><7BEUmz~Uc z!}-nmph-S3@Ig6>4-9-zj^YCYAC#l`z`zIP_A zjg6oiyw-7;XegcLhom2_z6|P9%P-;eWgN?yd)+~{eVtRul&xm&%>Br_0qHlf?HRPO z><;E$kM^!dx?>k}XX)NPq(9BJXNmSr=EfY}4!O*fy~o@esC_gioXYkMvVA>laEs$l zAEixP{<1y1O`^{YZ16_MA6oY}{`XDFEBV}7<@zacvTbz(>NLf)Mct=D@8)6u%H1^z zGY<7Kw{r*d?F5q9O4pM+nK98}b3K`2u9Rb}+qsRo4jfRSkIT2y-wq9Q-DR#P9g1-( z(G3vYI8Jv%z2aKhs}yL>eC{&J=cV%Pt|zM%(2p1Nud@<*OMae5*30w9pquuvtAo&I zu&d|;x7*=WuoX_{Hr{`Slev1FY|4DH2lKysb#OALrLiBg^JJ{)C$KQ=iOZ3_&CGXK z&e3hVDaLI|5@mh>8*g)!9l#vXpsTkrxwUP!@KP$P-Um9H zDA(~LvRUq$$6?bIq$%8n5^u?#3tQ&c=5p*H+ss70yK`fhR$9L4iwN7@eeD>=j%xSb z{$jh?7sEFqe@(-)WIK%;oop9yu4nJ7E=PZ^NJ-!sNkyA5(^H~G%nHU@1IShS5Wwas95oADay z5eMqC3mXSH5&UJ>&^?SV+PbzNSG%gOeh|Fa<(|Hi?W*s)1U|?Vw}!u${?W)~2jI`( z@6@lJ%4MH?%3Zbdn7+HGU(eLOEct89usLm+zIxO>f#udiH)Unrv1i>qcK8i;q{U#D zZ!feXQ&m@J3*_!dX0L;7SK$YO=kD$SW_;TT`GhZ{p-+m!^`Yo{_9sFH_lPpdhnuBv zc@#3g?1AuVj6>PJU*sH@!5=`M3w~<%l_=}5+jA0pxwY^?uZR3jQ^Sx2wchcpF%|lt z3bG3y?l|(lkLo5J;jTfw!^{E93GjbN$iJ8S#uaM40^ZkgIW=DGg`I|WXELdBS< z;DxHrR8+LhPBNy>TmXAq!7^2L_#^0l)()SLZ1h5AY<4iUW)r_>j_=bs$8J;B?BfT>j-qeG&5@`#AVv&gIzYVlMVP>q5J74vam`$H_Dwd;DlWUt_qS zr{3&#vW^LCx4cL5g=EI9O;a-U=tC9B3+8WPC-@D1T-#eB8{kJlK0YKr_FDM?9&@<| zkHJ?_<`k9mXXY1Zn`O;&J^cJ>4!6gLwF1@)vo2KKwQ<#5bD4^^V?A>{))U)Qw`YgK zWxm^aD#<#@Ru~G-HRf;mT=rnT|3C_M5IX#(5Pa?irrue`jMK_NhkIok^0^Hg*x=-{ zBd#oX_jaGAZ|aK~l@*g*CkI*om_D*0im|ogG`-@km@%$mqHD`}ELXvhe=PW2fw6b6 z{)!OlH~<@$g&*rUqTaopsl9gSllnR%5gea8Ez0z3zN6%>8N=^q?*2T>^nOC5rO81%LD*M*J8&wc=0Ei8gDyM4Kw4 z+^;g*v)`g`_*x9(Z^!uCGcz&gW?|0F!kn9}sF~S&Y$|j?W=@?=ovYX~bN48a3%+h6 zeUqsk_@i2#{iA#Oec-|Eystvf?0u8Q!?bZPnfKmsW#zr@7lpoZJV|zz+eosV&{e!` zq(5pEX?tEEn=8sH)?xi)fs{*>!K1~tx)$z8A<}24d>@fO?|b6bd$-O zzqqk3=e+TNA3U~zzCd3g24EBY$^HfXQ3M}iPk|3d)U%;`Xl?fMH=TwZ^Q*_<%+xp` zpBik;PS_sEYj#|Qe$eJ4J5<8#lG%>6@rcRP6hsSMP^ zZ4TE>Q}3X)yu}99D?)do+=3lIyG>h!_6i%w$Bz9<^fmi|=tK8I0@piQ_rLTv>JRJ@ zY{^<~OJRrjoHNe4!){=Fq3`W#wd~t{jC7});r>R4)0~G-P#aC#s=%I*{PMPPJ9FAj zJ9J>leY1WAd=|Wie3C43xvaw9HS{;^SW*6dX7=H*ISxOv_Fl)vQj(AO)- zHllBNS2@;88{i)xX5&U2#+)yX9P!<`2mF)shCOKIFYG<~ISp$>R?cY;f(9KYQ)K5jGBnOX4KLG{<=?3kOE4iwr`Yzuq!L~VioF3in> z9iaB`@v^pwP0m3Vi*~*ASMvAOzWV2K@Uz{wJ^7rm$Z6yE_Bx)+!EZGtn7D7?*<8;6 z)*7Ju;lMNQb$wi~kiF*e2ma7E`HYx{&&j{l>VaqJZ|dI^F30mPBwL-Sfea&7Lp~AB zCzrF#OwU|IvW)c@_`bH_8*#Zj$LS>gkPNEOV@4%n3B5g}=WJ>(l~DnIOO9PEOzAna z%RL=>9b*U^sTv#YcJ9~4PJWi`H@8*X)_2byJk@d7J-rG#jME|?r9+o#&@aRIOQPQu zZ1D7oL#_M2cNp#F>qxX4dir{sQC>E#fBgV6Ub_$RIJ6IXD}%nfZorx*d4nwnOyy%P z$GFeezRzY%+6BL_n;GplV4V{~`-|y_bscd54>H6HlQ%HRuV>!`4-e$~9s6VbT|1e6 z{|(5`;9EJJde03utnIq>jR#`JrH_=8PfBUvgF^D&pM3-VKJ*&m!LDo>Vw&5KzK7NZ z@T1CP+~7^JkH%@>G2*+Nm)ch1hYdQ_hPhx_A7lJiVU6MJnQGeEZIma2*l_9n?(fMl zMtjO(-$XpZ4x5d+1pRSrJi?B)$+!Uh?L3a|pfpQ7VY?-t+d=t`(jA=s^EU5IXg=n!{7eK*2aUDgM^?F4NxpSz6mnf-jKS^+)cE<}%h zTIj9$-DSo6+j;&N)>+U?cR^3~+PQARn%pjYWK&N%3v=ye-M$I_!+I`X;DrL&P#_z_ z>q&FoxhOx^le>RS^_Y6HWDa5NfwhGXarHU{YYzo$4+U!v%+a-w#p}8LpV{kKX7(8H_&lc0 z`4!8|xf=ee!t|Y6mHuG2qNiX>H^Kf+f{xgP^}<_$ll0AjIwScd#kIK-^ZqliRnY5B zxmLkE&n`mV8x(!)PoeL=5BqzyVr&U0{hQCN(<>G#xv>s5cwOcDH2-&H;ltmR{l4qq zU&nLZGr7;y4ZCgdS-!8{T@Rnij`l5JMtY~6`+Mtpu@($~?+X;tLm20R4uCzh!3HT< zLnxV9828zj_p|q)Z)?%FI+`0ihL*V-Yxv$u$QAkqU(yi%%Z&NJHJ(sRoCVUE~~E1B&!Qg>fgMu&Uo$HEVmiDBYU2Z zRazszOzY~{Qa$_SVPtio(!YKQWc7=ttlEc{)zka9jr)7#?-z zy6D5nD!aEZW(8T@{X@v=`vqA=oPc~U(>DGI<8zFiAfHery=(DLhxG|LA9u$-vQH@D z9GzC5@ObSCe+zT2qT(gBev^&t%XS4i_w?*(+@Gp;ykM+=j9_g-z8-uRhq#}8VHbSD zOz*%8dK$Lwbf=ACWomWLi<#=ZFY@?Dh+@-EvVKb6=seY3)%T*i=KdFX%y&-T^ZeU$ zKmSI&`z5u;`BML0#IG9$n4W%$!7f(v*dN7;$Kvnm3fPBV!gqCyQ|l|>L+#JIYac`` zn*70qm=lO8h<@L$*4HuED%f+x++OY-%h!fucUB^%sPLF#^(NTY36lPL_bljK=sx$H zyU+*J<3T*K8n%yBKqgPdI_fTr@d50cqdx3c5f9w6951?S9q6m$CAX9FM#(h%68a0} zIML2-#EFlxnO1*(7x?AA6Fj;5{ugE62JMb_%(Z8=sr!DOq4;R;F!9k|Gd|k4$)ZPD zwji(2F(yAU)Nkx1?T0@*L~W-w=Nvv6+j>l`_c2%3$%soiUWRPHE7sbvZ_pUSM`Y^W z>~qFcT9-5AE$E(tKTl(ssoDD+#n0U9Uw_V65B=o?b~b>ISi5R{1$}4LUsOKU$<) zRjqQMPY(;bR&5t@B=p}(7i7|?yd5&M0Bwi7V2y(HN=e^IZ)3j)`C`0(q|-@Oi7!(I zY3=`u75MuI@kZU7`rURF?IPK{y7xKE3BDF{Ia0p^4Uc>5>LMP}KEV$72HQXzL*KTI zZl8e97e?z??w?T%V7ucLj2+H+zz+zAh-c1+IFC918fw8~+(Uc7N7@s}^fh3QO~Ky6 zE2xvw*24B9CWZVcSM0G__y_+E@-R(N`>^&{i1EA~<5{)Wj13OdqHN4%+5>%7ccCs*jB&*OhFXSKt#)_wCuZ^(KZ9J{# z1)7_gzP&H#%b|x(FSGHzubK@nW@`4mNNeRBoyowSa6hGATZXmHKIpcmUnDyBoPE#p zZ_m@uXL{=u{&&^B=aK$A`9w6XnE}W1B!kAc2ZoW23DCh5fA&GPcW`>F8=l_<{$t-E z<7!X(e;UV}<= zUIkw%uX@Mc=aKJuz2ObygFQgL!5+t9n(HP#$^J8l3)UbmScA1y4dPZaU^8d9tLkRB zr(Zb3t;J`!J(pD@y_$3d;(=UWkS>Q!QiRTQM2xMt@4OCv@-{A?IXn4E_&Ay7s$d$| zFMO`DhupQ-YwlUora=d2kYi1q1^z+Ty08XBtgvd=Ebx2txzD2hYP6#|{29!JF=M{x zu8CK>Ykk#Nw^Z-?H_%)?X1=@XGB=M)*GzMxtm&w;3UhFJ4)zrNAv`_jP^MvSOgG15 zIrhn>8xyM?nVPlJFuyh9NZ%wCdL>hhwb_gTYIl{(sVHya1UqP})T+9w5_@*~&T;7b z7$bdyJyTUTUA+f(qI&GHK6v#ap{r`Ppl|R~c>lZ6p55S8OxO;gzoyCh5yyeu6MT^U zxAuE9{iVK=9-w}r?bD6qUGOCllN;@RpBSg9g?5rXjo{)QOFUvp&<=hXN-CIcHe$9`c1;cF=3E8JM5k=4r3vZ_I~vP8%gmI zzKK{9e`mOPdQ1$M+kyGz)OJe4o_V*i1?5BD3vpsjqdK{M>pC!=#?n}U^&aUJ`+!^@ z6xv?UyLZ)NZbFx?M_+EoTyi?O47|ypvya|$75vUy#{j(N_6od*KdV^m*8C4hKlAns z;{$`2Cx}D$EF!)X;?R80Eta6QFxk@5ICN}mAr5^y@%C|65@)gV^}my!X@PI(a=e1{ zf#b(lFh?=gI1@7jx(^Xok@4ml#1qZfj_$0fqj5X>LZcFT0$aCgIzCC1(+w>gl zE6Ek{gvSGVq%YUK>whHn{1{)aU2&qeSbf!!_E=-j-1fwNIGS~a8*w8pb9ZIo&pL44 zGFa!@L_Q@xcF1A+X_IF`=xgXH-bU8eziFo8uEHAbwkqhv81}7hCp%XXi=wt-{*x>o z!#@}147HD!DcZZ8_E9rDhX3imBG0H|Q{3*Xa~5LNe4qL|A*PQ>qg~|ZVy}8rP|5Wi zH212VN7PxHXgvY>#a{JQK}V5~h;Q)yW%QG`iG7=BNe-!8d^<~MuO{Ev+>aLYH|4U} z?-qFw_r>~v$6)NduEE684^+(M!oD}>W$a)1zW4g|u#dDJNPgg+9zff{Q^t8ZV%!J3 zGS5tjGeW?_u60Ko>*R1_9lKEHWBorh&b!wa$GP#ZWIJhYa{XlLDYYSsbp-U~q^C;s zma8m_^Uczq-hue!Hq1rDh9|;qtUGI)X+!DUa$&y+yeQeTCV5fopQQDvv|G(;4QzY0 z9kQ|j>kh27RoD>t)240s3g2I)J#MnSIAca}dpBbFF2`kN93Sf=KK{FFXwJ}lg0F&o zi5)iB8K>d2J9Ccpl;38y@xct%M7it&8N*)&Tcn8kx+~o9u}Q~>GP|dttxk6hoe6?} zU$xD~eMHRFf-Rfuu%k`b!`Q6~o9g@`l?Pu{6=lZkxpyaFf6;EEb6V6_o>#*t~{>MDDCRY0va$lIvxYPR0?YW-T z7SQGBqu|qGwHI@+9{Pph%qse2u$|x${NU4f3V(NRJxhBYECf#=KeTVJDfoL2^a=W%rF9C~O$BEQ_F&#J@Q3(;bkg6@+d1em%xBCq^S*h{ zRVK%>yEaq37WoU~l5sQ0h=o6}vnq5Pt*0cP@}zIn8u%gbK}d$g+E4l!-CocZc*$iE z^t5keOxjsaejc68Abz;#AV1c@D$)yO(z66uS7)lTsAGWkx1eL{p@(t5W)IeSk7Lce z&Gh{paq1g;N$XIun@b8^9XJftUpN z!)5Ss$jB>vP6}B9f9y1e>QJ7dh`M7#+z+gV-9p>cATn}SkmX9N)!H35>B8zfRCZ0KQ*Su03%Ng~GjH9^C zzPRVSLNaagCiW)kE$B90R!x?#xoBTkJfoprhI&i<%S@F6zG1y(%(^XOw)-NS@jzVR z202ECdph`M@h4H9*lXkC)NQt<`*&u)4cTw*gTrqioIzhz^p&rN3vHXfoZ3d?OTN8| zF{1fsY?*g>Sf+A`iofM3Ys%GGhml+RB z7t@+P{N966oIky|fA1Sie`7E0Q6mrR8}_?Nr}R6p&rZCx_-x>Tjm8e&@4G#C4r|U@ zJ9uG-zIQ<1JKR-uj$B0<)&nT3Qs{o-5uGiQ=U_-jm^N<6h4l~D>8I}G=KwJ7uNn_K zDiK3`mEsU|MiFOpUd{9_fF1@fPIpeASPb+I^cZv+oq-%TP2D~Yw#K1ITb6;|o=9;~ zW1Pd8>0QtBQa%@A+qwhehS*7e*ZpR^jqEn&8l684a=v{J?S-vSxDE_g)4lpMB_VI=*vkrVfIrY5ENyRd=UlrweAzQK>h0X(@ zY>n&}zSqJ&ttEYJ_Otu^4D_{HPxZwrsecqBL)`DxOifRLM`|_VWPJ^^XItP^4!oju zBk5@3IggQp&thEI3pneEKEnoP;bSmw(ut^s9vitNq(9cn_Eiul>7o0o>N)gZ7Yc#$o2O>Y>)9VTGKJdh->x#;^)h3 zq_1dxs_wlwAFNVakA$;ao;E_Zz$e%~@RMS^-1jkK%DX^=nEgh`k*S||pNG69c7W?M zXHPzNV~Api*l*qozVuN1GC#P{euUzK@FB78gAOL1VNCd$DBg$Nueqnw*(}HdN2*F&Oy6i6X=-{v388Td~_L>`~}|#dWWBjhu%@4cX0OkLY0@< z?VLdIj9nBr-1JxTyffB!&?Tch?>wP@eP7JjVy~q0&U$4Z%Y8e5c5X&lm9$S@sm_EB z!MSF{@AHG@72pfm0h)V-^)Jpl;+%07`~3&Zx}E33<~i|<$Fn#m{A`TxwQb&kzlV`N&71 zUw^_l-7WTaCGRj!Tz3fBW+rdD9}Q<|&JTQFt9eY{*4hx4EBLPA z9_ruTJNS7^9_QJ8YVjWQ1i#mPig~Y($1FuWXe!kSdvt@C=a5g5N%*e3t(b=-tGhsh zc=>;j-V|l+o`!KhX1sG`Pps#OMZSAnB-dP5u}iRKfX-R_@t-H=^C0$!buOFnkbV3- zvEW0$&}ZPoaOa76f3p4PkMudo_ZTG~viBAF(B1HVmk+yl9m|LA`~QAE>^?>>yVg6o z?jV`q^RJ*o*e&kc)(iRSKCUh*iGh&)q_rydIeB@eUk5v>j>fN>=&-BRBlvZ%3%`!` zX34%v9}DYsC+2Ip+V?Q-4^!{)d_9zhef46!tKi=`(-(7}@F4s<=iZA8ekZR}_;-bR zZyDadBl}|N;w)s3>ug#liTSnrZPSJy$vNP2aG9>(bt2otWm4#e*HB(zy$0I~pJ|#( z<41M6Dxjk$$9i5-USnL|lyG6sT+P?SVtC3VeU5;t=WY;+eSEC&bt)s6+Zh zY^>ys8+K0m3ET#a_G~QI7v0%WpN-wkpMzQRQP0MTm=5f%;MJh`?nZwx23gDl*yEdc zT};J%F!$|AW`&)$?Ej7G*(8_UNq!sjHgvv|(Y`*{|Cw2K@Dn~S+kJ&+Xgho=V?tVmuZ=iKJ(oF=26?2kacS`B+`KVimFl_yeuFHd2YkbR z6!}ej{fpRyit}|;Prvgn{EasEHGntZ31mA5J4Uf7oYfzj+q4PmsLCVgr)_XT*@?5NK;jdVEQvGO=ClgTy;?HW$LQyC5 z9OT08s-QYIv%!f`#G)54;}3YA2=TF;9kC0-SKP|ugSo8%)^EST!f%XK-vac-! z@cjwQX=5GMf3xb9+}}=R;mVVkv3?BtcCW4f>Z`H$17B*3!=9t}60|+bP9sj%ri zGqD!{zR(%*8D)oEXXAYgJvcXzeI3tr?>*9gbr)h}kd2Lwa`45$%O5idNAV^RZ6X81N!Xdk4@@To1AzlJ0al@C+F*Zw$^IIqaFa^~^Z@keWNNna(R! zX6mziei&N^xV-6GzFr6aa{|S;j9UiA1UAvRF+4TwdYh!ncx`u5Rn+#cZ>YKh^=c+gbHsG&$qr75*S~G^1 zNo}OHD$ZCP!5mU^OHV_e@%i#;OxBf|jrzAhFKjuSH@1wmQ(n=xF@?M&i+^_?yI~8C z%U4z@`8s%=%lhAZ1MLML$uHPgHp#Vm3iMi8r8)yKwI1j}n!Dr5?71>F z4)1UopWBG@XE<+^TQ?Q+_JJ5ZXWyUwaV)pdhBJv}urZI6XV#Uo!N+Vza__t|-gxUB z=sCPwW8FD)Zta8Ix>|gH?{IEigr8%}t+Qj@_j9}2gZ#_Dn^gzLyHJ<09yVit7CPfT zrqX_V89Quz32lYGH%{gAQW^Yq_6V(!!9VWTFi8XIg3&S}6#L+{aEuAIlhF6?$>`W}T2q%@&}taF9VDD~T8b*?d%xx!NL zM@q|+bA{U(JI>+<7m%Mfa{D2JkT0|EB9@{y5U(I(WAVJWh#6bXN6mjytWoP9b~zWD zXQ0$4#2Izcu}!t&9Ts@6XB;!#9Y8V>|d2%rsQmK#id@Tgs1F!Jg45& z6`p}PIIirn@D$LD+jX{Ue9RfX>1LK2|K4&ckMx5cUTt$-@-*!HKDFPzHRk#j{IxI6 zR1m*Vb6>2$-=`?KzyAIk^sKk~DE7-Mey{egud35Gl__qv5Ok`N`Q<4rw{?<|d%~{t z+izs*qjvavQ6=;6B&Kh|JB5gD6W%4nzJ-20k{^8S-w(OU@8o?MJpAT6xhZ&O%hNNI zT~pD{jSrmNzhR1+dwL4`6m#}(oTBPwQ|eq(rYNpUKv(_>)63pqnX}OLOu3@McDu^o z%J*+X`Q2Y&+s6+cac#h}xL9u(wlW*?G1uxh6}(>xdySCU@2mLw_MARI?3C||&{~tny_aezOT0rRhy5IJLJkHz;ENsOLB1{aSa6@0=lD3*b4ydwD!LGFt?^59jt`zTr$Rz58Zx^8H6>uJrdTjpd%HVS^jX5BJ-a!AD0Ndh!7HNwy5{(!;k} z2K{IH}l8-tdCIN;8w?xUD(@k^_)Cmmm^R2 z$Lo$epl@O{W@^9f64t-bS?B7AF#SkB%l%h|_5Y=x^=E#exW20@{pwY?rz(1OJ8ZmK zIk>+3UDpO1Y;iful_MsA_qG|YO;(_L$L1#1vK;jM;2Q_u&mFS;OMf}^lv>7A4}7Ha zkK}VNUd3ErX<_QT`Aq-QZxsEi-!LlQb$&kY`pQ)-0NJGOHyhSaWoNV8IfwGOXD(;1FRbA2d($s}1pUPO;mQuN z!S6Z`>j!r+yi1PtAJ_#y3*&U7L!mLw;k{IPwwLeoLM`yij{oVSneSm{^le@WzTX|M zv9b6(gHKaSXR5s=-mInC+gsbu&{Bj`Nv*4;Jry@r#1qXa&1g-g<}K|=wRg;muj%So zF)x03Q|rokt!=56RV(Ki?eWf3$Gpzg)@IN*waEJ&?Z&*ecynVs(d23GSo~Fu#ZdP$ zd>~pZ-huKun_646OPf>aPOW22N8{@Drp}bs*{Y?JpKXt~EKi{|Nv)|RnYvul+MAZI z=)6=*$D5i{$ul&qr4^aF+S*#%J5xzd<-I5$%RTn8`Th5`x49{Swz98j>`at(nb}rm z*I4~U7hQ1C8QSO3^_5*KwUw!rt?g^H)a6Dhl}sh)Xl?DS%iH5CHE?fbQ%k(Fsb#qb z5rKFMwX;2CbhURhtx7eo(c;EsT}|yNZDm(y>T-Ep|1?I-%?Z%1_zT4WGQ*)E?_SIlMdN7Z2(>IL({Y^L9#J8MKfjHV)q<$-pwb8|j|_{#g6VTQ2%`E9&n;{RSoi^(~%U6>l*xT3S=9 z*3sN#piha^npOy2=ZaKQyVjg)S>CyV)vnYS+_;ao-A%3YR<P z8gw_w^T#Tud``BtHg&W@i?$dkjQlyR8tXrLBl} zKog}_HMMqiK-VNv=(s2^m1OKKlr;-^T3b?cJDXNgzNXHmcyrSgf^#e5Yq(lXq_nnF zJMkG@wCJwW+B6nHe!6H}=(F)t+Q-8qK8J<&>TD}EVi#bzPfQ$$`JZy>}48TgSO3rV4sBV1(0DW*X7k{-!zTwcWWj0 zt@3WAe;Iji{4( zjjw45{D%o^q|T_sj7y!NUEB&0Or|i@Wz+_)N*$vP$DVLodEb-tNFR@yIHmQf>?PRG~{+dSrp;4sX$WcO* zD%s7*KM(moR=F2UGJVftCzq#MQnc8EAJudj4JBVRXbTsdp(UC+JKCVzu_9Ul)>K`~PeHFZ=(fe-+yM z|4aWLZ7cEr&9;up|G#1w{~!16gkF?>lGX3|hxz}ga~b&i1+(qa|F^co>aQ7bhUoHS%8iZyNXUyk4)*>-Xy3fH&w3dBfg_H|q2Hd_KQV_XT`GU&t5sMSM}L z<$Zp?U-t+6L4U{}_DB3t-K+a_zpm>6J*bEDupZH)0dK$;@CWojAP@|M0^vX;5Dj{R zzMwy-2Lr)iFcb_2Bf)6M8}fzxAw3ib1w)}wI1~v*!``qj><{bVKsXo^Jn+r5ChOkl>6npjq4FZM8Em)etg>YnPsng~z3^SnibmtjbrMQn)-)iQ~qpT??Yx38H|5G5vJxTMJNgFX~BrVxKx|Ay}V#<|@^2xC_ zZV#v8-j}!J^JGU0*U|)RN0(+aqvzzic2FF}7w~vJp}DhXLlpep5I#W+zi)QhA2Gb% zP&^ok2Iu;&N?qROyGoMy!n)rV^!S2dM!_AUSePdg@_6T(ks_@&9t?&3-e@we6@o_k zOtz@0o{ZHyyft@yAmD)!96N^F12-DbMvZ|b75=0 znld^)pwPmph!NF|NZ1JZd}+Tg8BHXkL7&$f4C#8*pAHzlNFtpI&t!Eo(f#(O4r3Kl zK8-)^6CCZUbbph-&DXfn-{x(+V&%%NW?!4Pz@@?;k_zEG~te0(?tF5uXN3zf(tJsUSy#i3Pn4 zJ89xC@xPNTD#1hf3oMx0-vs=;rTmto@MXaCyLaNUvrbEX`USkzC3q-*1#lAbC@z(K z-I7lA-3k1frM~Z5(y6>3mf)fM4hyFIzdZ`S0Q|P4yq7KMRNkNkQ~n{~*D7WE6!tD~ zk;KW~1EAj`6qmwOIDb~`1U_U*p9s7NaY^zuX*@myOfl?V1Jii6m{^u~88F4SPczeR zGqFtX1)hL;Eywq_z!Vpk>Hi5_i}YIDp!z-lW)n1#Og&LCUZ!54^x42wmUL`8u>F?w zF9P3VN&hnNndlGc5X!#+nA#&Q8`}&_^-FvW@M7Q?ZV>$gCYI?B0aJS<{uwaUFYz8= z8P}%#Z<|=A{~4ItBk?=H#BYfY053HWjrSqSU$}w!tesDHl)e%`|G zw}F!-(Vp2UZMseW5j1P|rEYQaRm!Geh%uK=)ILwSm+$&2Xk zwqTo)=pQS=L;3%*V4~k|!9@R;5e3DfU}nQUJp!rbKBo4}2!- zllVelYQMPbYzeU310((P4HHXx9FZ&Rol*J^Of1vy1*ZN<+z%}G(un>=6U+2hfT{ly zzXmM#zKDK&g}^d>A~5ks;*)`kmy=B`!9)3<%@+Lgf{66{*`F2TOZu4bHNZ5!Uoi0t zz%;(iCe}VD_=#pQ#fGzfz{G#9zk&OJiJyEtfgQ2pUMbO^11$F`311CtE&n%1;ZIuH zPx2TBradNcDeMejiq%Q{S>Ok-C&b$aeysq$5?IO?ojY!};GY362LB}eTfmP2OL|u& z_NJ#4%byJV*3=?C1^9teiug2Ox#vjZ)nH=LKKP%&RG-9)fNAea;tPPOeu*yvmiu&6 z-q%em)4PGGKN4qvslO8U0L#5P%D=i2mkl$ut>aUy+ zKLDowO8Ng2Ftt~v&-04@%5+*oQF~?j4q%e6$ISK&0TVwa0MmT&`-HqbY^JvZ%e_xZ z?+2E9qJ-ZCCVqFD`GfxAej=r>0+#!OgvVO=L-VZ`SjLx0LhuS`zBh;Bs6^%gez&dY zkAD&PmTS!Zz~9>gO#6G%pC1Q7BP=e3odo=r1y2J0GRouqg*<)^nDztPO#AU&6U+SD zfM2uF{~DO~5N`$n*_&CP5LnXB1=c>L35awraGM3|z*kyu2$gS&W)7~iOC**OJg`URio4~ZU zD=vlI0KCezye^ z{qq(~^e>g*q5P{BO!P-AnCO*pqG#g&p}gIKiCzP~&(dEvaP#TZdb$)=15A6n;XD$Q9d5e<+u%)%H#5j`SfF8xtC1y%Wo-<+Iv1Q z?G1}dVHX0^nF)!P0N*>Uh%W)AeP?kg>`Rm%^>KX!d0Y=XwyK!Ef%03@cL38qw9J1W z@FSM=7lCQ-`W6t-{JDI*z>@yofGMsk@m0VSUzK<*Fztg&ydId^CoZg)fvG(bZw99N zCB6o@csbd1C3q3?LemUkJ_3vggJ!fejjpvVm12Z(F(xtE;1Fx8=aYT40@ST?V z{{Zm*0(P*6fN8H@TsHPI;4icn@gCsf7v*_Dq}UuR3ry_^nEd!LFqJof zr`yvjf2L>;TE{K1+Sn-$CI0mj1l~+>G+2JWfDGZL>6# zPM5-5z{PV0HuhN)i*y@{0aJd7=K~inCu=CdL-}2>UsQiLh)5n5TGFX~Dd78L|6q^q z0Djrhp1Xk;&(_Q;6!rt)doB20;4Ns+NuVHo|2yFS0RDoBok*ba#bsv|z(g-D*i&Gl zmv}rCRJfdMVhP6j>obhqFWZap_yI7r?^5KU{xzS8_y)=o<6~ndTk=zXeZby1npuOw z0)*!laTxe93qAw5yFoG;uq&9=F{!KkAPo= z`36kmbt?*`@%A@}@w(iczdr>ge%g^v^KtIkVm#VS{8LN)BoEI3pX1e#N|(ZZXGte} z`eF%2ykdc%-w0}|{}oF*mG=QKoju_C66Kxi5||ec{CQwHUr6 z;s%xXJrm3H+kojTNWiSmJy~FxUIR?$L}9tb?mg%#B>5R!( zGyOIb%k*AgI$t8of5F5u{bk^DkS_5c@RnF{Jl+G|YDs?|ctw|1h=*50F+URqHv6|4 z_&Q7aZDzVGzZduk$S270u`}l>jFqo48ekefiLV5fXP>BjcbHhF-wiC!E>ZfECYI^X0LwE)l&+pGuuOLX(|Ai<0W8l% z5q-eKGCd3|&qz^v!o)H?1x)fK@d{vhHj3zTCYI?p0+W16{4HR47K-Q}HnB|K2TbxN z@uR@<>=V%+FtJQO1pJ7F{%^p=3;Qu8cqot8DR6za2t;I$w!_|$ec<{L_}cS?ym5Jl zJ$xKkp7kU9$oH?!3dnwa3j5h~Hbh(s(|{M$6|oz5i3QgHUuVHHf$7|zxD+-An9cx7 zJP-KFD~j{)OTf(*oCRLIrZ~Uv1%3=z&ez`o(|JN!-iyGI`XYV>n9d=}^w)r2w#fgR zz;td)TsHOxU^>qw@qYuax8VK2TP*l5z;xD1(jNq#iuOtTSKwOU8Mr~?TZJUT;<7O; zHF*CdCRdxz=14pje^P%XCfDR;;HztGJg1t zvqXEieusSS0Ve)R`Bmo&dD^cCd4B@BKHOsBfB(FY581xQfk{4O`&{P>{!Ilv&99}v#4kyI z6EN{h(mxAK{F3xnTp;B03N!ytf#rEaD(?ueJnKg|wphr|DwBR4FpW3N6tDkbU>fhS zCU#yZ#&em8&jGgf@AaebIt_&8Mf#yvL;09r(m#6B#DYX&e*nJkZ2ZSBh5fhulVc~_ zUxJ77f3aXH|CDK*(EQKIPAkDf`A=Ig(bror`RnJD;Gz6^7EJV)SuoLemf)fMY6~X% zt-!yw^yenvPC1^Kk9&aa=g3Yd>|x-?EO;OA#)ZZ7M}g&eI-1Y#npkw$#@+*_@+E#B zxOh3)2PGK&zgV;{0wR*uwWnX+ZG%EK5W5Z-~|OGYhz~sUrtJzUx*(87cVD^m0-k& zmI!(~h=?EW15RJs&q0M}Y@+CtCe zp#%@*vnZeFf31k}=Rr|fakGV<%Zmkbc`3n=7YpX{0{re0jkk{4_aoqi=X-OGfQy%t-CBZ&^4l$#__Z5&!7|Ovg8fk7qy_H_(eEh1L;3qGnCM@$V4{De1P|q3vtXhhH?y?ACzar#{3Ht| z`p;P~m0wqahw=+7nCM$9nCLGn!9)2@3nu#SS}@UXE5Sqg+bx*re`CQ!|9A-=%0FSj zM1RDBiC&py?LYQ!Etu#%7EJWM5xn>q{{FVGAbu zpII=`?^1S@L=OzJ!P9>SOy`X^n)r1}j~3J41E%w@ zGTjbCMdx4bCcO)o&c8ll;_1Lv`VjDIXivGB-U`h3gWzva`?eFkC4C<-onJ>X_PFfq z&%oDP@ac09PaUTr72N<;H85Xnnm7zh{v7#BRQ@-B$)EfJ3Eq`Ld!v~+2F%}cV&d-rll?i<#E$@z|24_PvptN>xmE+B_Tgo5y4Y`Q1E%sH2!LNR zi~RgcRGc^Qn&~soVEjDDViTu;Z@)(HoA_}LFr5z>Yo@;oOy@%+zUnh#KT+2AHZbiU zcANA+M8kKYJjvgefp-Cuy`=Jg|2g4*l$-P(#0$v(koYoSYkyCw6aI|k=K^4|#|uya z^|u?C)@#2u%X^s8!GFoG!-T&Gsz=ru~2_6Tb{h@&2Eh^`{o1{h!g;dK142O!58| zCSGwa)*ELQ<>^&mil@g+d22fl;u#aq9uq(Q4Vc#Jl3%VxjK|OL#rywB#2YAnCi}bY zB9y-v^_%7G0Jh5OxQm7TonWR{FA?jdb5v2@SAc1Kb(&fJHSq7rAD8$Kz~oO}YNp37 zL3tL;Jb1lKC-bzoCh_Dd^Q2ZZrtyB76!UZ>Iy#t#|Az;C=rLkY(K9+8yj7#UDS`LW zAiZPF%FcKK-z)Gaw)jhYGx6G=#*P(ne=yXDH}&P|IGFJH!ik_a67|nD zmUnr)tno|d>v*Kv-`?r-(j!HU{JAfGq_L_ioT%de8O^O7UF|9SounJdDqna-(jPP; zLBA1?C-kHdOw_Zg%c-n@(b}HUTiZG!>8=)o9yJR!w9tDn0$u}8pf%E)Gm0gzLgSlL z=ttAalF~x~9S_3k0leiXnf4`uvUGpw_#F(;ll^E}%J3%xdORFR$HS>;%HVm?IM1Ru zo+$SCjWj)?l}x2l{$M;6iKhZVBb1KD6J9)mm%>9@tSV{#3#?flOm@YuSQB5-^tI;X z@~`TbT^8zEtz)1Tc_H4H7fF$)v}wz`QXQQh-5dAmNj(+tCBp_D;WL?D$SLw*Y|!C& zDxHXj{b-2SBwL9Wg*4&?KOLz~k6~6P?-^}t3imvV+Kl#8bK{C8G@g1Yp^t{d=F%ctP$Q2ctfRQJdGE%-^C>7CDz673V>gyIaF23Mm47ia<`&03_H)0rpG#;O=$8<9LlnAFG zLBUiwiKl8KcxqNph0^h08Y1A+!``?jFltIZ)-;DoCm3PZBaxtwBauiMI6+&aES`WQGIB-H5lMU_^Tjvv z0Qg280N=>m^^MG3(iWV%uza470WForL)dt3Hkn8mTwJKNLcq9LBNG|qQXe?yf(y2M_APkH>hoGBxd21ic{Svh7tflH%q z6(8SGQ_G>AHyc7I? z+^Ow_IAt-%PVd~pv9v^le*;w?9L`HRoT|7lQUGt~-C>{KokgEIoh8i5+NtS=}ON0Uw^pH$nltdLjt_Qgx`PMdb<4Hs(42geUX>%@xaORc(|{~+feE+;&lUFUo@NsTj7aEqgLN< z#Ku6JK4NQ3KNPG2Z$i69_pditNbkl6KB2c*mDCh%A>hL4ABW zS?cjAMl@JnXsBt4$OO2p%-OUB!<7$(^+P?>KY z^33ONAflwIiyEr%)>SUyRb9bERaXRGSoC6s$q%Fn?}Q5y{gjEFZL4f&(~WH_jMJtgcNiCCJ~5n2F8PwK+L zyZxeP$+!H4Q!TWhPloHyuRCi|{Q}Z)X+0jt>u}(R%M% zB&OIu-t?O)%-_@+q!$!-gah2|p})EEFW3m-+>pnEcnME3T`+owtY=xuAojyb%&)4G zOb&9h1I_10$kT@aW56HB8ZVUOto}#V>!&Be<%EX(lbH+WVEOT!K((&4n6s2409p+0dG{y%t5=e%@UqmtuI3C4-=kR7P3ejwhcTU z{N#wobH&$It)v(Ry|Wx447~N~!NdiSR~pY)YMjHja)XD>`|93Iac8AiKQJ)5%N`FkgkW4!LSjCM)hRe zucv+KP}-aF;!u&{_ZbO<+Y7$lh@=)HHe#uT$mNKo1_~bJ$fTu`W^!@lY+Nmknp)1i zQD=}cD+cNKl3O_9Z~_vcuSQT0g(D0nC`k6=1SCZzyRr?xxY6F2=xS=l?^1MlQfa(5 zK9P>3qJfA%7)%L6B#j`>6^@EtT7%Kj7n?k~@;_|*(Dd9XVB%tqJ`2 zCw_d6eo(ZE@0|F};84k0oU0$P&A&kWf)TC9b#b^eY`{T@rV@S}s5NvSf}2(!tq=x> z5=tQy9yAP`qzRixO~nzZu=#6jKEK#75&R&RKN`kCQ-3lP$7#kSE%dEL7u~;-O@73B z!oGwrjC~E9kP9{mi8q|a?|CEZiTu4A>Rk3bo}+d|z!9pS zKIme~z$PkwbVWzy{&*VaLg|+)JUE2x_u+R=aIP(c?I0a5E=AX6TwX-SBf_UgE!G`{ zq#p2M3k^TIf**7-qT=XGNk(%##83y5MkwkFMuYI5^l%9KApBVI$VZeS$8G573h;YB zY5~5FTEIu{g8mU(fTIW_jJ6IvAD|y}3()fcK5y|yZv*_<0eW-*QiN0D0Rx9Fy#Xw< zL$sqd%0USH4>iE>MsRXD8V@AGiIhK$nL4@#_>RwkQ5FzAZVyIRfZzX73kZMI0*>DW zQg>npmQLVcLv`4LX2)8fVBD7u;@6Pk0UshLID<>t!#t)-(&P)(weua?C31r{%JJUT{n_5E`FIj*MH_(Oxet$59AAZs?@X0ie`&8c`xR~ywBOozOYv=Q+7QZSrSfDJt8;`b(_{&+ls zGgZ8rIDV6gmcrN#me>2CZz zV(g8kB1t_SiR*|8M$#}&1u-soNWL_F#js;V<8u7o7r20M5uR~^NCwl%IHbnptuGXU zF#B~M?Z5d$5lE#t*2!(OEX?n{D871G%2?QfpA4h}4E*du80Sh-?W1VY38q4%nAS_`?YuzuxA< zd4&;c2_bd|frl=_qb-p7;j)ytBz`|?2qKV^Na?<$&*H8Yds31iVx;N#1fG=vXH#VT zj%`#)hGf8iQuNX<-2H#eol9@s#udl4YJ+ZCw5zV_MYlCLs>0&c{;(NN5nNm6K+j+c$u_Zt8 zJqhM35H+$OASm`-!k;Fz?ZN`qo_s)rdh$Wqv$_0mHXa>|JO}EZeFIA(uMkBsu6Djs zViQ0gmEpzq9_whnV775o)m|`?FOTBppxnl^UDI}sb;S?tN;q4tD;KTm+3oQO@r3P# z%(ouprr{dr2Zpui8t6o_NN%`R**_hA@o-%XPchcij)+TzHl0PNixuBijEfWAm~7n~ zIMWcaSkh)h&Jb3p<6OC=9ETnui}YV9gaBoWXm>1otg>iU%Ef{|-K1yLve&Cd(l2p7 zLp=aD36bktTlPGETs2wP3RkePBi2MsV5c!QH_Sp|QVx6lu^u+eK%NU`u(5u+swOe* zA+@N_*lJk>6>xb(16iVul&}!-HMpqO=K=7ii+_E3g!}i`iox?P<=nrYFx2$Ny`dIw z&hWsEH%wVPL|S%t%W;$WvZcL}9jw3p^A|4;A7$LaGnX9%K-0Ets%U#V#tBbeS2Pvg zp1tkscP$$xqS(DUKPOoFDDHa8;Hn?Jc>46^UO2_|RbQ*N58HRLM#LU|+o9Z6kRghx zKzE`~m^&sSL)%?>KcdKU{1VLBb7dc1`7nis75FbQF}R>}fX77|`ic%dj3@`0)NE&) zNKQ--Z{Th&PETso>f?K**#UHXFDrSNutWcq_G9l-<_SF7MEQ=MJ`+~kok3$NS&Rx9 zC;hr{%m9upQH?{^v1bt`4wE|+kuB%NBJ#>thkZ!vuuExa!k5T$LBb8=`y+NI4bvd4 z(G?nCqK6u6;&rt`$*dKkVHKOL4m~j7{yXQ+z7TsbIX_W{= zb+6t^7;slI%Xv-6(4b~UXa6Fsv;q+XIDAo74=c+lG4PU$Kvi+u+m)rUuVI8_t6z5I z?OYuE0Z*>1Z*FZtrC)%X=~4X%Ky)A-RDTdli@4oIs2#^W3q}w6E^--HgTf?!cPn-a<-=HO~Wq51H&`{fhypS?({Uum~RGa-L#=qfk=bk zw;oubXtlXd6aDz+O^JhD6zyqm;iJ5_uvEQPegMRR47$o2svf${PBDp2R0K>QXqH?8 zjn>3fS~kMnvxI6(38~*rgGDX#hov4X!~vdtn;~=(T$fR1;u4Zql;-mn&!0bjCKLb> zHU@t@g7tB1v4!F~ar2V$c&MH{!bk9myauqkDBS@ob|~gG|JqHsLO*##F9fQwy>nkd zGhu0!#GYKgiTx(*>;7b@PR4gl2sM2Coa^XDeK&aa_N`E#R&9nU3vIkQGM(^kM}l`$ zBTSoMj%giH1vcm9F=77ShOP?Ak-QqF2NPC3y5Ce%dYZMWxoNL?X*u1)x{?HFJgrxy)Bc~fD+JEse!sM~DW%H7=^lnl^OhbQdoy79#n;H)k z3150Ut&=-%nDFajmD3G3H69Is>xV7iv3Q(?@6)TGBYJAlrbejwYl5I}5%hF}LkNZ3)Q{Us06nXWsJEOr77gAxRWbg$2!VgHnj|HA z)iLJ*97)U5+A86C7oCL6{XbG`z+Fwo*$Ngcdj%}8#5J@6;G@C%lW6Ey-@^#LFx3F* z*Ahd++9F-f-J(P6jwaaf{GciYd*_HYslBdegMA)yWf6S;p*zLtE~VJ$G)X;LLe2VS zAh%Oou96dVHPCl~t=Ui;sO+vEhN2{5kAPdC(tPXevuBlpc?q?NYsF55clHe}j_oih z?kpltiW_E!A4`TGELX-Q(ZvqnSBlIQ5I7_CY35ysM8lo|3&9Q-zV3ntcEfZXU46Q6 zJ-~eIYvxWUmeA+^Kcl}lgPHyCaCXgoJRU9+KmPG0=)0GYd{lR+L*fkXP(mUumP$yy zEhF!Th~TeRqOlrbnaj8n$serm3C=fQIZq;o2C-+Q0<}O5gKUC!gC=1@|l= z^Jxp%dA|~>yO(hHSAFMp(06_co!nAO?}E-U%{6XA==VPitEVNv>^ z3Bwr?CiS`rq{RwLHmUnJu+xDAld2_vA7lOCj!=#i3MoCyl3w-MaY7vv^=N#X;kS_0 z@PazAqIX!#LrXF`2%U(~ugTL$2yxc-$Cn?DPX9ih`=}m(xxk%(`~W8*7(H9uxPmby zQ5K--Cs!hWuV+dpdtlWycW&AAFnDl^22#q0fQ=Nc&Pdi@!l!RkpBA9sI$u|E#^DYmpSNTj=PZ;X346E!{F=uR2Ebt-P!U z=YPABJf$&sZy(0VR4`WLkNHkp;Ac_J^`v1+tPha_ z2Jd2N;bV~c@lTV8quoVhYi_9s8T7Z80l*6sMEsC~g;Y`PS`H`LH;ebm$jnXRy{k<6 z>ZC=i@aGjCI8}N~JgCcvDoUej^3vhZN4!Q?s%(hg{wTE!K{)WEZX`;X?%7AWa_R|F zO;s3&Q`bt}=n+^d zv#w1;u2Ky5x{U`e$;@XZQG!SNJRW5)a8=EXU9J$hp7f^ZoI?gYRFm zKgVzQk`68l$1nLQ=aI(vVED(qgW)ZCw8LNGk6hkw`6}0t-ZPG$bBXMwj6Tack$QoGe74a_{KdYt#&y6d2(<-YV_%l^W-2s zc6f&Hg&+Uryf4WC{tJHp9}g$b@hd*0r4G-)Kk@j_!2wM(9l1PdQhC;VyyU!plcPBw H`Me(he8N-G literal 0 HcmV?d00001 diff --git a/benchmarks/guest/sha256_iter/openvm.toml b/benchmarks/guest/sha256_iter/openvm.toml new file mode 100644 index 0000000000..656bf52414 --- /dev/null +++ b/benchmarks/guest/sha256_iter/openvm.toml @@ -0,0 +1,4 @@ +[app_vm_config.rv32i] +[app_vm_config.rv32m] +[app_vm_config.io] +[app_vm_config.sha256] diff --git a/benchmarks/guest/sha256_iter/src/main.rs b/benchmarks/guest/sha256_iter/src/main.rs new file mode 100644 index 0000000000..7d0d23dd7f --- /dev/null +++ b/benchmarks/guest/sha256_iter/src/main.rs @@ -0,0 +1,19 @@ +use core::hint::black_box; +use openvm as _; + +use openvm_sha256_guest::sha256; + +const ITERATIONS: usize = 20_000; + +pub fn main() { + // Initialize with hash of an empty vector + let mut hash = black_box(sha256(&vec![])); + + // Iteratively apply sha256 + for _ in 0..ITERATIONS { + hash = sha256(&hash); + } + + // Prevent optimizer from optimizing away the computation + black_box(hash); +} diff --git a/benchmarks/Cargo.toml b/benchmarks/prove/Cargo.toml similarity index 87% rename from benchmarks/Cargo.toml rename to benchmarks/prove/Cargo.toml index 531b4b13f6..101fe8f966 100644 --- a/benchmarks/Cargo.toml +++ b/benchmarks/prove/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "openvm-benchmarks" +name = "openvm-benchmarks-prove" version.workspace = true authors.workspace = true edition.workspace = true @@ -8,7 +8,7 @@ repository.workspace = true license.workspace = true [dependencies] -openvm-build.workspace = true +openvm-benchmarks-utils.workspace = true openvm-circuit.workspace = true openvm-sdk.workspace = true openvm-stark-backend.workspace = true @@ -30,8 +30,6 @@ openvm-native-recursion = { workspace = true, features = ["test-utils"] } clap = { version = "4.5.9", features = ["derive", "env"] } eyre.workspace = true -tempfile.workspace = true -tracing.workspace = true tokio = { version = "1.41.1", features = ["rt", "rt-multi-thread", "macros"] } rand_chacha = { version = "0.3", default-features = false } k256 = { workspace = true, features = ["ecdsa"] } @@ -40,9 +38,9 @@ derive-new.workspace = true derive_more = { workspace = true, features = ["from"] } num-bigint = { workspace = true, features = ["std", "serde"] } serde.workspace = true +tracing.workspace = true [dev-dependencies] -criterion = { version = "0.5", features = ["html_reports"] } [features] default = ["parallel", "mimalloc", "bench-metrics"] @@ -56,16 +54,5 @@ jemalloc = ["openvm-circuit/jemalloc"] jemalloc-prof = ["openvm-circuit/jemalloc-prof"] nightly-features = ["openvm-circuit/nightly-features"] -[[bench]] -name = "fibonacci_execute" -harness = false - -[[bench]] -name = "regex_execute" -harness = false - -[[bin]] -name = "fib_e2e" - [package.metadata.cargo-shear] ignored = ["derive_more"] diff --git a/benchmarks/src/bin/base64_json.rs b/benchmarks/prove/src/bin/base64_json.rs similarity index 91% rename from benchmarks/src/bin/base64_json.rs rename to benchmarks/prove/src/bin/base64_json.rs index 1f0c99f082..3c6f6e6d14 100644 --- a/benchmarks/src/bin/base64_json.rs +++ b/benchmarks/prove/src/bin/base64_json.rs @@ -1,6 +1,6 @@ use clap::Parser; use eyre::Result; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::instructions::exe::VmExe; use openvm_keccak256_circuit::Keccak256Rv32Config; use openvm_keccak256_transpiler::Keccak256TranspilerExtension; @@ -25,7 +25,7 @@ fn main() -> Result<()> { )?; run_with_metric_collection("OUTPUT_PATH", || -> Result<()> { - let data = include_str!("../../programs/base64_json/json_payload_encoded.txt"); + let data = include_str!("../../../guest/base64_json/json_payload_encoded.txt"); let fe_bytes = data.to_owned().into_bytes(); args.bench_from_exe( diff --git a/benchmarks/src/bin/bincode.rs b/benchmarks/prove/src/bin/bincode.rs similarity index 89% rename from benchmarks/src/bin/bincode.rs rename to benchmarks/prove/src/bin/bincode.rs index 938a5aa072..c1add70344 100644 --- a/benchmarks/src/bin/bincode.rs +++ b/benchmarks/prove/src/bin/bincode.rs @@ -1,6 +1,6 @@ use clap::Parser; use eyre::Result; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::instructions::exe::VmExe; use openvm_rv32im_circuit::Rv32ImConfig; use openvm_rv32im_transpiler::{ @@ -22,7 +22,7 @@ fn main() -> Result<()> { .with_extension(Rv32IoTranspilerExtension), )?; run_with_metric_collection("OUTPUT_PATH", || -> Result<()> { - let file_data = include_bytes!("../../programs/bincode/minecraft_savedata.bin"); + let file_data = include_bytes!("../../../guest/bincode/minecraft_savedata.bin"); let stdin = StdIn::from_bytes(file_data); args.bench_from_exe("bincode", Rv32ImConfig::default(), exe, stdin) }) diff --git a/benchmarks/src/bin/ecrecover.rs b/benchmarks/prove/src/bin/ecrecover.rs similarity index 98% rename from benchmarks/src/bin/ecrecover.rs rename to benchmarks/prove/src/bin/ecrecover.rs index 5251fd8655..2a2f146f4c 100644 --- a/benchmarks/src/bin/ecrecover.rs +++ b/benchmarks/prove/src/bin/ecrecover.rs @@ -6,7 +6,7 @@ use openvm_algebra_circuit::{ ModularExtension, ModularExtensionExecutor, ModularExtensionPeriphery, }; use openvm_algebra_transpiler::ModularTranspilerExtension; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::{ arch::{instructions::exe::VmExe, SystemConfig}, derive::VmConfig, diff --git a/benchmarks/src/bin/fib_e2e.rs b/benchmarks/prove/src/bin/fib_e2e.rs similarity index 98% rename from benchmarks/src/bin/fib_e2e.rs rename to benchmarks/prove/src/bin/fib_e2e.rs index d19e0b56e8..e99803eb2a 100644 --- a/benchmarks/src/bin/fib_e2e.rs +++ b/benchmarks/prove/src/bin/fib_e2e.rs @@ -2,7 +2,7 @@ use std::{path::PathBuf, sync::Arc}; use clap::Parser; use eyre::Result; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::instructions::{exe::VmExe, program::DEFAULT_MAX_NUM_PUBLIC_VALUES}; use openvm_native_recursion::halo2::utils::{CacheHalo2ParamsReader, DEFAULT_PARAMS_DIR}; use openvm_rv32im_circuit::Rv32ImConfig; diff --git a/benchmarks/src/bin/fibonacci.rs b/benchmarks/prove/src/bin/fibonacci.rs similarity index 95% rename from benchmarks/src/bin/fibonacci.rs rename to benchmarks/prove/src/bin/fibonacci.rs index 37ce6ff040..3e2875fc35 100644 --- a/benchmarks/src/bin/fibonacci.rs +++ b/benchmarks/prove/src/bin/fibonacci.rs @@ -1,6 +1,6 @@ use clap::Parser; use eyre::Result; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::instructions::exe::VmExe; use openvm_rv32im_circuit::Rv32ImConfig; use openvm_rv32im_transpiler::{ diff --git a/benchmarks/src/bin/kitchen_sink.rs b/benchmarks/prove/src/bin/kitchen_sink.rs similarity index 98% rename from benchmarks/src/bin/kitchen_sink.rs rename to benchmarks/prove/src/bin/kitchen_sink.rs index 9ec4a26d71..80ffcd2578 100644 --- a/benchmarks/src/bin/kitchen_sink.rs +++ b/benchmarks/prove/src/bin/kitchen_sink.rs @@ -4,7 +4,7 @@ use clap::Parser; use eyre::Result; use num_bigint::BigUint; use openvm_algebra_circuit::{Fp2Extension, ModularExtension}; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::{instructions::exe::VmExe, SystemConfig}; use openvm_ecc_circuit::{WeierstrassExtension, P256_CONFIG, SECP256K1_CONFIG}; use openvm_native_recursion::halo2::utils::{CacheHalo2ParamsReader, DEFAULT_PARAMS_DIR}; diff --git a/benchmarks/src/bin/pairing.rs b/benchmarks/prove/src/bin/pairing.rs similarity index 96% rename from benchmarks/src/bin/pairing.rs rename to benchmarks/prove/src/bin/pairing.rs index 012285aa6c..6f200172a4 100644 --- a/benchmarks/src/bin/pairing.rs +++ b/benchmarks/prove/src/bin/pairing.rs @@ -1,7 +1,7 @@ use clap::Parser; use eyre::Result; use openvm_algebra_circuit::{Fp2Extension, ModularExtension}; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::SystemConfig; use openvm_ecc_circuit::WeierstrassExtension; use openvm_pairing_circuit::{PairingCurve, PairingExtension}; diff --git a/benchmarks/src/bin/regex.rs b/benchmarks/prove/src/bin/regex.rs similarity index 91% rename from benchmarks/src/bin/regex.rs rename to benchmarks/prove/src/bin/regex.rs index ec9835d92f..6efe8dd5b3 100644 --- a/benchmarks/src/bin/regex.rs +++ b/benchmarks/prove/src/bin/regex.rs @@ -1,6 +1,6 @@ use clap::Parser; use eyre::Result; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::instructions::exe::VmExe; use openvm_keccak256_circuit::Keccak256Rv32Config; use openvm_keccak256_transpiler::Keccak256TranspilerExtension; @@ -24,7 +24,7 @@ fn main() -> Result<()> { .with_extension(Keccak256TranspilerExtension), )?; run_with_metric_collection("OUTPUT_PATH", || -> Result<()> { - let data = include_str!("../../programs/regex/regex_email.txt"); + let data = include_str!("../../../guest/regex/regex_email.txt"); let fe_bytes = data.to_owned().into_bytes(); args.bench_from_exe( diff --git a/benchmarks/src/bin/revm_transfer.rs b/benchmarks/prove/src/bin/revm_transfer.rs similarity index 95% rename from benchmarks/src/bin/revm_transfer.rs rename to benchmarks/prove/src/bin/revm_transfer.rs index 6c3395b202..03027aae83 100644 --- a/benchmarks/src/bin/revm_transfer.rs +++ b/benchmarks/prove/src/bin/revm_transfer.rs @@ -1,6 +1,6 @@ use clap::Parser; use eyre::Result; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::instructions::exe::VmExe; use openvm_keccak256_circuit::Keccak256Rv32Config; use openvm_keccak256_transpiler::Keccak256TranspilerExtension; diff --git a/benchmarks/src/bin/rkyv.rs b/benchmarks/prove/src/bin/rkyv.rs similarity index 89% rename from benchmarks/src/bin/rkyv.rs rename to benchmarks/prove/src/bin/rkyv.rs index e6a07d33b3..8a43bd5679 100644 --- a/benchmarks/src/bin/rkyv.rs +++ b/benchmarks/prove/src/bin/rkyv.rs @@ -1,6 +1,6 @@ use clap::Parser; use eyre::Result; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::instructions::exe::VmExe; use openvm_rv32im_circuit::Rv32ImConfig; use openvm_rv32im_transpiler::{ @@ -23,7 +23,7 @@ fn main() -> Result<()> { )?; run_with_metric_collection("OUTPUT_PATH", || -> Result<()> { - let file_data = include_bytes!("../../programs/rkyv/minecraft_savedata.bin"); + let file_data = include_bytes!("../../../guest/rkyv/minecraft_savedata.bin"); let stdin = StdIn::from_bytes(file_data); args.bench_from_exe("rkyv", Rv32ImConfig::default(), exe, stdin) }) diff --git a/benchmarks/src/bin/verify_fibair.rs b/benchmarks/prove/src/bin/verify_fibair.rs similarity index 98% rename from benchmarks/src/bin/verify_fibair.rs rename to benchmarks/prove/src/bin/verify_fibair.rs index aac1f4ea79..3867f86f44 100644 --- a/benchmarks/src/bin/verify_fibair.rs +++ b/benchmarks/prove/src/bin/verify_fibair.rs @@ -1,6 +1,6 @@ use clap::Parser; use eyre::Result; -use openvm_benchmarks::utils::BenchmarkCli; +use openvm_benchmarks_prove::util::BenchmarkCli; use openvm_circuit::arch::instructions::program::DEFAULT_MAX_NUM_PUBLIC_VALUES; use openvm_native_circuit::NativeConfig; use openvm_native_compiler::conversion::CompilerOptions; diff --git a/benchmarks/prove/src/lib.rs b/benchmarks/prove/src/lib.rs new file mode 100644 index 0000000000..812d1edf2f --- /dev/null +++ b/benchmarks/prove/src/lib.rs @@ -0,0 +1 @@ +pub mod util; diff --git a/benchmarks/src/utils.rs b/benchmarks/prove/src/util.rs similarity index 87% rename from benchmarks/src/utils.rs rename to benchmarks/prove/src/util.rs index 198bf8b763..82241202b4 100644 --- a/benchmarks/src/utils.rs +++ b/benchmarks/prove/src/util.rs @@ -1,8 +1,8 @@ -use std::{fs::read, path::PathBuf, sync::Arc}; +use std::{path::PathBuf, sync::Arc}; use clap::{command, Parser}; use eyre::Result; -use openvm_build::{build_guest_package, get_package, guest_methods, GuestOptions}; +use openvm_benchmarks_utils::{build_elf, get_programs_dir}; use openvm_circuit::arch::{instructions::exe::VmExe, DefaultSegmentationStrategy, VmConfig}; use openvm_native_circuit::NativeConfig; use openvm_native_compiler::conversion::CompilerOptions; @@ -28,8 +28,7 @@ use openvm_stark_sdk::{ openvm_stark_backend::Chip, p3_baby_bear::BabyBear, }; -use openvm_transpiler::{elf::Elf, openvm_platform::memory::MEM_SIZE}; -use tempfile::tempdir; +use openvm_transpiler::elf::Elf; use tracing::info_span; type F = BabyBear; @@ -142,7 +141,7 @@ impl BenchmarkCli { } .to_string(); let manifest_dir = get_programs_dir().join(program_name); - build_bench(manifest_dir, profile) + build_elf(&manifest_dir, profile) } pub fn bench_from_exe( @@ -171,30 +170,6 @@ impl BenchmarkCli { } } -pub fn get_programs_dir() -> PathBuf { - let mut dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf(); - dir.push("programs"); - dir -} - -pub fn build_bench(manifest_dir: PathBuf, profile: impl ToString) -> Result { - let pkg = get_package(manifest_dir); - let target_dir = tempdir()?; - // Build guest with default features - let guest_opts = GuestOptions::default() - .with_target_dir(target_dir.path()) - .with_profile(profile.to_string()); - if let Err(Some(code)) = build_guest_package(&pkg, &guest_opts, None, &None) { - std::process::exit(code); - } - // Assumes the package has a single target binary - let elf_path = guest_methods(&pkg, &target_dir, &guest_opts.features, &guest_opts.profile) - .pop() - .unwrap(); - let data = read(elf_path)?; - Elf::decode(&data, MEM_SIZE as u32) -} - /// 1. Generate proving key from config. /// 2. Commit to the exe by generating cached trace for program. /// 3. Executes runtime diff --git a/benchmarks/src/lib.rs b/benchmarks/src/lib.rs deleted file mode 100644 index b5614dd823..0000000000 --- a/benchmarks/src/lib.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod utils; diff --git a/benchmarks/utils/Cargo.toml b/benchmarks/utils/Cargo.toml new file mode 100644 index 0000000000..1b1d600a82 --- /dev/null +++ b/benchmarks/utils/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "openvm-benchmarks-utils" +version.workspace = true +authors.workspace = true +edition.workspace = true +homepage.workspace = true +repository.workspace = true +license.workspace = true + +[dependencies] +openvm-build.workspace = true +openvm-transpiler.workspace = true + +cargo_metadata.workspace = true +clap = { version = "4.5.9", features = ["derive", "env"] } +eyre.workspace = true +tempfile.workspace = true +tracing.workspace = true +tracing-subscriber = { version = "0.3.17", features = ["std", "env-filter"] } + +[dev-dependencies] + +[features] +default = [] +build-binaries = [] + +[[bin]] +name = "build-elfs" +path = "src/build-elfs.rs" +required-features = ["build-binaries"] diff --git a/benchmarks/utils/src/build-elfs.rs b/benchmarks/utils/src/build-elfs.rs new file mode 100644 index 0000000000..3bed7cf6fd --- /dev/null +++ b/benchmarks/utils/src/build-elfs.rs @@ -0,0 +1,101 @@ +use std::fs; + +use clap::{arg, Parser}; +use eyre::Result; +use openvm_benchmarks_utils::{build_elf_with_path, get_elf_path_with_pkg, get_programs_dir}; +use openvm_build::get_package; +use tracing_subscriber::{fmt, EnvFilter}; + +#[derive(Parser)] +#[command(author, version, about = "Build OpenVM benchmark programs")] +struct Cli { + /// Force rebuild even if the output ELF already exists + #[arg(short, long)] + force: bool, + + /// Specific program directories to build (builds all if not specified) + #[arg(value_name = "PROGRAM")] + programs: Vec, + + /// Programs to skip + #[arg(long, value_name = "PROGRAM")] + skip: Vec, + + /// Build profile (debug or release) + #[arg(short, long, default_value = "release")] + profile: String, + + /// Enable verbose output + #[arg(short, long)] + verbose: bool, +} + +fn main() -> Result<()> { + let cli = Cli::parse(); + + // Set up logging + let filter = if cli.verbose { + EnvFilter::from_default_env() + } else { + EnvFilter::new("info") + }; + fmt::fmt().with_env_filter(filter).init(); + + let programs_dir = get_programs_dir(); + tracing::info!("Building programs from {}", programs_dir.display()); + + // Collect all available program directories + let available_programs = fs::read_dir(&programs_dir)? + .filter_map(|entry| { + let entry = entry.ok()?; + let path = entry.path(); + + if path.is_dir() { + let dir_name = path.file_name()?.to_str()?.to_string(); + Some((dir_name, path)) + } else { + None + } + }) + .collect::>(); + + // Filter programs if specific ones were requested + let programs_to_build = if cli.programs.is_empty() { + available_programs + } else { + available_programs + .into_iter() + .filter(|(name, _)| cli.programs.contains(name)) + .collect() + }; + + // Filter out skipped programs + let programs_to_build = programs_to_build + .into_iter() + .filter(|(name, _)| !cli.skip.contains(name)) + .collect::>(); + + if programs_to_build.is_empty() { + tracing::warn!("No matching programs found to build"); + return Ok(()); + } + + // Build each selected program + for (dir_name, path) in programs_to_build { + let pkg = get_package(&path); + let elf_path = get_elf_path_with_pkg(&path, &pkg); + + if cli.force || !elf_path.exists() { + tracing::info!("Building: {}", dir_name); + build_elf_with_path(&pkg, &cli.profile, Some(&elf_path))?; + } else { + tracing::info!( + "Skipping existing build: {} (use --force to rebuild)", + dir_name + ); + } + } + + tracing::info!("Build complete"); + Ok(()) +} diff --git a/benchmarks/utils/src/lib.rs b/benchmarks/utils/src/lib.rs new file mode 100644 index 0000000000..99e5ce917b --- /dev/null +++ b/benchmarks/utils/src/lib.rs @@ -0,0 +1,73 @@ +use std::{ + fs::read, + path::{Path, PathBuf}, +}; + +use cargo_metadata::Package; +use eyre::Result; +use openvm_build::{build_guest_package, get_package, guest_methods, GuestOptions}; +use openvm_transpiler::{elf::Elf, openvm_platform::memory::MEM_SIZE}; +use tempfile::tempdir; + +pub fn get_programs_dir() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("../guest") +} + +pub fn build_elf(manifest_dir: &PathBuf, profile: impl ToString) -> Result { + let pkg = get_package(manifest_dir); + build_elf_with_path(&pkg, profile, None) +} + +pub fn build_elf_with_path( + pkg: &Package, + profile: impl ToString, + elf_path: Option<&PathBuf>, +) -> Result { + // Use a temporary directory for the build + let temp_dir = tempdir()?; + let target_dir = temp_dir.path(); + + // Build guest with default features + let guest_opts = GuestOptions::default() + .with_target_dir(target_dir) + .with_profile(profile.to_string()); + + if let Err(Some(code)) = build_guest_package(pkg, &guest_opts, None, &None) { + std::process::exit(code); + } + + // Assumes the package has a single target binary + let temp_elf_path = guest_methods(pkg, target_dir, &guest_opts.features, &guest_opts.profile) + .pop() + .unwrap(); + + // If an elf_path is provided, copy the built ELF to that location + if let Some(dest_path) = elf_path { + // Create parent directories if they don't exist + if let Some(parent) = dest_path.parent() { + if !parent.exists() { + std::fs::create_dir_all(parent)?; + } + } + + // Copy the built ELF to the destination + std::fs::copy(&temp_elf_path, dest_path)?; + } + + read_elf_file(&temp_elf_path) +} + +pub fn get_elf_path(manifest_dir: &PathBuf) -> PathBuf { + let pkg = get_package(manifest_dir); + get_elf_path_with_pkg(manifest_dir, &pkg) +} + +pub fn get_elf_path_with_pkg(manifest_dir: &Path, pkg: &Package) -> PathBuf { + let elf_file_name = format!("{}.elf", &pkg.name); + manifest_dir.join("elf").join(elf_file_name) +} + +pub fn read_elf_file(elf_path: &PathBuf) -> Result { + let data = read(elf_path)?; + Elf::decode(&data, MEM_SIZE as u32) +} diff --git a/book/src/writing-apps/write-program.md b/book/src/writing-apps/write-program.md index 9066a142d5..8f2fb7d9d9 100644 --- a/book/src/writing-apps/write-program.md +++ b/book/src/writing-apps/write-program.md @@ -7,7 +7,7 @@ See the example [fibonacci program](https://github.com/openvm-org/openvm-example The guest program should be a `no_std` Rust crate. As long as it is `no_std`, you can import any other `no_std` crates and write Rust as you normally would. Import the `openvm` library crate to use `openvm` intrinsic functions (for example `openvm::io::*`). -More examples of guest programs can be found in the [benchmarks/programs](https://github.com/openvm-org/openvm/tree/main/benchmarks/programs) directory. +More examples of guest programs can be found in the [benchmarks/guest](https://github.com/openvm-org/openvm/tree/main/benchmarks/guest) directory. ## Handling I/O diff --git a/ci/README.md b/ci/README.md index 0266cb6b78..d1ee972a18 100644 --- a/ci/README.md +++ b/ci/README.md @@ -1,5 +1,5 @@ ### Notes on benchmark config -- `name` must match the binary name in `benchmarks/`. It will be used to find the working directory. -- `id` must be unique within the config file. It will be used as (part of) the file name when uploading to S3: `${id}-${current_sha}.[md/json]` \ No newline at end of file +- `name` must match the binary name in `benchmarks/prove/`. It will be used to find the working directory. +- `id` must be unique within the config file. It will be used as (part of) the file name when uploading to S3: `${id}-${current_sha}.[md/json]` diff --git a/ci/benchmark-config.json b/ci/benchmark-config.json index fb2d67d1fa..f3bf55ddb7 100644 --- a/ci/benchmark-config.json +++ b/ci/benchmark-config.json @@ -3,7 +3,7 @@ { "name": "verify_fibair", "id": "verify_fibair", - "working_directory": "benchmarks", + "working_directory": "benchmarks/prove", "e2e_bench": false, "run_params": [ { @@ -17,7 +17,7 @@ { "name": "fibonacci", "id": "fibonacci", - "working_directory": "benchmarks", + "working_directory": "benchmarks/prove", "e2e_bench": false, "run_params": [ { @@ -31,7 +31,7 @@ { "name": "regex", "id": "regex", - "working_directory": "benchmarks", + "working_directory": "benchmarks/prove", "e2e_bench": false, "run_params": [ { @@ -45,7 +45,7 @@ { "name": "ecrecover", "id": "ecrecover", - "working_directory": "benchmarks", + "working_directory": "benchmarks/prove", "e2e_bench": false, "run_params": [ { @@ -59,7 +59,7 @@ { "name": "pairing", "id": "pairing", - "working_directory": "benchmarks", + "working_directory": "benchmarks/prove", "e2e_bench": false, "run_params": [ { @@ -73,7 +73,7 @@ { "name": "fib_e2e", "id": "fib_e2e", - "working_directory": "benchmarks", + "working_directory": "benchmarks/prove", "e2e_bench": true, "run_params": [ { @@ -90,7 +90,7 @@ { "name": "kitchen_sink", "id": "kitchen_sink", - "working_directory": "benchmarks", + "working_directory": "benchmarks/prove", "e2e_bench": true, "run_params": [ { diff --git a/crates/cli/src/lib.rs b/crates/cli/src/lib.rs index 008db4b54a..edbbb4bc9d 100644 --- a/crates/cli/src/lib.rs +++ b/crates/cli/src/lib.rs @@ -1,7 +1,7 @@ pub mod commands; pub mod default; pub mod input; -mod util; +pub mod util; use std::process::{Command, Stdio}; diff --git a/crates/cli/src/util.rs b/crates/cli/src/util.rs index 7dc76a20d7..19938c64bb 100644 --- a/crates/cli/src/util.rs +++ b/crates/cli/src/util.rs @@ -15,7 +15,7 @@ pub(crate) fn read_to_struct_toml(path: &PathBuf) -> Result Ok(ret) } -pub(crate) fn read_config_toml_or_default(config: &PathBuf) -> Result> { +pub fn read_config_toml_or_default(config: &PathBuf) -> Result> { if config.exists() { read_to_struct_toml(config) } else { diff --git a/crates/toolchain/build/Cargo.toml b/crates/toolchain/build/Cargo.toml index 1f2b7eb91e..8f99b0f180 100644 --- a/crates/toolchain/build/Cargo.toml +++ b/crates/toolchain/build/Cargo.toml @@ -13,7 +13,7 @@ openvm-platform = { workspace = true } serde.workspace = true serde_json.workspace = true eyre.workspace = true -cargo_metadata = "0.18" +cargo_metadata.workspace = true [dev-dependencies] diff --git a/docs/crates/benchmarks.md b/docs/crates/benchmarks.md index 545565698f..1f51a16681 100644 --- a/docs/crates/benchmarks.md +++ b/docs/crates/benchmarks.md @@ -1,6 +1,6 @@ # Benchmarks -Documentation for the `openvm-benchmarks` crate. By default, paths will be referenced from the [`benchmarks`](../../benchmarks) directory. +Documentation for the `openvm-benchmarks-*` crates. By default, paths will be referenced from the [`benchmarks`](../../benchmarks) directory. - Table of Contents - [Latest Benchmark Results](#latest-benchmark-results) @@ -16,7 +16,7 @@ These are run via [github workflows](../../.github/workflows/benchmarks.yml) and ## How to Add a Benchmark -1. Add a new crate to the [programs](../../benchmarks/programs/) directory. +1. Add a new crate to the [guest](../../benchmarks/guest/) directory. 2. Add the [benchmark to CI](#adding-a-benchmark-to-ci). This is called a "guest program" because it is intended to be run on the OpenVM architecture and @@ -36,21 +36,21 @@ To support host machine execution, the top of your guest program should have: #![cfg_attr(not(feature = "std"), no_std)] ``` -You can copy from [fibonacci](../../benchmarks/programs/fibonacci) to get started. +You can copy from [fibonacci](../../benchmarks/guest/fibonacci) to get started. The guest program crate should **not** be included in the main repository workspace. Instead the guest `Cargo.toml` should have `[workspace]` at the top to keep it standalone. Your IDE will likely not lint or use rust-analyzer on the crate while in the workspace, so the recommended setup is to open a separate IDE workspace from the directory of the guest program. ### Adding the Benchmark -Our proving benchmarks are written as standalone rust binaries. Add one by making a new file in [bin](../../benchmarks/src/bin) by following the [fibonacci example](../../benchmarks/src/bin/fibonacci.rs). We currently only run aggregation proofs when feature "aggregation" is on (off by default). Any general benchmarking utility functions can be added to the library in [`src`](../../benchmarks/src). There are utility functions `build_bench_program` which compiles the guest program crate with target set to `openvm` and reads the output RISC-V ELF file. +Our proving benchmarks are written as standalone rust binaries. Add one by making a new file in [bin](../../benchmarks/prove/src/bin) by following the [fibonacci example](../../benchmarks/prove/src/bin/fibonacci.rs). We currently only run aggregation proofs when feature "aggregation" is on (off by default). Any general benchmarking utility functions can be added to the library in [`src`](../../benchmarks/utils/src). There are utility functions `build_bench_program` which compiles the guest program crate with target set to `openvm` and reads the output RISC-V ELF file. This can then be fed into `bench_from_exe` which will generate a proof of the execution of the ELF (any other `VmExe`) from a given `VmConfig`. #### Providing Inputs Inputs must be directly provided to the `bench_from_exe` function: the `input_stream: Vec>` is a vector of vectors, where `input_stream[i]` will be what is provided to the guest program on the `i`-th call of `openvm::io::read_vec()`. Currently you must manually convert from `u8` to `F` using `FieldAlgebra::from_canonical_u8`. -You can find an example of passing in a single `Vec` input in [base64_json](../../benchmarks/src/bin/base64_json.rs). +You can find an example of passing in a single `Vec` input in [base64_json](../../benchmarks/prove/src/bin/base64_json.rs). #### Testing the Guest Program @@ -89,7 +89,7 @@ Running a benchmark locally is simple. Just run the following command: OUTPUT_PATH="metrics.json" cargo run --release --bin ``` -where `.rs` is one of the files in [`src/bin`](../../benchmarks/src/bin). +where `.rs` is one of the files in [`src/bin`](../../benchmarks/prove/src/bin). The `OUTPUT_PATH` environmental variable should be set to the file path where you want the collected metrics to be written to. If unset, then metrics are not printed to file. To run a benchmark with the leaf aggregation, add `--features aggregation` to the above command. @@ -151,13 +151,58 @@ To add the benchmark to CI, update the [ci/benchmark-config.json](../../ci/bench The `benchmarks.yml` file reads this JSON and generates a matrix of inputs for the [.github/workflows/benchmark-call.yml](../../.github/workflows/benchmark-call.yml) file, a reusable workflow for running the benchmark, collecting metrics, and storing and displaying results. +## Execution Benchmarks + +The crate [`openvm-benchmarks-execute`](../../benchmarks/execute) contains benchmarks for measuring the raw VM execution performance without proving. It includes a CLI tool that allows running various pre-defined benchmark programs to evaluate execution time. Note that this tool doesn't compile the guest ELF files and requires them to be precompiled before running the benchmarks. + +### Using the CLI + +The CLI provides several options for running execution benchmarks: + +```bash +# Run all benchmark programs +cargo run --package openvm-benchmarks-execute + +# List all available benchmark programs +cargo run --package openvm-benchmarks-execute -- --list + +# Run specific benchmark programs +cargo run --package openvm-benchmarks-execute -- --programs fibonacci_recursive fibonacci_iterative + +# Run all benchmark programs except specified ones +cargo run --package openvm-benchmarks-execute -- --skip keccak256 sha256 +``` + +These benchmarks measure pure execution time without proving, making them useful for isolating performance bottlenecks in the VM runtime itself. + +### Updating the ELFs + +For execution benchmarks, the ELF files need to be compiled before running the benchmarks. The [`openvm-benchmarks-utils`](../../benchmarks/utils) crate provides a CLI tool to build all the benchmark ELFs: + +```bash +# Build all benchmark ELFs +cargo run --package openvm-benchmarks-utils --bin build-elfs --features build-binaries + +# Build specific benchmark ELFs +cargo run --package openvm-benchmarks-utils --bin build-elfs --features build-binaries -- fibonacci_recursive fibonacci_iterative + +# Skip specific programs +cargo run --package openvm-benchmarks-utils --bin build-elfs --features build-binaries -- --skip keccak256 sha256 + +# Force rebuild even if ELFs already exist (overwrite) +cargo run --package openvm-benchmarks-utils --bin build-elfs --features build-binaries -- --force + +# Set build profile (debug or release) +cargo run --package openvm-benchmarks-utils --bin build-elfs --features build-binaries -- --profile debug +``` + ## Profiling Execution The following section discusses traditional profiling of the VM runtime execution, without ZK proving. ### Criterion Benchmarks -Most benchmarks are binaries that run once since proving benchmarks take longer. For smaller benchmarks, such as to benchmark VM runtime, we use Criterion. These are in the [`benches`](../../benchmarks/benches) directory. +Most benchmarks are binaries that run once since proving benchmarks take longer. For smaller benchmarks, such as to benchmark VM runtime, we use Criterion. These are in the [`benches`](../../benchmarks/execute/benches) directory. ```bash cargo bench --bench fibonacci_execute @@ -166,7 +211,7 @@ cargo bench --bench regex_execute will run the normal criterion benchmark. -We profile using executables without criterion in [`examples`](../../benchmarks/examples). To prevent the ELF build time from being included in the benchmark, we pre-build the ELF using the CLI. Check that the included ELF file in `examples` is up to date before proceeding. +We profile using executables without criterion in [`examples`](../../benchmarks/execute/examples). To prevent the ELF build time from being included in the benchmark, we pre-build the ELF using the CLI. Check that the included ELF file in `examples` is up to date before proceeding. ### Flamegraph From a5550a986bb92c27ed7961a3d625800fc2a94a96 Mon Sep 17 00:00:00 2001 From: HrikB <23041116+HrikB@users.noreply.github.com> Date: Sat, 5 Apr 2025 12:13:34 -0400 Subject: [PATCH 13/25] feat: `OpenVmHalo2Verifier` (#1549) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds a new verifier contract generation that wraps the original `snark-verifier` output (via inheritance). The goal of this wrapper `OpenVmHalo2Verifier` is to expose a more friendly interface to users that cleanly separates out the guest program public values. `OpenVmHalo2Verifier` exposes the following interface: ```solidity interface IOpenVmHalo2Verifier { function verify(bytes calldata publicValues, bytes calldata proofData, bytes32 appExeCommit, bytes32 appVmCommit) external view; } ``` - `publicValues`: The bytes revealed in the OpenVM guest program packed together. - `proofData`: Defined as `abi.encodePacked(KZG accumulators, publicValuesSuffix)` - `appExeCommit`: The commitment to the OpenVM application executable whose execution is being verified. - `appVmCommit`: The commitment to the VM configuration (aka `leaf_exe_commit`) Once received, the proof is constructed into the format expected by `snark-verifier`. The expected format is `abi.encodePacked(proofData[0:0x180], appExeCommit, appVmExeCommit, publicValuesPayload, proofData[0x180:])` where `publicValuesPayload` is a memory payload with each byte in `publicValues` separated into its own `bytes32` word. Since `OpenVmHalo2Verifier` inherits the `snark-verifier` output, the proof is forwarded via self-call. ## Verifier Generation The smart contract is written as a template that does not compile in isolation. During generation, the OpenVM SDK will fill out the maximum amount of public values and the OpenVM version with which the generation happened. Given an output folder, the relevant contracts are written into the following folder structure: ``` halo2/ ├── interfaces/ │ └── IOpenVmHalo2Verifier.sol ├── OpenVmHalo2Verifier.sol ├── Halo2Verifier.sol ``` `cargo openvm setup` will now generate this output directly into the `~/.openvm/` dir. Closes INT-3710 --- .github/workflows/sdk.yml | 19 + .gitmodules | 3 + Cargo.lock | 155 +- Cargo.toml | 3 + crates/cli/src/commands/build.rs | 5 +- crates/cli/src/commands/setup.rs | 22 +- crates/cli/src/commands/verify.rs | 11 +- crates/cli/src/default.rs | 3 +- crates/sdk/Cargo.toml | 7 + crates/sdk/contracts/.gitignore | 14 + .../contracts/abi/IOpenVmHalo2Verifier.json | 30 + crates/sdk/contracts/foundry.toml | 31 + crates/sdk/contracts/lib/forge-std | 1 + .../contracts/src/IOpenVmHalo2Verifier.sol | 8 + .../template/OpenVmHalo2Verifier.sol | 135 ++ .../contracts/test/OpenVmHalo2Verifier.t.sol | 161 ++ .../sdk/contracts/test/helpers/LibString.sol | 1628 +++++++++++++++++ .../sdk/contracts/test/helpers/MockDeps.sol | 12 + crates/sdk/examples/sdk_evm.rs | 4 +- crates/sdk/guest/src/main.rs | 5 +- crates/sdk/src/fs.rs | 78 +- crates/sdk/src/lib.rs | 241 ++- crates/sdk/src/types.rs | 14 +- crates/sdk/tests/integration_test.rs | 110 +- .../native/recursion/src/halo2/wrapper.rs | 15 +- 25 files changed, 2637 insertions(+), 78 deletions(-) create mode 100644 crates/sdk/contracts/.gitignore create mode 100644 crates/sdk/contracts/abi/IOpenVmHalo2Verifier.json create mode 100644 crates/sdk/contracts/foundry.toml create mode 160000 crates/sdk/contracts/lib/forge-std create mode 100644 crates/sdk/contracts/src/IOpenVmHalo2Verifier.sol create mode 100644 crates/sdk/contracts/template/OpenVmHalo2Verifier.sol create mode 100644 crates/sdk/contracts/test/OpenVmHalo2Verifier.t.sol create mode 100644 crates/sdk/contracts/test/helpers/LibString.sol create mode 100644 crates/sdk/contracts/test/helpers/MockDeps.sol diff --git a/.github/workflows/sdk.yml b/.github/workflows/sdk.yml index 1076d724e3..873a0c7e2b 100644 --- a/.github/workflows/sdk.yml +++ b/.github/workflows/sdk.yml @@ -39,6 +39,9 @@ jobs: - name: Install solc # svm should support arm64 linux run: (hash svm 2>/dev/null || cargo install --version 0.2.23 svm-rs) && svm install 0.8.19 && solc --version + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + - name: Install architecture specific tools run: | arch=$(uname -m) @@ -74,8 +77,24 @@ jobs: run: | bash ../../extensions/native/recursion/trusted_setup_s3.sh + - name: Run openvm-sdk contracts/ tests + working-directory: crates/sdk/contracts + run: | + forge fmt --check + forge build --sizes + forge test + + - name: Check IOpenVmHalo2Verifier.sol abi correctness + working-directory: crates/sdk/contracts + run: | + forge build + jq -S '.abi' ./out/IOpenVmHalo2Verifier.sol/IOpenVmHalo2Verifier.json > compiled_abi.json + jq -S . ./abi/IOpenVmHalo2Verifier.json > expected_abi_sorted.json + diff -u expected_abi_sorted.json compiled_abi.json + - name: Run openvm-sdk crate tests working-directory: crates/sdk run: | export RUST_BACKTRACE=1 cargo nextest run --cargo-profile=fast --test-threads=2 --features parallel + diff --git a/.gitmodules b/.gitmodules index ab8a22bb42..20dc59a148 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "toolchain/tests/rv32im-test-vectors/riscv-tests"] path = crates/toolchain/tests/rv32im-test-vectors/riscv-tests url = https://github.com/riscv-software-src/riscv-tests.git +[submodule "crates/sdk/contracts/lib/forge-std"] + path = crates/sdk/contracts/lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/Cargo.lock b/Cargo.lock index a11d72a5fa..150eb75304 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -79,17 +79,29 @@ dependencies = [ "serde", ] +[[package]] +name = "alloy-json-abi" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6beff64ad0aa6ad1019a3db26fef565aefeb011736150ab73ed3366c3cfd1b" +dependencies = [ + "alloy-primitives", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + [[package]] name = "alloy-primitives" -version = "0.8.21" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478bedf4d24e71ea48428d1bc278553bd7c6ae07c30ca063beb0b09fe58a9e74" +checksum = "8c77490fe91a0ce933a1f219029521f20fc28c2c0ca95d53fa4da9c00b8d9d4e" dependencies = [ "alloy-rlp", "bytes", "cfg-if", "const-hex", - "derive_more 1.0.0", + "derive_more 2.0.1", "foldhash", "hashbrown 0.15.2", "indexmap 2.7.1", @@ -128,6 +140,80 @@ dependencies = [ "syn 2.0.98", ] +[[package]] +name = "alloy-sol-macro" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e10ae8e9a91d328ae954c22542415303919aabe976fe7a92eb06db1b68fd59f2" +dependencies = [ + "alloy-sol-macro-expander", + "alloy-sol-macro-input", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", +] + +[[package]] +name = "alloy-sol-macro-expander" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83ad5da86c127751bc607c174d6c9fe9b85ef0889a9ca0c641735d77d4f98f26" +dependencies = [ + "alloy-json-abi", + "alloy-sol-macro-input", + "const-hex", + "heck", + "indexmap 2.7.1", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn 2.0.98", + "syn-solidity", + "tiny-keccak", +] + +[[package]] +name = "alloy-sol-macro-input" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3d30f0d3f9ba3b7686f3ff1de9ee312647aac705604417a2f40c604f409a9e" +dependencies = [ + "alloy-json-abi", + "const-hex", + "dunce", + "heck", + "macro-string", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.98", + "syn-solidity", +] + +[[package]] +name = "alloy-sol-type-parser" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d162f8524adfdfb0e4bd0505c734c985f3e2474eb022af32eef0d52a4f3935c" +dependencies = [ + "serde", + "winnow", +] + +[[package]] +name = "alloy-sol-types" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d43d5e60466a440230c07761aa67671d4719d46f43be8ea6e7ed334d8db4a9ab" +dependencies = [ + "alloy-json-abi", + "alloy-primitives", + "alloy-sol-macro", + "const-hex", + "serde", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -1033,6 +1119,9 @@ name = "bytes" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f61dac84819c6588b558454b194026eb1f09c293b9036ae9b159e74e73ab6cf9" +dependencies = [ + "serde", +] [[package]] name = "bytes-utils" @@ -1604,7 +1693,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" dependencies = [ - "derive_more-impl", + "derive_more-impl 1.0.0", +] + +[[package]] +name = "derive_more" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl 2.0.1", ] [[package]] @@ -1619,6 +1717,18 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", + "unicode-xid", +] + [[package]] name = "digest" version = "0.9.0" @@ -1657,6 +1767,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "dyn-clone" version = "1.0.18" @@ -2313,6 +2429,7 @@ dependencies = [ "allocator-api2", "equivalent", "foldhash", + "serde", ] [[package]] @@ -2890,6 +3007,17 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "macro-string" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "matchers" version = "0.1.0" @@ -4071,6 +4199,8 @@ dependencies = [ name = "openvm-sdk" version = "1.0.0" dependencies = [ + "alloy-primitives", + "alloy-sol-types", "async-trait", "bitcode", "bon", @@ -4079,6 +4209,7 @@ dependencies = [ "derive_more 1.0.0", "eyre", "getset", + "hex", "itertools 0.14.0", "metrics", "openvm", @@ -4109,6 +4240,9 @@ dependencies = [ "serde", "serde_json", "serde_with", + "snark-verifier", + "snark-verifier-sdk", + "tempfile", "thiserror 1.0.69", "tracing", ] @@ -4989,6 +5123,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -5895,6 +6030,18 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn-solidity" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4560533fbd6914b94a8fb5cc803ed6801c3455668db3b810702c57612bac9412" +dependencies = [ + "paste", + "proc-macro2", + "quote", + "syn 2.0.98", +] + [[package]] name = "synstructure" version = "0.13.1" diff --git a/Cargo.toml b/Cargo.toml index 322d769671..46af9b21c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -184,9 +184,12 @@ snark-verifier-sdk = { version = "0.2.0", default-features = false, features = [ "loader_halo2", "halo2-axiom", ] } +snark-verifier = { version = "0.2.0", default-features = false } halo2curves-axiom = "0.7.0" cargo_metadata = "0.18" +alloy-primitives = "0.8.25" +alloy-sol-types = "0.8.25" tracing = "0.1.40" bon = "3.2.0" serde_json = "1.0.117" diff --git a/crates/cli/src/commands/build.rs b/crates/cli/src/commands/build.rs index 75cd933401..e55b200384 100644 --- a/crates/cli/src/commands/build.rs +++ b/crates/cli/src/commands/build.rs @@ -1,5 +1,5 @@ use std::{ - fs::{read, write}, + fs::{create_dir_all, read, write}, path::PathBuf, }; @@ -146,6 +146,9 @@ pub(crate) fn build(build_args: &BuildArgs) -> Result> { let exe = Sdk::new().transpile(elf, transpiler)?; let committed_exe = commit_app_exe(app_config.app_fri_params.fri_params, exe.clone()); write_exe_to_file(exe, output_path)?; + if let Some(parent) = build_args.committed_exe_output.parent() { + create_dir_all(parent)?; + } write( &build_args.committed_exe_output, committed_exe_as_bn254(&committed_exe).value.to_bytes(), diff --git a/crates/cli/src/commands/setup.rs b/crates/cli/src/commands/setup.rs index ec0b58cb65..a62faaa0df 100644 --- a/crates/cli/src/commands/setup.rs +++ b/crates/cli/src/commands/setup.rs @@ -11,13 +11,13 @@ use openvm_native_recursion::halo2::utils::CacheHalo2ParamsReader; use openvm_sdk::{ config::AggConfig, fs::{ - write_agg_pk_to_file, write_evm_verifier_to_folder, EVM_VERIFIER_ARTIFACT_FILENAME, - EVM_VERIFIER_SOL_FILENAME, + write_agg_pk_to_file, write_evm_halo2_verifier_to_folder, EVM_HALO2_VERIFIER_BASE_NAME, + EVM_HALO2_VERIFIER_INTERFACE_NAME, EVM_HALO2_VERIFIER_PARENT_NAME, }, DefaultStaticVerifierPvHandler, Sdk, }; -use crate::default::{DEFAULT_AGG_PK_PATH, DEFAULT_PARAMS_DIR, DEFAULT_VERIFIER_FOLDER}; +use crate::default::{DEFAULT_AGG_PK_PATH, DEFAULT_EVM_HALO2_VERIFIER_PATH, DEFAULT_PARAMS_DIR}; #[derive(Parser)] #[command( @@ -29,11 +29,15 @@ pub struct EvmProvingSetupCmd {} impl EvmProvingSetupCmd { pub async fn run(&self) -> Result<()> { if PathBuf::from(DEFAULT_AGG_PK_PATH).exists() - && PathBuf::from(DEFAULT_VERIFIER_FOLDER) - .join(EVM_VERIFIER_ARTIFACT_FILENAME) + && PathBuf::from(DEFAULT_EVM_HALO2_VERIFIER_PATH) + .join(EVM_HALO2_VERIFIER_PARENT_NAME) .exists() - && PathBuf::from(DEFAULT_VERIFIER_FOLDER) - .join(EVM_VERIFIER_SOL_FILENAME) + && PathBuf::from(DEFAULT_EVM_HALO2_VERIFIER_PATH) + .join(EVM_HALO2_VERIFIER_BASE_NAME) + .exists() + && PathBuf::from(DEFAULT_EVM_HALO2_VERIFIER_PATH) + .join("interfaces") + .join(EVM_HALO2_VERIFIER_INTERFACE_NAME) .exists() { println!("Aggregation proving key and verifier contract already exist"); @@ -53,13 +57,13 @@ impl EvmProvingSetupCmd { let agg_pk = sdk.agg_keygen(agg_config, ¶ms_reader, &DefaultStaticVerifierPvHandler)?; println!("Generating verifier contract..."); - let verifier = sdk.generate_snark_verifier_contract(¶ms_reader, &agg_pk)?; + let verifier = sdk.generate_halo2_verifier_solidity(¶ms_reader, &agg_pk)?; println!("Writing proving key to file..."); write_agg_pk_to_file(agg_pk, DEFAULT_AGG_PK_PATH)?; println!("Writing verifier contract to file..."); - write_evm_verifier_to_folder(verifier, DEFAULT_VERIFIER_FOLDER)?; + write_evm_halo2_verifier_to_folder(verifier, DEFAULT_EVM_HALO2_VERIFIER_PATH)?; Ok(()) } diff --git a/crates/cli/src/commands/verify.rs b/crates/cli/src/commands/verify.rs index ca7e203a20..4185880b16 100644 --- a/crates/cli/src/commands/verify.rs +++ b/crates/cli/src/commands/verify.rs @@ -4,14 +4,15 @@ use clap::Parser; use eyre::Result; use openvm_sdk::{ fs::{ - read_app_proof_from_file, read_app_vk_from_file, read_evm_proof_from_file, - read_evm_verifier_from_folder, + read_app_proof_from_file, read_app_vk_from_file, read_evm_halo2_verifier_from_folder, + read_evm_proof_from_file, }, Sdk, }; use crate::default::{ - DEFAULT_APP_PROOF_PATH, DEFAULT_APP_VK_PATH, DEFAULT_EVM_PROOF_PATH, DEFAULT_VERIFIER_FOLDER, + DEFAULT_APP_PROOF_PATH, DEFAULT_APP_VK_PATH, DEFAULT_EVM_HALO2_VERIFIER_PATH, + DEFAULT_EVM_PROOF_PATH, }; #[derive(Parser)] @@ -46,11 +47,11 @@ impl VerifyCmd { sdk.verify_app_proof(&app_vk, &app_proof)?; } VerifySubCommand::Evm { proof } => { - let evm_verifier = read_evm_verifier_from_folder(DEFAULT_VERIFIER_FOLDER).map_err(|e| { + let evm_verifier = read_evm_halo2_verifier_from_folder(DEFAULT_EVM_HALO2_VERIFIER_PATH).map_err(|e| { eyre::eyre!("Failed to read EVM verifier: {}\nPlease run 'cargo openvm evm-proving-setup' first", e) })?; let evm_proof = read_evm_proof_from_file(proof)?; - sdk.verify_evm_proof(&evm_verifier, &evm_proof)?; + sdk.verify_evm_halo2_proof(&evm_verifier, &evm_proof)?; } } Ok(()) diff --git a/crates/cli/src/default.rs b/crates/cli/src/default.rs index 44233b3c7c..0292a24fb0 100644 --- a/crates/cli/src/default.rs +++ b/crates/cli/src/default.rs @@ -4,9 +4,10 @@ use openvm_stark_sdk::config::FriParameters; pub const DEFAULT_MANIFEST_DIR: &str = "."; pub const DEFAULT_AGG_PK_PATH: &str = concat!(env!("HOME"), "/.openvm/agg.pk"); -pub const DEFAULT_VERIFIER_FOLDER: &str = concat!(env!("HOME"), "/.openvm/"); pub const DEFAULT_PARAMS_DIR: &str = concat!(env!("HOME"), "/.openvm/params/"); +pub const DEFAULT_EVM_HALO2_VERIFIER_PATH: &str = concat!(env!("HOME"), "/.openvm/halo2/"); + pub const DEFAULT_APP_CONFIG_PATH: &str = "./openvm.toml"; pub const DEFAULT_APP_EXE_PATH: &str = "./openvm/app.vmexe"; pub const DEFAULT_COMMITTED_APP_EXE_PATH: &str = "./openvm/committed_app_exe.bytes"; diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml index f3ca81462d..32b74f48d0 100644 --- a/crates/sdk/Cargo.toml +++ b/crates/sdk/Cargo.toml @@ -8,6 +8,7 @@ repository.workspace = true license.workspace = true [dependencies] + p3-fri = { workspace = true } openvm-algebra-circuit = { workspace = true } openvm-algebra-transpiler = { workspace = true } @@ -34,6 +35,8 @@ openvm-circuit = { workspace = true } openvm-continuations = { workspace = true } openvm = { workspace = true } +alloy-primitives = { workspace = true } +alloy-sol-types = { workspace = true, features = ["json"] } bitcode = { workspace = true } bon = { workspace = true } derivative = { workspace = true } @@ -49,6 +52,10 @@ clap = { workspace = true, features = ["derive"] } serde_with = { workspace = true, features = ["hex"] } serde_json.workspace = true thiserror.workspace = true +snark-verifier = { workspace = true } +snark-verifier-sdk.workspace = true +tempfile.workspace = true +hex.workspace = true [features] default = ["parallel"] diff --git a/crates/sdk/contracts/.gitignore b/crates/sdk/contracts/.gitignore new file mode 100644 index 0000000000..85198aaa55 --- /dev/null +++ b/crates/sdk/contracts/.gitignore @@ -0,0 +1,14 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env diff --git a/crates/sdk/contracts/abi/IOpenVmHalo2Verifier.json b/crates/sdk/contracts/abi/IOpenVmHalo2Verifier.json new file mode 100644 index 0000000000..7ee1df768b --- /dev/null +++ b/crates/sdk/contracts/abi/IOpenVmHalo2Verifier.json @@ -0,0 +1,30 @@ +[ + { + "type": "function", + "name": "verify", + "inputs": [ + { + "name": "publicValues", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "proofData", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "appExeCommit", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "appVmCommit", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "view" + } +] \ No newline at end of file diff --git a/crates/sdk/contracts/foundry.toml b/crates/sdk/contracts/foundry.toml new file mode 100644 index 0000000000..1e28834e74 --- /dev/null +++ b/crates/sdk/contracts/foundry.toml @@ -0,0 +1,31 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] +verbosity = 2 +solc = "0.8.19" +optimizer = true +optimizer_runs = 100000 +evm_version = "shanghai" +show_progress = true +fs_permissions = [{ access = "read", path = "./template"}, { access = "read", path = "./test/helpers/MockDeps.sol"}] +ffi = true + +[profile.default.optimizer_details] + constantOptimizer = false + yul = false + +[fuzz] + runs = 256 + +[fmt] + bracket_spacing = true + int_types = "long" + line_length = 120 + multiline_func_header = "attributes_first" + number_underscore = "thousands" + quote_style = "double" + single_line_statement_blocks = "single" + tab_width = 4 + wrap_comments = false + \ No newline at end of file diff --git a/crates/sdk/contracts/lib/forge-std b/crates/sdk/contracts/lib/forge-std new file mode 160000 index 0000000000..3b20d60d14 --- /dev/null +++ b/crates/sdk/contracts/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 3b20d60d14b343ee4f908cb8079495c07f5e8981 diff --git a/crates/sdk/contracts/src/IOpenVmHalo2Verifier.sol b/crates/sdk/contracts/src/IOpenVmHalo2Verifier.sol new file mode 100644 index 0000000000..ac8292cdae --- /dev/null +++ b/crates/sdk/contracts/src/IOpenVmHalo2Verifier.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +interface IOpenVmHalo2Verifier { + function verify(bytes calldata publicValues, bytes calldata proofData, bytes32 appExeCommit, bytes32 appVmCommit) + external + view; +} diff --git a/crates/sdk/contracts/template/OpenVmHalo2Verifier.sol b/crates/sdk/contracts/template/OpenVmHalo2Verifier.sol new file mode 100644 index 0000000000..f82d641fc5 --- /dev/null +++ b/crates/sdk/contracts/template/OpenVmHalo2Verifier.sol @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.19; + +import { Halo2Verifier } from "./Halo2Verifier.sol"; +import { IOpenVmHalo2Verifier } from "./interfaces/IOpenVmHalo2Verifier.sol"; + +type MemoryPointer is uint256; + +/// @notice This contract provides a thin wrapper around the Halo2 verifier +/// outputted by `snark-verifier`, exposing a more user-friendly interface. +contract OpenVmHalo2Verifier is Halo2Verifier, IOpenVmHalo2Verifier { + /// @dev Invalid public values length + error InvalidPublicValuesLength(uint256 expected, uint256 actual); + + /// @dev Invalid proof data length + error InvalidProofDataLength(uint256 expected, uint256 actual); + + /// @dev Proof verification failed + error ProofVerificationFailed(); + + /// @dev The length of the proof data, in bytes. + uint256 private constant PROOF_DATA_LENGTH = (12 + 43) * 32; + + /// @dev The length of the public values, in bytes. This value is set by + /// OpenVM and is guaranteed to be no larger than 8192. + uint256 private constant PUBLIC_VALUES_LENGTH = {PUBLIC_VALUES_LENGTH}; + + /// @dev The length of the full proof, in bytes + uint256 private constant FULL_PROOF_LENGTH = (12 + 2 + PUBLIC_VALUES_LENGTH + 43) * 32; + + /// @dev The version of OpenVM that generated this verifier. + string public constant OPENVM_VERSION = "{OPENVM_VERSION}"; + + /// @notice A wrapper that constructs the proof into the right format for + /// use with the `snark-verifier` verification. + /// + /// @dev The verifier expected proof format is: + /// proof[..12 * 32]: KZG accumulators + /// proof[12 * 32..13 * 32]: app exe commit + /// proof[13 * 32..14 * 32]: app vm commit + /// proof[14 * 32..(14 + PUBLIC_VALUES_LENGTH) * 32]: publicValues[0..PUBLIC_VALUES_LENGTH] + /// proof[(14 + PUBLIC_VALUES_LENGTH) * 32..]: Proof Suffix + /// + /// @param publicValues The PVs revealed by the OpenVM guest program. + /// @param proofData All components of the proof except the public values and + /// app exe and vm commits. The expected format is: + /// `abi.encodePacked(kzgAccumulators, proofSuffix)` + /// @param appExeCommit The commitment to the OpenVM application executable whose execution + /// is being verified. + /// @param appVmCommit The commitment to the VM configuration. + function verify(bytes calldata publicValues, bytes calldata proofData, bytes32 appExeCommit, bytes32 appVmCommit) external view { + if (publicValues.length != PUBLIC_VALUES_LENGTH) revert InvalidPublicValuesLength(PUBLIC_VALUES_LENGTH, publicValues.length); + if (proofData.length != PROOF_DATA_LENGTH) revert InvalidProofDataLength(PROOF_DATA_LENGTH, proofData.length); + + // We will format the public values and construct the full proof payload + // below. + + MemoryPointer proofPtr = _constructProof(publicValues, proofData, appExeCommit, appVmCommit); + + uint256 fullProofLength = FULL_PROOF_LENGTH; + + /// @solidity memory-safe-assembly + assembly { + // Self-call using the proof as calldata + if iszero(staticcall(gas(), address(), proofPtr, fullProofLength, 0, 0)) { + mstore(0x00, 0xd611c318) // ProofVerificationFailed() + revert(0x1c, 0x04) + } + } + } + + /// @dev The assembly code should perform the same function as the following + /// solidity code: + // + /// ```solidity + /// bytes memory proof = + /// abi.encodePacked(proofData[0:0x180], appExeCommit, appVmCommit, publicValuesPayload, proofData[0x180:]); + /// ``` + // + /// where `publicValuesPayload` is a memory payload with each byte in + /// `publicValues` separated into its own `bytes32` word. + /// + /// This function does not clean the memory it allocates. Since it is the + /// only memory write that occurs in the call frame, we know that + /// the memory region cannot have been dirtied. + /// + /// @return proofPtr Memory pointer to the beginning of the constructed + /// proof. This pointer does not follow `bytes memory` semantics. + function _constructProof(bytes calldata publicValues, bytes calldata proofData, bytes32 appExeCommit, bytes32 appVmCommit) + internal + pure + returns (MemoryPointer proofPtr) + { + uint256 fullProofLength = FULL_PROOF_LENGTH; + + // The expected proof format using hex offsets: + // + // proof[..0x180]: KZG accumulators + // proof[0x180..0x1a0]: app exe commit + // proof[0x1a0..0x1c0]: app vm commit + // proof[0x1c0..(0x1c0 + PUBLIC_VALUES_LENGTH * 32)]: publicValues[0..PUBLIC_VALUES_LENGTH] + // proof[(0x1c0 + PUBLIC_VALUES_LENGTH * 32)..]: Proof Suffix + + /// @solidity memory-safe-assembly + assembly { + proofPtr := mload(0x40) + // Allocate the memory as a safety measure. + mstore(0x40, add(proofPtr, fullProofLength)) + + // Copy the KZG accumulators (length 0x180) into the beginning of + // the memory buffer + calldatacopy(proofPtr, proofData.offset, 0x180) + + // Copy the App Exe Commit and App Vm Commit into the memory buffer + mstore(add(proofPtr, 0x180), appExeCommit) + mstore(add(proofPtr, 0x1a0), appVmCommit) + + // Copy the Proof Suffix (length 43 * 32 = 0x560) into the + // end of the memory buffer, leaving PUBLIC_VALUES_LENGTH words in + // between for the publicValuesPayload. + // + // Begin copying from the end of the KZG accumulators in the + // calldata buffer (0x180) + let proofSuffixOffset := add(0x1c0, shl(5, PUBLIC_VALUES_LENGTH)) + calldatacopy(add(proofPtr, proofSuffixOffset), add(proofData.offset, 0x180), 0x560) + + // Copy each byte of the public values into the proof. It copies the + // most significant bytes of public values first. + let publicValuesMemOffset := add(add(proofPtr, 0x1c0), 0x1f) + for { let i := 0 } iszero(eq(i, PUBLIC_VALUES_LENGTH)) { i := add(i, 1) } { + calldatacopy(add(publicValuesMemOffset, shl(5, i)), add(publicValues.offset, i), 0x01) + } + } + } +} diff --git a/crates/sdk/contracts/test/OpenVmHalo2Verifier.t.sol b/crates/sdk/contracts/test/OpenVmHalo2Verifier.t.sol new file mode 100644 index 0000000000..3b57df9829 --- /dev/null +++ b/crates/sdk/contracts/test/OpenVmHalo2Verifier.t.sol @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.19; + +import { LibString } from "./helpers/LibString.sol"; +import { Test, console2, safeconsole as console } from "forge-std/Test.sol"; +import { IOpenVmHalo2Verifier } from "../src/IOpenVmHalo2Verifier.sol"; + +contract TemplateTest is Test { + bytes proofData; + bytes32 appExeCommit = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + bytes32 appVmCommit = 0xEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE; + bytes guestPvs; + + uint256 publicValuesLength; + uint256 fullProofWords; + uint256 fullProofLength; + + string _code = vm.readFile("template/OpenVmHalo2Verifier.sol"); + string deps = vm.readFile("test/helpers/MockDeps.sol"); + + function setUp() public { + proofData = new bytes(55 * 32); + for (uint256 i = 0; i < 55; i++) { + for (uint256 j = 0; j < 32; j++) { + proofData[i * 32 + j] = bytes1(uint8(i)); + } + } + } + + /// forge-config: default.fuzz.runs = 10 + function testFuzz_ProofFormat(uint256 _publicValuesLength) public { + publicValuesLength = bound(_publicValuesLength, 1, 10_000); + publicValuesLength = 8; + fullProofWords = (12 + 2 + publicValuesLength + 43); + fullProofLength = fullProofWords * 32; + + guestPvs = new bytes(publicValuesLength); + for (uint256 i = 0; i < publicValuesLength; i++) { + guestPvs[i] = bytes1(uint8(i)); + } + + IOpenVmHalo2Verifier verifier = _compileAndDeployOpenVmVerifier(publicValuesLength); + + (bool success,) = address(verifier).delegatecall( + abi.encodeCall(IOpenVmHalo2Verifier.verify, (guestPvs, proofData, appExeCommit, appVmCommit)) + ); + require(success, "Verification failed"); + } + + fallback(bytes calldata proof) external returns (bytes memory) { + bytes memory proofDataExpected = proofData; + + uint256 proofSuffixOffset = 0x1c0 + (32 * publicValuesLength); + + bytes memory kzgAccumulators = proof[0:0x180]; + bytes memory proofSuffix = proof[proofSuffixOffset:]; + bytes memory _proofData = abi.encodePacked(kzgAccumulators, proofSuffix); + + require(keccak256(_proofData) == keccak256(proofDataExpected), "Partial proof mismatch"); + + bytes memory _appExeCommit = proof[0x180:0x1a0]; + bytes memory _appVmCommit = proof[0x1a0:0x1c0]; + + require(bytes32(_appExeCommit) == appExeCommit, "App exe commit mismatch"); + require(bytes32(_appVmCommit) == appVmCommit, "App vm commit mismatch"); + + bytes calldata _guestPvs = proof[0x1c0:0x1c0 + 32 * publicValuesLength]; + for (uint256 i = 0; i < publicValuesLength; ++i) { + uint256 expected = uint256(uint8(guestPvs[i])); + uint256 actual = uint256(bytes32(_guestPvs[i * 32:(i + 1) * 32])); + require(expected == actual, "Guest PVs hash mismatch"); + } + + // Suppress return value warning + assembly { + return(0x00, 0x00) + } + } + + function test_RevertWhen_InvalidPublicValuesLength() public { + publicValuesLength = 32; + IOpenVmHalo2Verifier verifier = _compileAndDeployOpenVmVerifier(publicValuesLength); + + bytes memory invalidPvs = new bytes(0); + bytes4 sig = bytes4(keccak256("InvalidPublicValuesLength(uint256,uint256)")); + + vm.expectRevert(abi.encodeWithSelector(sig, 32, invalidPvs.length)); + verifier.verify(invalidPvs, hex"", bytes32(0), bytes32(0)); + } + + function test_RevertWhen_InvalidProofDataLength() public { + publicValuesLength = 32; + IOpenVmHalo2Verifier verifier = _compileAndDeployOpenVmVerifier(publicValuesLength); + + bytes memory invalidProofData = new bytes(0); + bytes4 sig = bytes4(keccak256("InvalidProofDataLength(uint256,uint256)")); + + bytes memory pvs = new bytes(publicValuesLength); + + vm.expectRevert(abi.encodeWithSelector(sig, 55 * 32, invalidProofData.length)); + verifier.verify(pvs, invalidProofData, appExeCommit, appVmCommit); + } + + function test_RevertWhen_ProofVerificationFailed() public { + publicValuesLength = 32; + IOpenVmHalo2Verifier verifier = _compileAndDeployOpenVmVerifier(publicValuesLength); + + bytes memory _proofData = new bytes(55 * 32); + bytes memory pvs = new bytes(publicValuesLength); + + bytes4 sig = bytes4(keccak256("ProofVerificationFailed()")); + + vm.expectRevert(abi.encodeWithSelector(sig)); + verifier.verify(pvs, _proofData, appExeCommit, appVmCommit); + } + + function _compileAndDeployOpenVmVerifier(uint256 _publicValuesLength) + private + returns (IOpenVmHalo2Verifier verifier) + { + string memory code = LibString.replace(_code, "{PUBLIC_VALUES_LENGTH}", LibString.toString(_publicValuesLength)); + + // `code` will look like this: + // + // // SPDX-License-Identifier: MIT + // pragma solidity 0.8.19; + // + // import { Halo2Verifier } ... + // import { IOpenVmHalo2Verifier } ... + // + // contract OpenVmHalo2Verifier { .. } + // + // We want to replace the `import` statements with inlined deps for JIT + // compilation. + string memory inlinedCode = LibString.replace( + code, + "import { Halo2Verifier } from \"./Halo2Verifier.sol\";\nimport { IOpenVmHalo2Verifier } from \"./interfaces/IOpenVmHalo2Verifier.sol\";", + deps + ); + + // Must use solc 0.8.19 + string[] memory commands = new string[](3); + commands[0] = "sh"; + commands[1] = "-c"; + commands[2] = string.concat( + "echo ", + "'", + inlinedCode, + "'", + " | solc --no-optimize-yul --bin --optimize --optimize-runs 100000 - ", + " | awk 'BEGIN{found=0} /:OpenVmHalo2Verifier/ {found=1; next} found && /^Binary:/ {getline; print; exit}'" + ); + + bytes memory compiledVerifier = vm.ffi(commands); + + assembly { + verifier := create(0, add(compiledVerifier, 0x20), mload(compiledVerifier)) + if iszero(extcodesize(verifier)) { revert(0, 0) } + } + } +} diff --git a/crates/sdk/contracts/test/helpers/LibString.sol b/crates/sdk/contracts/test/helpers/LibString.sol new file mode 100644 index 0000000000..f046fa40d0 --- /dev/null +++ b/crates/sdk/contracts/test/helpers/LibString.sol @@ -0,0 +1,1628 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +/// @notice Library for byte related operations. +/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBytes.sol) +library LibBytes { + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* STRUCTS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Goated bytes storage struct that totally MOGs, no cap, fr. + /// Uses less gas and bytecode than Solidity's native bytes storage. It's meta af. + /// Packs length with the first 31 bytes if <255 bytes, so it’s mad tight. + struct BytesStorage { + bytes32 _spacer; + } + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* CONSTANTS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev The constant returned when the `search` is not found in the bytes. + uint256 internal constant NOT_FOUND = type(uint256).max; + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* BYTE STORAGE OPERATIONS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Sets the value of the bytes storage `$` to `s`. + function set(BytesStorage storage $, bytes memory s) internal { + /// @solidity memory-safe-assembly + assembly { + let n := mload(s) + let packed := or(0xff, shl(8, n)) + for { let i := 0 } 1 { } { + if iszero(gt(n, 0xfe)) { + i := 0x1f + packed := or(n, shl(8, mload(add(s, i)))) + if iszero(gt(n, i)) { break } + } + let o := add(s, 0x20) + mstore(0x00, $.slot) + for { let p := keccak256(0x00, 0x20) } 1 { } { + sstore(add(p, shr(5, i)), mload(add(o, i))) + i := add(i, 0x20) + if iszero(lt(i, n)) { break } + } + break + } + sstore($.slot, packed) + } + } + + /// @dev Sets the value of the bytes storage `$` to `s`. + function setCalldata(BytesStorage storage $, bytes calldata s) internal { + /// @solidity memory-safe-assembly + assembly { + let packed := or(0xff, shl(8, s.length)) + for { let i := 0 } 1 { } { + if iszero(gt(s.length, 0xfe)) { + i := 0x1f + packed := or(s.length, shl(8, shr(8, calldataload(s.offset)))) + if iszero(gt(s.length, i)) { break } + } + mstore(0x00, $.slot) + for { let p := keccak256(0x00, 0x20) } 1 { } { + sstore(add(p, shr(5, i)), calldataload(add(s.offset, i))) + i := add(i, 0x20) + if iszero(lt(i, s.length)) { break } + } + break + } + sstore($.slot, packed) + } + } + + /// @dev Sets the value of the bytes storage `$` to the empty bytes. + function clear(BytesStorage storage $) internal { + delete $._spacer; + } + + /// @dev Returns whether the value stored is `$` is the empty bytes "". + function isEmpty(BytesStorage storage $) internal view returns (bool) { + return uint256($._spacer) & 0xff == uint256(0); + } + + /// @dev Returns the length of the value stored in `$`. + function length(BytesStorage storage $) internal view returns (uint256 result) { + result = uint256($._spacer); + /// @solidity memory-safe-assembly + assembly { + let n := and(0xff, result) + result := or(mul(shr(8, result), eq(0xff, n)), mul(n, iszero(eq(0xff, n)))) + } + } + + /// @dev Returns the value stored in `$`. + function get(BytesStorage storage $) internal view returns (bytes memory result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(0x40) + let o := add(result, 0x20) + let packed := sload($.slot) + let n := shr(8, packed) + for { let i := 0 } 1 { } { + if iszero(eq(or(packed, 0xff), packed)) { + mstore(o, packed) + n := and(0xff, packed) + i := 0x1f + if iszero(gt(n, i)) { break } + } + mstore(0x00, $.slot) + for { let p := keccak256(0x00, 0x20) } 1 { } { + mstore(add(o, i), sload(add(p, shr(5, i)))) + i := add(i, 0x20) + if iszero(lt(i, n)) { break } + } + break + } + mstore(result, n) // Store the length of the memory. + mstore(add(o, n), 0) // Zeroize the slot after the bytes. + mstore(0x40, add(add(o, n), 0x20)) // Allocate memory. + } + } + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* BYTES OPERATIONS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`. + function replace(bytes memory subject, bytes memory needle, bytes memory replacement) + internal + pure + returns (bytes memory result) + { + /// @solidity memory-safe-assembly + assembly { + result := mload(0x40) + let needleLen := mload(needle) + let replacementLen := mload(replacement) + let d := sub(result, subject) // Memory difference. + let i := add(subject, 0x20) // Subject bytes pointer. + mstore(0x00, add(i, mload(subject))) // End of subject. + if iszero(gt(needleLen, mload(subject))) { + let subjectSearchEnd := add(sub(mload(0x00), needleLen), 1) + let h := 0 // The hash of `needle`. + if iszero(lt(needleLen, 0x20)) { h := keccak256(add(needle, 0x20), needleLen) } + let s := mload(add(needle, 0x20)) + for { let m := shl(3, sub(0x20, and(needleLen, 0x1f))) } 1 { } { + let t := mload(i) + // Whether the first `needleLen % 32` bytes of `subject` and `needle` matches. + if iszero(shr(m, xor(t, s))) { + if h { + if iszero(eq(keccak256(i, needleLen), h)) { + mstore(add(i, d), t) + i := add(i, 1) + if iszero(lt(i, subjectSearchEnd)) { break } + continue + } + } + // Copy the `replacement` one word at a time. + for { let j := 0 } 1 { } { + mstore(add(add(i, d), j), mload(add(add(replacement, 0x20), j))) + j := add(j, 0x20) + if iszero(lt(j, replacementLen)) { break } + } + d := sub(add(d, replacementLen), needleLen) + if needleLen { + i := add(i, needleLen) + if iszero(lt(i, subjectSearchEnd)) { break } + continue + } + } + mstore(add(i, d), t) + i := add(i, 1) + if iszero(lt(i, subjectSearchEnd)) { break } + } + } + let end := mload(0x00) + let n := add(sub(d, add(result, 0x20)), end) + // Copy the rest of the bytes one word at a time. + for { } lt(i, end) { i := add(i, 0x20) } { mstore(add(i, d), mload(i)) } + let o := add(i, d) + mstore(o, 0) // Zeroize the slot after the bytes. + mstore(0x40, add(o, 0x20)) // Allocate memory. + mstore(result, n) // Store the length. + } + } + + /// @dev Returns the byte index of the first location of `needle` in `subject`, + /// needleing from left to right, starting from `from`. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found. + function indexOf(bytes memory subject, bytes memory needle, uint256 from) internal pure returns (uint256 result) { + /// @solidity memory-safe-assembly + assembly { + result := not(0) // Initialize to `NOT_FOUND`. + for { let subjectLen := mload(subject) } 1 { } { + if iszero(mload(needle)) { + result := from + if iszero(gt(from, subjectLen)) { break } + result := subjectLen + break + } + let needleLen := mload(needle) + let subjectStart := add(subject, 0x20) + + subject := add(subjectStart, from) + let end := add(sub(add(subjectStart, subjectLen), needleLen), 1) + let m := shl(3, sub(0x20, and(needleLen, 0x1f))) + let s := mload(add(needle, 0x20)) + + if iszero(and(lt(subject, end), lt(from, subjectLen))) { break } + + if iszero(lt(needleLen, 0x20)) { + for { let h := keccak256(add(needle, 0x20), needleLen) } 1 { } { + if iszero(shr(m, xor(mload(subject), s))) { + if eq(keccak256(subject, needleLen), h) { + result := sub(subject, subjectStart) + break + } + } + subject := add(subject, 1) + if iszero(lt(subject, end)) { break } + } + break + } + for { } 1 { } { + if iszero(shr(m, xor(mload(subject), s))) { + result := sub(subject, subjectStart) + break + } + subject := add(subject, 1) + if iszero(lt(subject, end)) { break } + } + break + } + } + } + + /// @dev Returns the byte index of the first location of `needle` in `subject`, + /// needleing from left to right. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found. + function indexOf(bytes memory subject, bytes memory needle) internal pure returns (uint256) { + return indexOf(subject, needle, 0); + } + + /// @dev Returns the byte index of the first location of `needle` in `subject`, + /// needleing from right to left, starting from `from`. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found. + function lastIndexOf(bytes memory subject, bytes memory needle, uint256 from) + internal + pure + returns (uint256 result) + { + /// @solidity memory-safe-assembly + assembly { + for { } 1 { } { + result := not(0) // Initialize to `NOT_FOUND`. + let needleLen := mload(needle) + if gt(needleLen, mload(subject)) { break } + let w := result + + let fromMax := sub(mload(subject), needleLen) + if iszero(gt(fromMax, from)) { from := fromMax } + + let end := add(add(subject, 0x20), w) + subject := add(add(subject, 0x20), from) + if iszero(gt(subject, end)) { break } + // As this function is not too often used, + // we shall simply use keccak256 for smaller bytecode size. + for { let h := keccak256(add(needle, 0x20), needleLen) } 1 { } { + if eq(keccak256(subject, needleLen), h) { + result := sub(subject, add(end, 1)) + break + } + subject := add(subject, w) // `sub(subject, 1)`. + if iszero(gt(subject, end)) { break } + } + break + } + } + } + + /// @dev Returns the byte index of the first location of `needle` in `subject`, + /// needleing from right to left. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found. + function lastIndexOf(bytes memory subject, bytes memory needle) internal pure returns (uint256) { + return lastIndexOf(subject, needle, type(uint256).max); + } + + /// @dev Returns true if `needle` is found in `subject`, false otherwise. + function contains(bytes memory subject, bytes memory needle) internal pure returns (bool) { + return indexOf(subject, needle) != NOT_FOUND; + } + + /// @dev Returns whether `subject` starts with `needle`. + function startsWith(bytes memory subject, bytes memory needle) internal pure returns (bool result) { + /// @solidity memory-safe-assembly + assembly { + let n := mload(needle) + // Just using keccak256 directly is actually cheaper. + let t := eq(keccak256(add(subject, 0x20), n), keccak256(add(needle, 0x20), n)) + result := lt(gt(n, mload(subject)), t) + } + } + + /// @dev Returns whether `subject` ends with `needle`. + function endsWith(bytes memory subject, bytes memory needle) internal pure returns (bool result) { + /// @solidity memory-safe-assembly + assembly { + let n := mload(needle) + let notInRange := gt(n, mload(subject)) + // `subject + 0x20 + max(subject.length - needle.length, 0)`. + let t := add(add(subject, 0x20), mul(iszero(notInRange), sub(mload(subject), n))) + // Just using keccak256 directly is actually cheaper. + result := gt(eq(keccak256(t, n), keccak256(add(needle, 0x20), n)), notInRange) + } + } + + /// @dev Returns `subject` repeated `times`. + function repeat(bytes memory subject, uint256 times) internal pure returns (bytes memory result) { + /// @solidity memory-safe-assembly + assembly { + let l := mload(subject) // Subject length. + if iszero(or(iszero(times), iszero(l))) { + result := mload(0x40) + subject := add(subject, 0x20) + let o := add(result, 0x20) + for { } 1 { } { + // Copy the `subject` one word at a time. + for { let j := 0 } 1 { } { + mstore(add(o, j), mload(add(subject, j))) + j := add(j, 0x20) + if iszero(lt(j, l)) { break } + } + o := add(o, l) + times := sub(times, 1) + if iszero(times) { break } + } + mstore(o, 0) // Zeroize the slot after the bytes. + mstore(0x40, add(o, 0x20)) // Allocate memory. + mstore(result, sub(o, add(result, 0x20))) // Store the length. + } + } + } + + /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive). + /// `start` and `end` are byte offsets. + function slice(bytes memory subject, uint256 start, uint256 end) internal pure returns (bytes memory result) { + /// @solidity memory-safe-assembly + assembly { + let l := mload(subject) // Subject length. + if iszero(gt(l, end)) { end := l } + if iszero(gt(l, start)) { start := l } + if lt(start, end) { + result := mload(0x40) + let n := sub(end, start) + let i := add(subject, start) + let w := not(0x1f) + // Copy the `subject` one word at a time, backwards. + for { let j := and(add(n, 0x1f), w) } 1 { } { + mstore(add(result, j), mload(add(i, j))) + j := add(j, w) // `sub(j, 0x20)`. + if iszero(j) { break } + } + let o := add(add(result, 0x20), n) + mstore(o, 0) // Zeroize the slot after the bytes. + mstore(0x40, add(o, 0x20)) // Allocate memory. + mstore(result, n) // Store the length. + } + } + } + + /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes. + /// `start` is a byte offset. + function slice(bytes memory subject, uint256 start) internal pure returns (bytes memory result) { + result = slice(subject, start, type(uint256).max); + } + + /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive). + /// `start` and `end` are byte offsets. Faster than Solidity's native slicing. + function sliceCalldata(bytes calldata subject, uint256 start, uint256 end) + internal + pure + returns (bytes calldata result) + { + /// @solidity memory-safe-assembly + assembly { + end := xor(end, mul(xor(end, subject.length), lt(subject.length, end))) + start := xor(start, mul(xor(start, subject.length), lt(subject.length, start))) + result.offset := add(subject.offset, start) + result.length := mul(lt(start, end), sub(end, start)) + } + } + + /// @dev Returns a copy of `subject` sliced from `start` to the end of the bytes. + /// `start` is a byte offset. Faster than Solidity's native slicing. + function sliceCalldata(bytes calldata subject, uint256 start) internal pure returns (bytes calldata result) { + /// @solidity memory-safe-assembly + assembly { + start := xor(start, mul(xor(start, subject.length), lt(subject.length, start))) + result.offset := add(subject.offset, start) + result.length := mul(lt(start, subject.length), sub(subject.length, start)) + } + } + + /// @dev Reduces the size of `subject` to `n`. + /// If `n` is greater than the size of `subject`, this will be a no-op. + function truncate(bytes memory subject, uint256 n) internal pure returns (bytes memory result) { + /// @solidity memory-safe-assembly + assembly { + result := subject + mstore(mul(lt(n, mload(result)), result), n) + } + } + + /// @dev Returns a copy of `subject`, with the length reduced to `n`. + /// If `n` is greater than the size of `subject`, this will be a no-op. + function truncatedCalldata(bytes calldata subject, uint256 n) internal pure returns (bytes calldata result) { + /// @solidity memory-safe-assembly + assembly { + result.offset := subject.offset + result.length := xor(n, mul(xor(n, subject.length), lt(subject.length, n))) + } + } + + /// @dev Returns all the indices of `needle` in `subject`. + /// The indices are byte offsets. + function indicesOf(bytes memory subject, bytes memory needle) internal pure returns (uint256[] memory result) { + /// @solidity memory-safe-assembly + assembly { + let searchLen := mload(needle) + if iszero(gt(searchLen, mload(subject))) { + result := mload(0x40) + let i := add(subject, 0x20) + let o := add(result, 0x20) + let subjectSearchEnd := add(sub(add(i, mload(subject)), searchLen), 1) + let h := 0 // The hash of `needle`. + if iszero(lt(searchLen, 0x20)) { h := keccak256(add(needle, 0x20), searchLen) } + let s := mload(add(needle, 0x20)) + for { let m := shl(3, sub(0x20, and(searchLen, 0x1f))) } 1 { } { + let t := mload(i) + // Whether the first `searchLen % 32` bytes of `subject` and `needle` matches. + if iszero(shr(m, xor(t, s))) { + if h { + if iszero(eq(keccak256(i, searchLen), h)) { + i := add(i, 1) + if iszero(lt(i, subjectSearchEnd)) { break } + continue + } + } + mstore(o, sub(i, add(subject, 0x20))) // Append to `result`. + o := add(o, 0x20) + i := add(i, searchLen) // Advance `i` by `searchLen`. + if searchLen { + if iszero(lt(i, subjectSearchEnd)) { break } + continue + } + } + i := add(i, 1) + if iszero(lt(i, subjectSearchEnd)) { break } + } + mstore(result, shr(5, sub(o, add(result, 0x20)))) // Store the length of `result`. + // Allocate memory for result. + // We allocate one more word, so this array can be recycled for {split}. + mstore(0x40, add(o, 0x20)) + } + } + } + + /// @dev Returns an arrays of bytess based on the `delimiter` inside of the `subject` bytes. + function split(bytes memory subject, bytes memory delimiter) internal pure returns (bytes[] memory result) { + uint256[] memory indices = indicesOf(subject, delimiter); + /// @solidity memory-safe-assembly + assembly { + let w := not(0x1f) + let indexPtr := add(indices, 0x20) + let indicesEnd := add(indexPtr, shl(5, add(mload(indices), 1))) + mstore(add(indicesEnd, w), mload(subject)) + mstore(indices, add(mload(indices), 1)) + for { let prevIndex := 0 } 1 { } { + let index := mload(indexPtr) + mstore(indexPtr, 0x60) + if iszero(eq(index, prevIndex)) { + let element := mload(0x40) + let l := sub(index, prevIndex) + mstore(element, l) // Store the length of the element. + // Copy the `subject` one word at a time, backwards. + for { let o := and(add(l, 0x1f), w) } 1 { } { + mstore(add(element, o), mload(add(add(subject, prevIndex), o))) + o := add(o, w) // `sub(o, 0x20)`. + if iszero(o) { break } + } + mstore(add(add(element, 0x20), l), 0) // Zeroize the slot after the bytes. + // Allocate memory for the length and the bytes, rounded up to a multiple of 32. + mstore(0x40, add(element, and(add(l, 0x3f), w))) + mstore(indexPtr, element) // Store the `element` into the array. + } + prevIndex := add(index, mload(delimiter)) + indexPtr := add(indexPtr, 0x20) + if iszero(lt(indexPtr, indicesEnd)) { break } + } + result := indices + if iszero(mload(delimiter)) { + result := add(indices, 0x20) + mstore(result, sub(mload(indices), 2)) + } + } + } + + /// @dev Returns a concatenated bytes of `a` and `b`. + /// Cheaper than `bytes.concat()` and does not de-align the free memory pointer. + function concat(bytes memory a, bytes memory b) internal pure returns (bytes memory result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(0x40) + let w := not(0x1f) + let aLen := mload(a) + // Copy `a` one word at a time, backwards. + for { let o := and(add(aLen, 0x20), w) } 1 { } { + mstore(add(result, o), mload(add(a, o))) + o := add(o, w) // `sub(o, 0x20)`. + if iszero(o) { break } + } + let bLen := mload(b) + let output := add(result, aLen) + // Copy `b` one word at a time, backwards. + for { let o := and(add(bLen, 0x20), w) } 1 { } { + mstore(add(output, o), mload(add(b, o))) + o := add(o, w) // `sub(o, 0x20)`. + if iszero(o) { break } + } + let totalLen := add(aLen, bLen) + let last := add(add(result, 0x20), totalLen) + mstore(last, 0) // Zeroize the slot after the bytes. + mstore(result, totalLen) // Store the length. + mstore(0x40, add(last, 0x20)) // Allocate memory. + } + } + + /// @dev Returns whether `a` equals `b`. + function eq(bytes memory a, bytes memory b) internal pure returns (bool result) { + /// @solidity memory-safe-assembly + assembly { + result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b))) + } + } + + /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small bytes. + function eqs(bytes memory a, bytes32 b) internal pure returns (bool result) { + /// @solidity memory-safe-assembly + assembly { + // These should be evaluated on compile time, as far as possible. + let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`. + let x := not(or(m, or(b, add(m, and(b, m))))) + let r := shl(7, iszero(iszero(shr(128, x)))) + r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x)))))) + r := or(r, shl(5, lt(0xffffffff, shr(r, x)))) + r := or(r, shl(4, lt(0xffff, shr(r, x)))) + r := or(r, shl(3, lt(0xff, shr(r, x)))) + // forgefmt: disable-next-item + result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))), + xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20))))) + } + } + + /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`. + /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1. + function cmp(bytes memory a, bytes memory b) internal pure returns (int256 result) { + /// @solidity memory-safe-assembly + assembly { + let aLen := mload(a) + let bLen := mload(b) + let n := and(xor(aLen, mul(xor(aLen, bLen), lt(bLen, aLen))), not(0x1f)) + if n { + for { let i := 0x20 } 1 { } { + let x := mload(add(a, i)) + let y := mload(add(b, i)) + if iszero(or(xor(x, y), eq(i, n))) { + i := add(i, 0x20) + continue + } + result := sub(gt(x, y), lt(x, y)) + break + } + } + // forgefmt: disable-next-item + if iszero(result) { + let l := 0x201f1e1d1c1b1a191817161514131211100f0e0d0c0b0a090807060504030201 + let x := and(mload(add(add(a, 0x20), n)), shl(shl(3, byte(sub(aLen, n), l)), not(0))) + let y := and(mload(add(add(b, 0x20), n)), shl(shl(3, byte(sub(bLen, n), l)), not(0))) + result := sub(gt(x, y), lt(x, y)) + if iszero(result) { result := sub(gt(aLen, bLen), lt(aLen, bLen)) } + } + } + } + + /// @dev Directly returns `a` without copying. + function directReturn(bytes memory a) internal pure { + /// @solidity memory-safe-assembly + assembly { + // Assumes that the bytes does not start from the scratch space. + let retStart := sub(a, 0x20) + let retUnpaddedSize := add(mload(a), 0x40) + // Right pad with zeroes. Just in case the bytes is produced + // by a method that doesn't zero right pad. + mstore(add(retStart, retUnpaddedSize), 0) + mstore(retStart, 0x20) // Store the return offset. + // End the transaction, returning the bytes. + return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize))) + } + } + + /// @dev Directly returns `a` with minimal copying. + function directReturn(bytes[] memory a) internal pure { + /// @solidity memory-safe-assembly + assembly { + let n := mload(a) // `a.length`. + let o := add(a, 0x20) // Start of elements in `a`. + let u := a // Highest memory slot. + let w := not(0x1f) + for { let i := 0 } iszero(eq(i, n)) { i := add(i, 1) } { + let c := add(o, shl(5, i)) // Location of pointer to `a[i]`. + let s := mload(c) // `a[i]`. + let l := mload(s) // `a[i].length`. + let r := and(l, 0x1f) // `a[i].length % 32`. + let z := add(0x20, and(l, w)) // Offset of last word in `a[i]` from `s`. + // If `s` comes before `o`, or `s` is not zero right padded. + if iszero(lt(lt(s, o), or(iszero(r), iszero(shl(shl(3, r), mload(add(s, z))))))) { + let m := mload(0x40) + mstore(m, l) // Copy `a[i].length`. + for { } 1 { } { + mstore(add(m, z), mload(add(s, z))) // Copy `a[i]`, backwards. + z := add(z, w) // `sub(z, 0x20)`. + if iszero(z) { break } + } + let e := add(add(m, 0x20), l) + mstore(e, 0) // Zeroize the slot after the copied bytes. + mstore(0x40, add(e, 0x20)) // Allocate memory. + s := m + } + mstore(c, sub(s, o)) // Convert to calldata offset. + let t := add(l, add(s, 0x20)) + if iszero(lt(t, u)) { u := t } + } + let retStart := add(a, w) // Assumes `a` doesn't start from scratch space. + mstore(retStart, 0x20) // Store the return offset. + return(retStart, add(0x40, sub(u, retStart))) // End the transaction. + } + } + + /// @dev Returns the word at `offset`, without any bounds checks. + function load(bytes memory a, uint256 offset) internal pure returns (bytes32 result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(add(add(a, 0x20), offset)) + } + } + + /// @dev Returns the word at `offset`, without any bounds checks. + function loadCalldata(bytes calldata a, uint256 offset) internal pure returns (bytes32 result) { + /// @solidity memory-safe-assembly + assembly { + result := calldataload(add(a.offset, offset)) + } + } + + /// @dev Returns a slice representing a static struct in the calldata. Performs bounds checks. + function staticStructInCalldata(bytes calldata a, uint256 offset) internal pure returns (bytes calldata result) { + /// @solidity memory-safe-assembly + assembly { + let l := sub(a.length, 0x20) + result.offset := add(a.offset, offset) + result.length := sub(a.length, offset) + if or(shr(64, or(l, a.offset)), gt(offset, l)) { revert(l, 0x00) } + } + } + + /// @dev Returns a slice representing a dynamic struct in the calldata. Performs bounds checks. + function dynamicStructInCalldata(bytes calldata a, uint256 offset) internal pure returns (bytes calldata result) { + /// @solidity memory-safe-assembly + assembly { + let l := sub(a.length, 0x20) + let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`. + result.offset := add(a.offset, s) + result.length := sub(a.length, s) + if or(shr(64, or(s, or(l, a.offset))), gt(offset, l)) { revert(l, 0x00) } + } + } + + /// @dev Returns bytes in calldata. Performs bounds checks. + function bytesInCalldata(bytes calldata a, uint256 offset) internal pure returns (bytes calldata result) { + /// @solidity memory-safe-assembly + assembly { + let l := sub(a.length, 0x20) + let s := calldataload(add(a.offset, offset)) // Relative offset of `result` from `a.offset`. + result.offset := add(add(a.offset, s), 0x20) + result.length := calldataload(add(a.offset, s)) + // forgefmt: disable-next-item + if or(shr(64, or(result.length, or(s, or(l, a.offset)))), + or(gt(add(s, result.length), l), gt(offset, l))) { revert(l, 0x00) } + } + } + + /// @dev Returns empty calldata bytes. For silencing the compiler. + function emptyCalldata() internal pure returns (bytes calldata result) { + /// @solidity memory-safe-assembly + assembly { + result.length := 0 + } + } +} + +/// @notice Library for converting numbers into strings and other string operations. +/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol) +/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol) +/// +/// @dev Note: +/// For performance and bytecode compactness, most of the string operations are restricted to +/// byte strings (7-bit ASCII), except where otherwise specified. +/// Usage of byte string operations on charsets with runes spanning two or more bytes +/// can lead to undefined behavior. +library LibString { + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* STRUCTS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Goated string storage struct that totally MOGs, no cap, fr. + /// Uses less gas and bytecode than Solidity's native string storage. It's meta af. + /// Packs length with the first 31 bytes if <255 bytes, so it’s mad tight. + struct StringStorage { + bytes32 _spacer; + } + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* CUSTOM ERRORS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev The length of the output is too small to contain all the hex digits. + error HexLengthInsufficient(); + + /// @dev The length of the string is more than 32 bytes. + error TooBigForSmallString(); + + /// @dev The input string must be a 7-bit ASCII. + error StringNot7BitASCII(); + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* CONSTANTS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev The constant returned when the `search` is not found in the string. + uint256 internal constant NOT_FOUND = type(uint256).max; + + /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'. + uint128 internal constant ALPHANUMERIC_7_BIT_ASCII = 0x7fffffe07fffffe03ff000000000000; + + /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'. + uint128 internal constant LETTERS_7_BIT_ASCII = 0x7fffffe07fffffe0000000000000000; + + /// @dev Lookup for 'abcdefghijklmnopqrstuvwxyz'. + uint128 internal constant LOWERCASE_7_BIT_ASCII = 0x7fffffe000000000000000000000000; + + /// @dev Lookup for 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. + uint128 internal constant UPPERCASE_7_BIT_ASCII = 0x7fffffe0000000000000000; + + /// @dev Lookup for '0123456789'. + uint128 internal constant DIGITS_7_BIT_ASCII = 0x3ff000000000000; + + /// @dev Lookup for '0123456789abcdefABCDEF'. + uint128 internal constant HEXDIGITS_7_BIT_ASCII = 0x7e0000007e03ff000000000000; + + /// @dev Lookup for '01234567'. + uint128 internal constant OCTDIGITS_7_BIT_ASCII = 0xff000000000000; + + /// @dev Lookup for '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c'. + uint128 internal constant PRINTABLE_7_BIT_ASCII = 0x7fffffffffffffffffffffff00003e00; + + /// @dev Lookup for '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'. + uint128 internal constant PUNCTUATION_7_BIT_ASCII = 0x78000001f8000001fc00fffe00000000; + + /// @dev Lookup for ' \t\n\r\x0b\x0c'. + uint128 internal constant WHITESPACE_7_BIT_ASCII = 0x100003e00; + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* STRING STORAGE OPERATIONS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Sets the value of the string storage `$` to `s`. + function set(StringStorage storage $, string memory s) internal { + LibBytes.set(bytesStorage($), bytes(s)); + } + + /// @dev Sets the value of the string storage `$` to `s`. + function setCalldata(StringStorage storage $, string calldata s) internal { + LibBytes.setCalldata(bytesStorage($), bytes(s)); + } + + /// @dev Sets the value of the string storage `$` to the empty string. + function clear(StringStorage storage $) internal { + delete $._spacer; + } + + /// @dev Returns whether the value stored is `$` is the empty string "". + function isEmpty(StringStorage storage $) internal view returns (bool) { + return uint256($._spacer) & 0xff == uint256(0); + } + + /// @dev Returns the length of the value stored in `$`. + function length(StringStorage storage $) internal view returns (uint256) { + return LibBytes.length(bytesStorage($)); + } + + /// @dev Returns the value stored in `$`. + function get(StringStorage storage $) internal view returns (string memory) { + return string(LibBytes.get(bytesStorage($))); + } + + /// @dev Helper to cast `$` to a `BytesStorage`. + function bytesStorage(StringStorage storage $) internal pure returns (LibBytes.BytesStorage storage casted) { + /// @solidity memory-safe-assembly + assembly { + casted.slot := $.slot + } + } + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* DECIMAL OPERATIONS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Returns the base 10 decimal representation of `value`. + function toString(uint256 value) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + // The maximum value of a uint256 contains 78 digits (1 byte per digit), but + // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. + // We will need 1 word for the trailing zeros padding, 1 word for the length, + // and 3 words for a maximum of 78 digits. + result := add(mload(0x40), 0x80) + mstore(0x40, add(result, 0x20)) // Allocate memory. + mstore(result, 0) // Zeroize the slot after the string. + + let end := result // Cache the end of the memory to calculate the length later. + let w := not(0) // Tsk. + // We write the string from rightmost digit to leftmost digit. + // The following is essentially a do-while loop that also handles the zero case. + for { let temp := value } 1 { } { + result := add(result, w) // `sub(result, 1)`. + // Store the character to the pointer. + // The ASCII index of the '0' character is 48. + mstore8(result, add(48, mod(temp, 10))) + temp := div(temp, 10) // Keep dividing `temp` until zero. + if iszero(temp) { break } + } + let n := sub(end, result) + result := sub(result, 0x20) // Move the pointer 32 bytes back to make room for the length. + mstore(result, n) // Store the length. + } + } + + /// @dev Returns the base 10 decimal representation of `value`. + function toString(int256 value) internal pure returns (string memory result) { + if (value >= 0) return toString(uint256(value)); + unchecked { + result = toString(~uint256(value) + 1); + } + /// @solidity memory-safe-assembly + assembly { + // We still have some spare memory space on the left, + // as we have allocated 3 words (96 bytes) for up to 78 digits. + let n := mload(result) // Load the string length. + mstore(result, 0x2d) // Store the '-' character. + result := sub(result, 1) // Move back the string pointer by a byte. + mstore(result, add(n, 1)) // Update the string length. + } + } + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* HEXADECIMAL OPERATIONS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Returns the hexadecimal representation of `value`, + /// left-padded to an input length of `byteCount` bytes. + /// The output is prefixed with "0x" encoded using 2 hexadecimal digits per byte, + /// giving a total length of `byteCount * 2 + 2` bytes. + /// Reverts if `byteCount` is too small for the output to contain all the digits. + function toHexString(uint256 value, uint256 byteCount) internal pure returns (string memory result) { + result = toHexStringNoPrefix(value, byteCount); + /// @solidity memory-safe-assembly + assembly { + let n := add(mload(result), 2) // Compute the length. + mstore(result, 0x3078) // Store the "0x" prefix. + result := sub(result, 2) // Move the pointer. + mstore(result, n) // Store the length. + } + } + + /// @dev Returns the hexadecimal representation of `value`, + /// left-padded to an input length of `byteCount` bytes. + /// The output is not prefixed with "0x" and is encoded using 2 hexadecimal digits per byte, + /// giving a total length of `byteCount * 2` bytes. + /// Reverts if `byteCount` is too small for the output to contain all the digits. + function toHexStringNoPrefix(uint256 value, uint256 byteCount) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + // We need 0x20 bytes for the trailing zeros padding, `byteCount * 2` bytes + // for the digits, 0x02 bytes for the prefix, and 0x20 bytes for the length. + // We add 0x20 to the total and round down to a multiple of 0x20. + // (0x20 + 0x20 + 0x02 + 0x20) = 0x62. + result := add(mload(0x40), and(add(shl(1, byteCount), 0x42), not(0x1f))) + mstore(0x40, add(result, 0x20)) // Allocate memory. + mstore(result, 0) // Zeroize the slot after the string. + + let end := result // Cache the end to calculate the length later. + // Store "0123456789abcdef" in scratch space. + mstore(0x0f, 0x30313233343536373839616263646566) + + let start := sub(result, add(byteCount, byteCount)) + let w := not(1) // Tsk. + let temp := value + // We write the string from rightmost digit to leftmost digit. + // The following is essentially a do-while loop that also handles the zero case. + for { } 1 { } { + result := add(result, w) // `sub(result, 2)`. + mstore8(add(result, 1), mload(and(temp, 15))) + mstore8(result, mload(and(shr(4, temp), 15))) + temp := shr(8, temp) + if iszero(xor(result, start)) { break } + } + if temp { + mstore(0x00, 0x2194895a) // `HexLengthInsufficient()`. + revert(0x1c, 0x04) + } + let n := sub(end, result) + result := sub(result, 0x20) + mstore(result, n) // Store the length. + } + } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. + /// As address are 20 bytes long, the output will left-padded to have + /// a length of `20 * 2 + 2` bytes. + function toHexString(uint256 value) internal pure returns (string memory result) { + result = toHexStringNoPrefix(value); + /// @solidity memory-safe-assembly + assembly { + let n := add(mload(result), 2) // Compute the length. + mstore(result, 0x3078) // Store the "0x" prefix. + result := sub(result, 2) // Move the pointer. + mstore(result, n) // Store the length. + } + } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output is prefixed with "0x". + /// The output excludes leading "0" from the `toHexString` output. + /// `0x00: "0x0", 0x01: "0x1", 0x12: "0x12", 0x123: "0x123"`. + function toMinimalHexString(uint256 value) internal pure returns (string memory result) { + result = toHexStringNoPrefix(value); + /// @solidity memory-safe-assembly + assembly { + let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present. + let n := add(mload(result), 2) // Compute the length. + mstore(add(result, o), 0x3078) // Store the "0x" prefix, accounting for leading zero. + result := sub(add(result, o), 2) // Move the pointer, accounting for leading zero. + mstore(result, sub(n, o)) // Store the length, accounting for leading zero. + } + } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output excludes leading "0" from the `toHexStringNoPrefix` output. + /// `0x00: "0", 0x01: "1", 0x12: "12", 0x123: "123"`. + function toMinimalHexStringNoPrefix(uint256 value) internal pure returns (string memory result) { + result = toHexStringNoPrefix(value); + /// @solidity memory-safe-assembly + assembly { + let o := eq(byte(0, mload(add(result, 0x20))), 0x30) // Whether leading zero is present. + let n := mload(result) // Get the length. + result := add(result, o) // Move the pointer, accounting for leading zero. + mstore(result, sub(n, o)) // Store the length, accounting for leading zero. + } + } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output is encoded using 2 hexadecimal digits per byte. + /// As address are 20 bytes long, the output will left-padded to have + /// a length of `20 * 2` bytes. + function toHexStringNoPrefix(uint256 value) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, + // 0x02 bytes for the prefix, and 0x40 bytes for the digits. + // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x40) is 0xa0. + result := add(mload(0x40), 0x80) + mstore(0x40, add(result, 0x20)) // Allocate memory. + mstore(result, 0) // Zeroize the slot after the string. + + let end := result // Cache the end to calculate the length later. + mstore(0x0f, 0x30313233343536373839616263646566) // Store the "0123456789abcdef" lookup. + + let w := not(1) // Tsk. + // We write the string from rightmost digit to leftmost digit. + // The following is essentially a do-while loop that also handles the zero case. + for { let temp := value } 1 { } { + result := add(result, w) // `sub(result, 2)`. + mstore8(add(result, 1), mload(and(temp, 15))) + mstore8(result, mload(and(shr(4, temp), 15))) + temp := shr(8, temp) + if iszero(temp) { break } + } + let n := sub(end, result) + result := sub(result, 0x20) + mstore(result, n) // Store the length. + } + } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output is prefixed with "0x", encoded using 2 hexadecimal digits per byte, + /// and the alphabets are capitalized conditionally according to + /// https://eips.ethereum.org/EIPS/eip-55 + function toHexStringChecksummed(address value) internal pure returns (string memory result) { + result = toHexString(value); + /// @solidity memory-safe-assembly + assembly { + let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...` + let o := add(result, 0x22) + let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... ` + let t := shl(240, 136) // `0b10001000 << 240` + for { let i := 0 } 1 { } { + mstore(add(i, i), mul(t, byte(i, hashed))) + i := add(i, 1) + if eq(i, 20) { break } + } + mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask))))) + o := add(o, 0x20) + mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask))))) + } + } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. + function toHexString(address value) internal pure returns (string memory result) { + result = toHexStringNoPrefix(value); + /// @solidity memory-safe-assembly + assembly { + let n := add(mload(result), 2) // Compute the length. + mstore(result, 0x3078) // Store the "0x" prefix. + result := sub(result, 2) // Move the pointer. + mstore(result, n) // Store the length. + } + } + + /// @dev Returns the hexadecimal representation of `value`. + /// The output is encoded using 2 hexadecimal digits per byte. + function toHexStringNoPrefix(address value) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(0x40) + // Allocate memory. + // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, + // 0x02 bytes for the prefix, and 0x28 bytes for the digits. + // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80. + mstore(0x40, add(result, 0x80)) + mstore(0x0f, 0x30313233343536373839616263646566) // Store the "0123456789abcdef" lookup. + + result := add(result, 2) + mstore(result, 40) // Store the length. + let o := add(result, 0x20) + mstore(add(o, 40), 0) // Zeroize the slot after the string. + value := shl(96, value) + // We write the string from rightmost digit to leftmost digit. + // The following is essentially a do-while loop that also handles the zero case. + for { let i := 0 } 1 { } { + let p := add(o, add(i, i)) + let temp := byte(i, value) + mstore8(add(p, 1), mload(and(temp, 15))) + mstore8(p, mload(shr(4, temp))) + i := add(i, 1) + if eq(i, 20) { break } + } + } + } + + /// @dev Returns the hex encoded string from the raw bytes. + /// The output is encoded using 2 hexadecimal digits per byte. + function toHexString(bytes memory raw) internal pure returns (string memory result) { + result = toHexStringNoPrefix(raw); + /// @solidity memory-safe-assembly + assembly { + let n := add(mload(result), 2) // Compute the length. + mstore(result, 0x3078) // Store the "0x" prefix. + result := sub(result, 2) // Move the pointer. + mstore(result, n) // Store the length. + } + } + + /// @dev Returns the hex encoded string from the raw bytes. + /// The output is encoded using 2 hexadecimal digits per byte. + function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + let n := mload(raw) + result := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix. + mstore(result, add(n, n)) // Store the length of the output. + + mstore(0x0f, 0x30313233343536373839616263646566) // Store the "0123456789abcdef" lookup. + let o := add(result, 0x20) + let end := add(raw, n) + for { } iszero(eq(raw, end)) { } { + raw := add(raw, 1) + mstore8(add(o, 1), mload(and(mload(raw), 15))) + mstore8(o, mload(and(shr(4, mload(raw)), 15))) + o := add(o, 2) + } + mstore(o, 0) // Zeroize the slot after the string. + mstore(0x40, add(o, 0x20)) // Allocate memory. + } + } + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* RUNE STRING OPERATIONS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + /// @dev Returns the number of UTF characters in the string. + function runeCount(string memory s) internal pure returns (uint256 result) { + /// @solidity memory-safe-assembly + assembly { + if mload(s) { + mstore(0x00, div(not(0), 255)) + mstore(0x20, 0x0202020202020202020202020202020202020202020202020303030304040506) + let o := add(s, 0x20) + let end := add(o, mload(s)) + for { result := 1 } 1 { result := add(result, 1) } { + o := add(o, byte(0, mload(shr(250, mload(o))))) + if iszero(lt(o, end)) { break } + } + } + } + } + + /// @dev Returns if this string is a 7-bit ASCII string. + /// (i.e. all characters codes are in [0..127]) + function is7BitASCII(string memory s) internal pure returns (bool result) { + /// @solidity memory-safe-assembly + assembly { + result := 1 + let mask := shl(7, div(not(0), 255)) + let n := mload(s) + if n { + let o := add(s, 0x20) + let end := add(o, n) + let last := mload(end) + mstore(end, 0) + for { } 1 { } { + if and(mask, mload(o)) { + result := 0 + break + } + o := add(o, 0x20) + if iszero(lt(o, end)) { break } + } + mstore(end, last) + } + } + } + + /// @dev Returns if this string is a 7-bit ASCII string, + /// AND all characters are in the `allowed` lookup. + /// Note: If `s` is empty, returns true regardless of `allowed`. + function is7BitASCII(string memory s, uint128 allowed) internal pure returns (bool result) { + /// @solidity memory-safe-assembly + assembly { + result := 1 + if mload(s) { + let allowed_ := shr(128, shl(128, allowed)) + let o := add(s, 0x20) + for { let end := add(o, mload(s)) } 1 { } { + result := and(result, shr(byte(0, mload(o)), allowed_)) + o := add(o, 1) + if iszero(and(result, lt(o, end))) { break } + } + } + } + } + + /// @dev Converts the bytes in the 7-bit ASCII string `s` to + /// an allowed lookup for use in `is7BitASCII(s, allowed)`. + /// To save runtime gas, you can cache the result in an immutable variable. + function to7BitASCIIAllowedLookup(string memory s) internal pure returns (uint128 result) { + /// @solidity memory-safe-assembly + assembly { + if mload(s) { + let o := add(s, 0x20) + for { let end := add(o, mload(s)) } 1 { } { + result := or(result, shl(byte(0, mload(o)), 1)) + o := add(o, 1) + if iszero(lt(o, end)) { break } + } + if shr(128, result) { + mstore(0x00, 0xc9807e0d) // `StringNot7BitASCII()`. + revert(0x1c, 0x04) + } + } + } + } + + /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ + /* BYTE STRING OPERATIONS */ + /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ + + // For performance and bytecode compactness, byte string operations are restricted + // to 7-bit ASCII strings. All offsets are byte offsets, not UTF character offsets. + // Usage of byte string operations on charsets with runes spanning two or more bytes + // can lead to undefined behavior. + + /// @dev Returns `subject` all occurrences of `needle` replaced with `replacement`. + function replace(string memory subject, string memory needle, string memory replacement) + internal + pure + returns (string memory) + { + return string(LibBytes.replace(bytes(subject), bytes(needle), bytes(replacement))); + } + + /// @dev Returns the byte index of the first location of `needle` in `subject`, + /// needleing from left to right, starting from `from`. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found. + function indexOf(string memory subject, string memory needle, uint256 from) internal pure returns (uint256) { + return LibBytes.indexOf(bytes(subject), bytes(needle), from); + } + + /// @dev Returns the byte index of the first location of `needle` in `subject`, + /// needleing from left to right. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found. + function indexOf(string memory subject, string memory needle) internal pure returns (uint256) { + return LibBytes.indexOf(bytes(subject), bytes(needle), 0); + } + + /// @dev Returns the byte index of the first location of `needle` in `subject`, + /// needleing from right to left, starting from `from`. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found. + function lastIndexOf(string memory subject, string memory needle, uint256 from) internal pure returns (uint256) { + return LibBytes.lastIndexOf(bytes(subject), bytes(needle), from); + } + + /// @dev Returns the byte index of the first location of `needle` in `subject`, + /// needleing from right to left. + /// Returns `NOT_FOUND` (i.e. `type(uint256).max`) if the `needle` is not found. + function lastIndexOf(string memory subject, string memory needle) internal pure returns (uint256) { + return LibBytes.lastIndexOf(bytes(subject), bytes(needle), type(uint256).max); + } + + /// @dev Returns true if `needle` is found in `subject`, false otherwise. + function contains(string memory subject, string memory needle) internal pure returns (bool) { + return LibBytes.contains(bytes(subject), bytes(needle)); + } + + /// @dev Returns whether `subject` starts with `needle`. + function startsWith(string memory subject, string memory needle) internal pure returns (bool) { + return LibBytes.startsWith(bytes(subject), bytes(needle)); + } + + /// @dev Returns whether `subject` ends with `needle`. + function endsWith(string memory subject, string memory needle) internal pure returns (bool) { + return LibBytes.endsWith(bytes(subject), bytes(needle)); + } + + /// @dev Returns `subject` repeated `times`. + function repeat(string memory subject, uint256 times) internal pure returns (string memory) { + return string(LibBytes.repeat(bytes(subject), times)); + } + + /// @dev Returns a copy of `subject` sliced from `start` to `end` (exclusive). + /// `start` and `end` are byte offsets. + function slice(string memory subject, uint256 start, uint256 end) internal pure returns (string memory) { + return string(LibBytes.slice(bytes(subject), start, end)); + } + + /// @dev Returns a copy of `subject` sliced from `start` to the end of the string. + /// `start` is a byte offset. + function slice(string memory subject, uint256 start) internal pure returns (string memory) { + return string(LibBytes.slice(bytes(subject), start, type(uint256).max)); + } + + /// @dev Returns all the indices of `needle` in `subject`. + /// The indices are byte offsets. + function indicesOf(string memory subject, string memory needle) internal pure returns (uint256[] memory) { + return LibBytes.indicesOf(bytes(subject), bytes(needle)); + } + + /// @dev Returns an arrays of strings based on the `delimiter` inside of the `subject` string. + function split(string memory subject, string memory delimiter) internal pure returns (string[] memory result) { + bytes[] memory a = LibBytes.split(bytes(subject), bytes(delimiter)); + /// @solidity memory-safe-assembly + assembly { + result := a + } + } + + /// @dev Returns a concatenated string of `a` and `b`. + /// Cheaper than `string.concat()` and does not de-align the free memory pointer. + function concat(string memory a, string memory b) internal pure returns (string memory) { + return string(LibBytes.concat(bytes(a), bytes(b))); + } + + /// @dev Returns a copy of the string in either lowercase or UPPERCASE. + /// WARNING! This function is only compatible with 7-bit ASCII strings. + function toCase(string memory subject, bool toUpper) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + let n := mload(subject) + if n { + result := mload(0x40) + let o := add(result, 0x20) + let d := sub(subject, result) + let flags := shl(add(70, shl(5, toUpper)), 0x3ffffff) + for { let end := add(o, n) } 1 { } { + let b := byte(0, mload(add(d, o))) + mstore8(o, xor(and(shr(b, flags), 0x20), b)) + o := add(o, 1) + if eq(o, end) { break } + } + mstore(result, n) // Store the length. + mstore(o, 0) // Zeroize the slot after the string. + mstore(0x40, add(o, 0x20)) // Allocate memory. + } + } + } + + /// @dev Returns a string from a small bytes32 string. + /// `s` must be null-terminated, or behavior will be undefined. + function fromSmallString(bytes32 s) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(0x40) + let n := 0 + for { } byte(n, s) { n := add(n, 1) } { } // Scan for '\0'. + mstore(result, n) // Store the length. + let o := add(result, 0x20) + mstore(o, s) // Store the bytes of the string. + mstore(add(o, n), 0) // Zeroize the slot after the string. + mstore(0x40, add(result, 0x40)) // Allocate memory. + } + } + + /// @dev Returns the small string, with all bytes after the first null byte zeroized. + function normalizeSmallString(bytes32 s) internal pure returns (bytes32 result) { + /// @solidity memory-safe-assembly + assembly { + for { } byte(result, s) { result := add(result, 1) } { } // Scan for '\0'. + mstore(0x00, s) + mstore(result, 0x00) + result := mload(0x00) + } + } + + /// @dev Returns the string as a normalized null-terminated small string. + function toSmallString(string memory s) internal pure returns (bytes32 result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(s) + if iszero(lt(result, 33)) { + mstore(0x00, 0xec92f9a3) // `TooBigForSmallString()`. + revert(0x1c, 0x04) + } + result := shl(shl(3, sub(32, result)), mload(add(s, result))) + } + } + + /// @dev Returns a lowercased copy of the string. + /// WARNING! This function is only compatible with 7-bit ASCII strings. + function lower(string memory subject) internal pure returns (string memory result) { + result = toCase(subject, false); + } + + /// @dev Returns an UPPERCASED copy of the string. + /// WARNING! This function is only compatible with 7-bit ASCII strings. + function upper(string memory subject) internal pure returns (string memory result) { + result = toCase(subject, true); + } + + /// @dev Escapes the string to be used within HTML tags. + function escapeHTML(string memory s) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(0x40) + let end := add(s, mload(s)) + let o := add(result, 0x20) + // Store the bytes of the packed offsets and strides into the scratch space. + // `packed = (stride << 5) | offset`. Max offset is 20. Max stride is 6. + mstore(0x1f, 0x900094) + mstore(0x08, 0xc0000000a6ab) + // Store ""&'<>" into the scratch space. + mstore(0x00, shl(64, 0x2671756f743b26616d703b262333393b266c743b2667743b)) + for { } iszero(eq(s, end)) { } { + s := add(s, 1) + let c := and(mload(s), 0xff) + // Not in `["\"","'","&","<",">"]`. + if iszero(and(shl(c, 1), 0x500000c400000000)) { + mstore8(o, c) + o := add(o, 1) + continue + } + let t := shr(248, mload(c)) + mstore(o, mload(and(t, 0x1f))) + o := add(o, shr(5, t)) + } + mstore(o, 0) // Zeroize the slot after the string. + mstore(result, sub(o, add(result, 0x20))) // Store the length. + mstore(0x40, add(o, 0x20)) // Allocate memory. + } + } + + /// @dev Escapes the string to be used within double-quotes in a JSON. + /// If `addDoubleQuotes` is true, the result will be enclosed in double-quotes. + function escapeJSON(string memory s, bool addDoubleQuotes) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(0x40) + let o := add(result, 0x20) + if addDoubleQuotes { + mstore8(o, 34) + o := add(1, o) + } + // Store "\\u0000" in scratch space. + // Store "0123456789abcdef" in scratch space. + // Also, store `{0x08:"b", 0x09:"t", 0x0a:"n", 0x0c:"f", 0x0d:"r"}`. + // into the scratch space. + mstore(0x15, 0x5c75303030303031323334353637383961626364656662746e006672) + // Bitmask for detecting `["\"","\\"]`. + let e := or(shl(0x22, 1), shl(0x5c, 1)) + for { let end := add(s, mload(s)) } iszero(eq(s, end)) { } { + s := add(s, 1) + let c := and(mload(s), 0xff) + if iszero(lt(c, 0x20)) { + if iszero(and(shl(c, 1), e)) { + // Not in `["\"","\\"]`. + mstore8(o, c) + o := add(o, 1) + continue + } + mstore8(o, 0x5c) // "\\". + mstore8(add(o, 1), c) + o := add(o, 2) + continue + } + if iszero(and(shl(c, 1), 0x3700)) { + // Not in `["\b","\t","\n","\f","\d"]`. + mstore8(0x1d, mload(shr(4, c))) // Hex value. + mstore8(0x1e, mload(and(c, 15))) // Hex value. + mstore(o, mload(0x19)) // "\\u00XX". + o := add(o, 6) + continue + } + mstore8(o, 0x5c) // "\\". + mstore8(add(o, 1), mload(add(c, 8))) + o := add(o, 2) + } + if addDoubleQuotes { + mstore8(o, 34) + o := add(1, o) + } + mstore(o, 0) // Zeroize the slot after the string. + mstore(result, sub(o, add(result, 0x20))) // Store the length. + mstore(0x40, add(o, 0x20)) // Allocate memory. + } + } + + /// @dev Escapes the string to be used within double-quotes in a JSON. + function escapeJSON(string memory s) internal pure returns (string memory result) { + result = escapeJSON(s, false); + } + + /// @dev Encodes `s` so that it can be safely used in a URI, + /// just like `encodeURIComponent` in JavaScript. + /// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent + /// See: https://datatracker.ietf.org/doc/html/rfc2396 + /// See: https://datatracker.ietf.org/doc/html/rfc3986 + function encodeURIComponent(string memory s) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(0x40) + // Store "0123456789ABCDEF" in scratch space. + // Uppercased to be consistent with JavaScript's implementation. + mstore(0x0f, 0x30313233343536373839414243444546) + let o := add(result, 0x20) + for { let end := add(s, mload(s)) } iszero(eq(s, end)) { } { + s := add(s, 1) + let c := and(mload(s), 0xff) + // If not in `[0-9A-Z-a-z-_.!~*'()]`. + if iszero(and(1, shr(c, 0x47fffffe87fffffe03ff678200000000))) { + mstore8(o, 0x25) // '%'. + mstore8(add(o, 1), mload(and(shr(4, c), 15))) + mstore8(add(o, 2), mload(and(c, 15))) + o := add(o, 3) + continue + } + mstore8(o, c) + o := add(o, 1) + } + mstore(result, sub(o, add(result, 0x20))) // Store the length. + mstore(o, 0) // Zeroize the slot after the string. + mstore(0x40, add(o, 0x20)) // Allocate memory. + } + } + + /// @dev Returns whether `a` equals `b`. + function eq(string memory a, string memory b) internal pure returns (bool result) { + /// @solidity memory-safe-assembly + assembly { + result := eq(keccak256(add(a, 0x20), mload(a)), keccak256(add(b, 0x20), mload(b))) + } + } + + /// @dev Returns whether `a` equals `b`, where `b` is a null-terminated small string. + function eqs(string memory a, bytes32 b) internal pure returns (bool result) { + /// @solidity memory-safe-assembly + assembly { + // These should be evaluated on compile time, as far as possible. + let m := not(shl(7, div(not(iszero(b)), 255))) // `0x7f7f ...`. + let x := not(or(m, or(b, add(m, and(b, m))))) + let r := shl(7, iszero(iszero(shr(128, x)))) + r := or(r, shl(6, iszero(iszero(shr(64, shr(r, x)))))) + r := or(r, shl(5, lt(0xffffffff, shr(r, x)))) + r := or(r, shl(4, lt(0xffff, shr(r, x)))) + r := or(r, shl(3, lt(0xff, shr(r, x)))) + // forgefmt: disable-next-item + result := gt(eq(mload(a), add(iszero(x), xor(31, shr(3, r)))), + xor(shr(add(8, r), b), shr(add(8, r), mload(add(a, 0x20))))) + } + } + + /// @dev Returns 0 if `a == b`, -1 if `a < b`, +1 if `a > b`. + /// If `a` == b[:a.length]`, and `a.length < b.length`, returns -1. + function cmp(string memory a, string memory b) internal pure returns (int256) { + return LibBytes.cmp(bytes(a), bytes(b)); + } + + /// @dev Packs a single string with its length into a single word. + /// Returns `bytes32(0)` if the length is zero or greater than 31. + function packOne(string memory a) internal pure returns (bytes32 result) { + /// @solidity memory-safe-assembly + assembly { + // We don't need to zero right pad the string, + // since this is our own custom non-standard packing scheme. + result := + mul( + // Load the length and the bytes. + mload(add(a, 0x1f)), + // `length != 0 && length < 32`. Abuses underflow. + // Assumes that the length is valid and within the block gas limit. + lt(sub(mload(a), 1), 0x1f) + ) + } + } + + /// @dev Unpacks a string packed using {packOne}. + /// Returns the empty string if `packed` is `bytes32(0)`. + /// If `packed` is not an output of {packOne}, the output behavior is undefined. + function unpackOne(bytes32 packed) internal pure returns (string memory result) { + /// @solidity memory-safe-assembly + assembly { + result := mload(0x40) // Grab the free memory pointer. + mstore(0x40, add(result, 0x40)) // Allocate 2 words (1 for the length, 1 for the bytes). + mstore(result, 0) // Zeroize the length slot. + mstore(add(result, 0x1f), packed) // Store the length and bytes. + mstore(add(add(result, 0x20), mload(result)), 0) // Right pad with zeroes. + } + } + + /// @dev Packs two strings with their lengths into a single word. + /// Returns `bytes32(0)` if combined length is zero or greater than 30. + function packTwo(string memory a, string memory b) internal pure returns (bytes32 result) { + /// @solidity memory-safe-assembly + assembly { + let aLen := mload(a) + // We don't need to zero right pad the strings, + // since this is our own custom non-standard packing scheme. + result := + mul( + or( // Load the length and the bytes of `a` and `b`. + shl(shl(3, sub(0x1f, aLen)), mload(add(a, aLen))), mload(sub(add(b, 0x1e), aLen))), + // `totalLen != 0 && totalLen < 31`. Abuses underflow. + // Assumes that the lengths are valid and within the block gas limit. + lt(sub(add(aLen, mload(b)), 1), 0x1e) + ) + } + } + + /// @dev Unpacks strings packed using {packTwo}. + /// Returns the empty strings if `packed` is `bytes32(0)`. + /// If `packed` is not an output of {packTwo}, the output behavior is undefined. + function unpackTwo(bytes32 packed) internal pure returns (string memory resultA, string memory resultB) { + /// @solidity memory-safe-assembly + assembly { + resultA := mload(0x40) // Grab the free memory pointer. + resultB := add(resultA, 0x40) + // Allocate 2 words for each string (1 for the length, 1 for the byte). Total 4 words. + mstore(0x40, add(resultB, 0x40)) + // Zeroize the length slots. + mstore(resultA, 0) + mstore(resultB, 0) + // Store the lengths and bytes. + mstore(add(resultA, 0x1f), packed) + mstore(add(resultB, 0x1f), mload(add(add(resultA, 0x20), mload(resultA)))) + // Right pad with zeroes. + mstore(add(add(resultA, 0x20), mload(resultA)), 0) + mstore(add(add(resultB, 0x20), mload(resultB)), 0) + } + } + + /// @dev Directly returns `a` without copying. + function directReturn(string memory a) internal pure { + /// @solidity memory-safe-assembly + assembly { + // Assumes that the string does not start from the scratch space. + let retStart := sub(a, 0x20) + let retUnpaddedSize := add(mload(a), 0x40) + // Right pad with zeroes. Just in case the string is produced + // by a method that doesn't zero right pad. + mstore(add(retStart, retUnpaddedSize), 0) + mstore(retStart, 0x20) // Store the return offset. + // End the transaction, returning the string. + return(retStart, and(not(0x1f), add(0x1f, retUnpaddedSize))) + } + } +} diff --git a/crates/sdk/contracts/test/helpers/MockDeps.sol b/crates/sdk/contracts/test/helpers/MockDeps.sol new file mode 100644 index 0000000000..122965348d --- /dev/null +++ b/crates/sdk/contracts/test/helpers/MockDeps.sol @@ -0,0 +1,12 @@ +interface IOpenVmHalo2Verifier { + function verify(bytes calldata publicValues, bytes calldata proofData, bytes32 appExeCommit, bytes32 appVmCommit) + external + view; +} + +contract Halo2Verifier { + /// Mock verifier always reverts + fallback(bytes calldata) external returns (bytes memory) { + revert("Verification failed"); + } +} diff --git a/crates/sdk/examples/sdk_evm.rs b/crates/sdk/examples/sdk_evm.rs index a6940ca515..5df7af44db 100644 --- a/crates/sdk/examples/sdk_evm.rs +++ b/crates/sdk/examples/sdk_evm.rs @@ -96,7 +96,7 @@ fn main() -> Result<(), Box> { )?; // 9. Generate the SNARK verifier smart contract - let verifier = sdk.generate_snark_verifier_contract(&halo2_params_reader, &agg_pk)?; + let verifier = sdk.generate_halo2_verifier_solidity(&halo2_params_reader, &agg_pk)?; // 10. Generate an EVM proof let proof = sdk.generate_evm_proof( @@ -108,7 +108,7 @@ fn main() -> Result<(), Box> { )?; // 11. Verify the EVM proof - sdk.verify_evm_proof(&verifier, &proof)?; + sdk.verify_evm_halo2_proof(&verifier, &proof)?; // ANCHOR_END: evm_verification Ok(()) diff --git a/crates/sdk/guest/src/main.rs b/crates/sdk/guest/src/main.rs index b8568d74a5..bc6d94cda8 100644 --- a/crates/sdk/guest/src/main.rs +++ b/crates/sdk/guest/src/main.rs @@ -4,7 +4,7 @@ openvm::entry!(main); pub fn main() { - let n = core::hint::black_box(1 << 10); + let n = core::hint::black_box(1 << 3); let mut a: u32 = 0; let mut b: u32 = 1; for _ in 1..n { @@ -15,4 +15,7 @@ pub fn main() { if a == 0 { panic!(); } + + openvm::io::reveal_u32(a, 0); + openvm::io::reveal_u32(b, 1); } diff --git a/crates/sdk/src/fs.rs b/crates/sdk/src/fs.rs index bd4a230547..ea7136f558 100644 --- a/crates/sdk/src/fs.rs +++ b/crates/sdk/src/fs.rs @@ -1,22 +1,24 @@ use std::{ - fs::{create_dir_all, read, write, File}, + fs::{create_dir_all, read, read_to_string, write, File}, path::Path, }; use eyre::Result; use openvm_circuit::arch::{instructions::exe::VmExe, ContinuationVmProof, VmConfig}; use openvm_continuations::verifier::root::types::RootVmVerifierInput; -use openvm_native_recursion::halo2::wrapper::{EvmVerifier, EvmVerifierByteCode}; +use openvm_native_recursion::halo2::wrapper::EvmVerifierByteCode; use serde::{de::DeserializeOwned, Serialize}; use crate::{ codec::{Decode, Encode}, keygen::{AggProvingKey, AppProvingKey, AppVerifyingKey}, - types::EvmProof, + types::{EvmHalo2Verifier, EvmProof}, F, SC, }; -pub const EVM_VERIFIER_SOL_FILENAME: &str = "verifier.sol"; +pub const EVM_HALO2_VERIFIER_INTERFACE_NAME: &str = "IOpenVmHalo2Verifier.sol"; +pub const EVM_HALO2_VERIFIER_PARENT_NAME: &str = "Halo2Verifier.sol"; +pub const EVM_HALO2_VERIFIER_BASE_NAME: &str = "OpenVmHalo2Verifier.sol"; pub const EVM_VERIFIER_ARTIFACT_FILENAME: &str = "verifier.bytecode.json"; pub fn read_exe_from_file>(path: P) -> Result> { @@ -90,22 +92,68 @@ pub fn write_evm_proof_to_file>(proof: EvmProof, path: P) -> Resu Ok(()) } -pub fn read_evm_verifier_from_folder>(folder: P) -> Result { - let sol_code_path = folder.as_ref().join(EVM_VERIFIER_SOL_FILENAME); - let sol_code = std::fs::read_to_string(sol_code_path)?; +pub fn read_evm_halo2_verifier_from_folder>(folder: P) -> Result { + let halo2_verifier_code_path = folder.as_ref().join(EVM_HALO2_VERIFIER_PARENT_NAME); + let openvm_verifier_code_path = folder.as_ref().join(EVM_HALO2_VERIFIER_BASE_NAME); + let interface_path = folder + .as_ref() + .join("interfaces") + .join(EVM_HALO2_VERIFIER_INTERFACE_NAME); + let halo2_verifier_code = read_to_string(halo2_verifier_code_path)?; + let openvm_verifier_code = read_to_string(openvm_verifier_code_path)?; + let interface = read_to_string(interface_path)?; + let artifact_path = folder.as_ref().join(EVM_VERIFIER_ARTIFACT_FILENAME); let artifact: EvmVerifierByteCode = serde_json::from_reader(File::open(artifact_path)?)?; - Ok(EvmVerifier { sol_code, artifact }) -} -pub fn write_evm_verifier_to_folder>( - verifier: EvmVerifier, + Ok(EvmHalo2Verifier { + halo2_verifier_code, + openvm_verifier_code, + openvm_verifier_interface: interface, + artifact, + }) +} + +/// Writes three Solidity contracts into the following folder structure: +/// +/// ```text +/// halo2/ +/// ├── interfaces/ +/// │ └── IOpenVmHalo2Verifier.sol +/// ├── OpenVmHalo2Verifier.sol +/// └── Halo2Verifier.sol +/// ``` +/// +/// If the relevant directories do not exist, they will be created. +pub fn write_evm_halo2_verifier_to_folder>( + verifier: EvmHalo2Verifier, folder: P, ) -> Result<()> { - let sol_code_path = folder.as_ref().join(EVM_VERIFIER_SOL_FILENAME); - std::fs::write(sol_code_path, verifier.sol_code)?; - let artifact_path = folder.as_ref().join(EVM_VERIFIER_ARTIFACT_FILENAME); + let folder = folder.as_ref(); + if !folder.exists() { + create_dir_all(folder)?; // Make sure directories exist + } + + let halo2_verifier_code_path = folder.join(EVM_HALO2_VERIFIER_PARENT_NAME); + let openvm_verifier_code_path = folder.join(EVM_HALO2_VERIFIER_BASE_NAME); + let interface_path = folder + .join("interfaces") + .join(EVM_HALO2_VERIFIER_INTERFACE_NAME); + + if let Some(parent) = interface_path.parent() { + create_dir_all(parent)?; + } + + write(halo2_verifier_code_path, verifier.halo2_verifier_code) + .expect("Failed to write halo2 verifier code"); + write(openvm_verifier_code_path, verifier.openvm_verifier_code) + .expect("Failed to write openvm halo2 verifier code"); + write(interface_path, verifier.openvm_verifier_interface) + .expect("Failed to write openvm halo2 verifier interface"); + + let artifact_path = folder.join(EVM_VERIFIER_ARTIFACT_FILENAME); serde_json::to_writer(File::create(artifact_path)?, &verifier.artifact)?; + Ok(()) } @@ -118,7 +166,7 @@ pub fn write_object_to_file>(path: P, data: T) -> R } pub(crate) fn read_from_file_bitcode>(path: P) -> Result { - let data = std::fs::read(path)?; + let data = read(path)?; let ret = bitcode::deserialize(&data)?; Ok(ret) } diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs index 9d3f62a32e..ee3d5a3d9c 100644 --- a/crates/sdk/src/lib.rs +++ b/crates/sdk/src/lib.rs @@ -1,8 +1,17 @@ -use std::{fs::read, marker::PhantomData, path::Path, sync::Arc}; +use std::{ + env, + fs::{create_dir_all, read, write}, + marker::PhantomData, + path::Path, + process::Command, + sync::Arc, +}; +use alloy_primitives::{Bytes, FixedBytes}; +use alloy_sol_types::{sol, SolCall, SolValue}; use commit::commit_app_exe; use config::AppConfig; -use eyre::Result; +use eyre::{Context, Result}; use keygen::{AppProvingKey, AppVerifyingKey}; use openvm_build::{ build_guest_package, find_unique_executable, get_package, GuestOptions, TargetFilter, @@ -23,11 +32,7 @@ pub use openvm_continuations::{ static_verifier::{DefaultStaticVerifierPvHandler, StaticVerifierPvHandler}, RootSC, C, F, SC, }; -use openvm_native_recursion::halo2::{ - utils::Halo2ParamsReader, - wrapper::{EvmVerifier, Halo2WrapperProvingKey}, - RawEvmProof, -}; +use openvm_native_recursion::halo2::{utils::Halo2ParamsReader, wrapper::EvmVerifierByteCode}; use openvm_stark_backend::proof::Proof; use openvm_stark_sdk::{ config::{baby_bear_poseidon2::BabyBearPoseidon2Engine, FriParameters}, @@ -40,11 +45,21 @@ use openvm_transpiler::{ transpiler::{Transpiler, TranspilerError}, FromElf, }; +use snark_verifier_sdk::{ + evm::gen_evm_verifier_sol_code, halo2::aggregation::AggregationCircuit, + snark_verifier::halo2_base::halo2_proofs::poly::commitment::Params, SHPLONK, +}; +use tempfile::tempdir; use crate::{ config::AggConfig, + fs::{ + EVM_HALO2_VERIFIER_BASE_NAME, EVM_HALO2_VERIFIER_INTERFACE_NAME, + EVM_HALO2_VERIFIER_PARENT_NAME, + }, keygen::{AggProvingKey, AggStarkProvingKey}, prover::{AppProver, ContinuationProver, StarkProver}, + types::{EvmHalo2Verifier, EvmProof, NUM_BN254_ACCUMULATORS}, }; pub mod codec; @@ -56,13 +71,21 @@ pub mod prover; mod stdin; pub use stdin::*; -use crate::types::EvmProof; - pub mod fs; pub mod types; pub type NonRootCommittedExe = VmCommittedExe; +pub const EVM_HALO2_VERIFIER_INTERFACE: &str = + include_str!("../contracts/src/IOpenVmHalo2Verifier.sol"); +pub const EVM_HALO2_VERIFIER_TEMPLATE: &str = + include_str!("../contracts/template/OpenVmHalo2Verifier.sol"); + +sol! { + IOpenVmHalo2Verifier, + concat!(env!("CARGO_MANIFEST_DIR"), "/contracts/abi/IOpenVmHalo2Verifier.json"), +} + /// The payload of a verified guest VM execution with user public values extracted and /// verified. pub struct VerifiedContinuationVmPayload { @@ -263,24 +286,208 @@ impl> GenericSdk { Ok(proof) } - pub fn generate_snark_verifier_contract( + pub fn generate_halo2_verifier_solidity( &self, reader: &impl Halo2ParamsReader, agg_pk: &AggProvingKey, - ) -> Result { + ) -> Result { let params = reader.read_params(agg_pk.halo2_pk.wrapper.pinning.metadata.config_params.k); - let evm_verifier = agg_pk.halo2_pk.wrapper.generate_evm_verifier(¶ms); + let pinning = &agg_pk.halo2_pk.wrapper.pinning; + + assert_eq!( + pinning.metadata.config_params.k as u32, + params.k(), + "Provided params don't match circuit config" + ); + + let halo2_verifier_code = gen_evm_verifier_sol_code::( + ¶ms, + pinning.pk.get_vk(), + pinning.metadata.num_pvs.clone(), + ); + + let wrapper_pvs = agg_pk.halo2_pk.wrapper.pinning.metadata.num_pvs.clone(); + let pvs_length = match wrapper_pvs.first() { + // We subtract 14 to exclude the KZG accumulators and the app exe + // and vm commits. + Some(v) => v + .checked_sub(14) + .expect("Unexpected number of static verifier wrapper public values"), + _ => panic!("Unexpected amount of instance columns in the static verifier wrapper"), + }; + + assert!( + pvs_length <= 8192, + "OpenVM Halo2 verifier contract does not support more than 8192 public values" + ); + + // Fill out the public values length and OpenVM version in the template + let openvm_verifier_code = EVM_HALO2_VERIFIER_TEMPLATE + .replace("{PUBLIC_VALUES_LENGTH}", &pvs_length.to_string()) + .replace("{OPENVM_VERSION}", env!("CARGO_PKG_VERSION")); + + // Create temp dir + let temp_dir = tempdir().wrap_err("Failed to create temp dir")?; + let temp_path = temp_dir.path(); + + // Make interfaces dir + let interfaces_path = temp_path.join("interfaces"); + create_dir_all(&interfaces_path)?; + + // Write the files to the temp dir. This is only for compilation + // purposes. + write( + interfaces_path.join(EVM_HALO2_VERIFIER_INTERFACE_NAME), + EVM_HALO2_VERIFIER_INTERFACE, + )?; + write( + temp_path.join(EVM_HALO2_VERIFIER_PARENT_NAME), + &halo2_verifier_code, + )?; + write( + temp_path.join(EVM_HALO2_VERIFIER_BASE_NAME), + &openvm_verifier_code, + )?; + + // Run solc from the temp dir + let output = Command::new("solc") + .current_dir(temp_path) + .arg("OpenVmHalo2Verifier.sol") + .arg("--no-optimize-yul") + .arg("--bin") + .arg("--optimize") + .arg("--optimize-runs") + .arg("100000") + .output()?; + + if !output.status.success() { + eyre::bail!( + "solc exited with status {}: {}", + output.status, + String::from_utf8_lossy(&output.stderr) + ); + } + + let bytecode = extract_binary( + &output.stdout, + "OpenVmHalo2Verifier.sol:OpenVmHalo2Verifier", + ); + + let evm_verifier = EvmHalo2Verifier { + halo2_verifier_code, + openvm_verifier_code, + openvm_verifier_interface: EVM_HALO2_VERIFIER_INTERFACE.to_string(), + artifact: EvmVerifierByteCode { + sol_compiler_version: "0.8.19".to_string(), + sol_compiler_options: "--no-optimize-yul --bin --optimize --optimize-runs 100000" + .to_string(), + bytecode, + }, + }; Ok(evm_verifier) } - pub fn verify_evm_proof( + /// Uses the `verify(..)` interface of the `OpenVmHalo2Verifier` contract. + pub fn verify_evm_halo2_proof( &self, - evm_verifier: &EvmVerifier, + openvm_verifier: &EvmHalo2Verifier, evm_proof: &EvmProof, ) -> Result { - let evm_proof: RawEvmProof = evm_proof.clone().try_into()?; - let gas_cost = Halo2WrapperProvingKey::evm_verify(evm_verifier, &evm_proof) - .map_err(|reason| eyre::eyre!("Sdk::verify_evm_proof: {reason:?}"))?; + let EvmProof { + accumulators, + proof, + user_public_values, + exe_commit, + leaf_commit, + } = evm_proof; + let mut exe_commit = *exe_commit; + let mut leaf_commit = *leaf_commit; + exe_commit.reverse(); + leaf_commit.reverse(); + + assert_eq!(accumulators.len(), NUM_BN254_ACCUMULATORS * 32); + let mut evm_accumulators: Vec = Vec::with_capacity(accumulators.len()); + accumulators + .chunks(32) + .for_each(|chunk| evm_accumulators.extend(chunk.iter().rev().cloned())); + + let mut proof_data = evm_accumulators; + proof_data.extend(proof); + + assert!( + user_public_values.len() % 32 == 0, + "User public values length must be a multiple of 32" + ); + + // Take the first byte of each 32 byte chunk, and pack them together + // into one payload. + let user_public_values: Bytes = + user_public_values + .chunks(32) + .fold(Vec::::new().into(), |acc: Bytes, chunk| { + // We only care about the first byte, everything else should be 0-bytes + (acc, FixedBytes::<1>::from(*chunk.first().unwrap())) + .abi_encode_packed() + .into() + }); + + let calldata = IOpenVmHalo2Verifier::verifyCall { + publicValues: user_public_values.clone(), + proofData: proof_data.into(), + appExeCommit: exe_commit.into(), + appVmCommit: leaf_commit.into(), + } + .abi_encode(); + let deployment_code = openvm_verifier.artifact.bytecode.clone(); + + let gas_cost = snark_verifier::loader::evm::deploy_and_call(deployment_code, calldata) + .map_err(|reason| eyre::eyre!("Sdk::verify_openvm_evm_proof: {reason:?}"))?; + Ok(gas_cost) } } + +/// We will split the output by whitespace and look for the following +/// sequence: +/// [ +/// ... +/// "=======", +/// "OpenVmHalo2Verifier.sol:OpenVmHalo2Verifier", +/// "=======", +/// "Binary:" +/// "[compiled bytecode]" +/// ... +/// ] +/// +/// Once we find "OpenVmHalo2Verifier.sol:OpenVmHalo2Verifier," we can skip +/// to the appropriate offset to get the compiled bytecode. +fn extract_binary(output: &[u8], contract_name: &str) -> Vec { + let split = split_by_ascii_whitespace(output); + let contract_name_bytes = contract_name.as_bytes(); + + for i in 0..split.len().saturating_sub(3) { + if split[i] == contract_name_bytes { + return hex::decode(split[i + 3]).expect("Invalid hex in Binary"); + } + } + + panic!("Contract '{}' not found", contract_name); +} + +fn split_by_ascii_whitespace(bytes: &[u8]) -> Vec<&[u8]> { + let mut split = Vec::new(); + let mut start = None; + for (idx, byte) in bytes.iter().enumerate() { + if byte.is_ascii_whitespace() { + if let Some(start) = start.take() { + split.push(&bytes[start..idx]); + } + } else if start.is_none() { + start = Some(idx); + } + } + if let Some(last) = start { + split.push(&bytes[last..]); + } + split +} diff --git a/crates/sdk/src/types.rs b/crates/sdk/src/types.rs index f46302d106..b8eb124d85 100644 --- a/crates/sdk/src/types.rs +++ b/crates/sdk/src/types.rs @@ -1,5 +1,5 @@ use itertools::Itertools; -use openvm_native_recursion::halo2::{Fr, RawEvmProof}; +use openvm_native_recursion::halo2::{wrapper::EvmVerifierByteCode, Fr, RawEvmProof}; use serde::{Deserialize, Serialize}; use serde_with::serde_as; use thiserror::Error; @@ -7,12 +7,20 @@ use thiserror::Error; /// Number of bytes in a Bn254Fr. const BN254_BYTES: usize = 32; /// Number of Bn254Fr in `accumulators` field. -const NUM_BN254_ACCUMULATORS: usize = 12; +pub const NUM_BN254_ACCUMULATORS: usize = 12; /// Number of Bn254Fr in `proof` field for a circuit with only 1 advice column. const NUM_BN254_PROOF: usize = 43; +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct EvmHalo2Verifier { + pub halo2_verifier_code: String, + pub openvm_verifier_code: String, + pub openvm_verifier_interface: String, + pub artifact: EvmVerifierByteCode, +} + #[serde_as] -#[derive(Clone, Deserialize, Serialize)] +#[derive(Clone, Debug, Deserialize, Serialize)] pub struct EvmProof { #[serde_as(as = "serde_with::hex::Hex")] /// Bn254Fr public values for accumulators in flatten little-endian bytes. Length is `NUM_BN254_ACCUMULATORS * BN254_BYTES`. diff --git a/crates/sdk/tests/integration_test.rs b/crates/sdk/tests/integration_test.rs index 4d768b2aa1..7525c2f906 100644 --- a/crates/sdk/tests/integration_test.rs +++ b/crates/sdk/tests/integration_test.rs @@ -1,5 +1,6 @@ use std::{borrow::Borrow, path::PathBuf, sync::Arc}; +use eyre::Result; use openvm_build::GuestOptions; use openvm_circuit::{ arch::{ @@ -20,15 +21,24 @@ use openvm_continuations::{ use openvm_native_circuit::{Native, NativeConfig}; use openvm_native_compiler::{conversion::CompilerOptions, prelude::*}; use openvm_native_recursion::{ - config::outer::OuterConfig, halo2::utils::CacheHalo2ParamsReader, types::InnerConfig, + config::outer::OuterConfig, + halo2::{ + utils::{CacheHalo2ParamsReader, Halo2ParamsReader}, + wrapper::Halo2WrapperProvingKey, + RawEvmProof, + }, + types::InnerConfig, vars::StarkProofVariable, }; -use openvm_rv32im_transpiler::{Rv32ITranspilerExtension, Rv32MTranspilerExtension}; +use openvm_rv32im_transpiler::{ + Rv32ITranspilerExtension, Rv32IoTranspilerExtension, Rv32MTranspilerExtension, +}; use openvm_sdk::{ codec::{Decode, Encode}, commit::AppExecutionCommit, - config::{AggConfig, AggStarkConfig, AppConfig, Halo2Config, SdkVmConfig}, + config::{AggConfig, AggStarkConfig, AppConfig, Halo2Config, SdkSystemConfig, SdkVmConfig}, keygen::AppProvingKey, + types::{EvmHalo2Verifier, EvmProof}, DefaultStaticVerifierPvHandler, Sdk, StdIn, }; use openvm_stark_backend::{keygen::types::LinearConstraint, p3_matrix::Matrix}; @@ -43,6 +53,7 @@ use openvm_stark_sdk::{ p3_bn254_fr::Bn254Fr, }; use openvm_transpiler::transpiler::Transpiler; +use snark_verifier_sdk::evm::evm_verify; type SC = BabyBearPoseidon2Config; type C = InnerConfig; @@ -53,6 +64,23 @@ const LEAF_LOG_BLOWUP: usize = 2; const INTERNAL_LOG_BLOWUP: usize = 3; const ROOT_LOG_BLOWUP: usize = 4; +/// `OpenVmHalo2Verifier` wraps the `snark-verifer` contract, meaning that +/// the default `fallback` interface can still be used. This function uses +/// the fallback interface as opposed to the `verify(..)` interface. +fn verify_evm_halo2_proof_with_fallback( + openvm_verifier: &EvmHalo2Verifier, + evm_proof: &EvmProof, +) -> Result { + let evm_proof: RawEvmProof = evm_proof.clone().try_into()?; + let gas_cost = evm_verify( + openvm_verifier.artifact.bytecode.clone(), + vec![evm_proof.instances.clone()], + evm_proof.proof.clone(), + ) + .map_err(|reason| eyre::eyre!("Sdk::verify_openvm_evm_proof: {reason:?}"))?; + Ok(gas_cost) +} + fn run_leaf_verifier>( leaf_vm: &SingleSegmentVmExecutor, leaf_committed_exe: Arc>, @@ -340,9 +368,12 @@ fn test_static_verifier_custom_pv_handler() { // Generate verifier contract println!("generate verifier contract"); - let evm_verifier = sdk - .generate_snark_verifier_contract(¶ms_reader, &agg_pk) - .unwrap(); + let params = + params_reader.read_params(agg_pk.halo2_pk.wrapper.pinning.metadata.config_params.k); + let evm_verifier = agg_pk + .halo2_pk + .wrapper + .generate_fallback_evm_verifier(¶ms); // Generate and verify proof println!("generate and verify proof"); @@ -355,15 +386,51 @@ fn test_static_verifier_custom_pv_handler() { StdIn::default(), ) .unwrap(); - assert!(sdk.verify_evm_proof(&evm_verifier, &evm_proof).is_ok()); + + let evm_proof: RawEvmProof = evm_proof + .clone() + .try_into() + .expect("failed to convert evm proof"); + Halo2WrapperProvingKey::evm_verify(&evm_verifier, &evm_proof).unwrap(); } #[test] -fn test_e2e_proof_generation_and_verification() { - let app_log_blowup = 1; - let app_config = small_test_app_config(app_log_blowup); +fn test_e2e_proof_generation_and_verification_with_pvs() { + let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf(); + pkg_dir.push("guest"); + + let vm_config = SdkVmConfig::builder() + .system(SdkSystemConfig { + config: SystemConfig::default() + .with_max_segment_len(200) + .with_continuations() + .with_public_values(NUM_PUB_VALUES), + }) + .rv32i(Default::default()) + .rv32m(Default::default()) + .io(Default::default()) + .native(Default::default()) + .build(); + let sdk = Sdk::new(); + let elf = sdk + .build(Default::default(), pkg_dir, &Default::default()) + .unwrap(); + let exe = sdk.transpile(elf, vm_config.transpiler()).unwrap(); + + let app_log_blowup = 1; + let app_fri_params = FriParameters::new_for_testing(app_log_blowup); + let leaf_fri_params = FriParameters::new_for_testing(LEAF_LOG_BLOWUP); + let mut app_config = + AppConfig::new_with_leaf_fri_params(app_fri_params, vm_config, leaf_fri_params); + app_config.compiler_options.enable_cycle_tracker = true; + + let app_committed_exe = sdk + .commit_app_exe(app_fri_params, exe) + .expect("failed to commit exe"); + let app_pk = sdk.app_keygen(app_config).unwrap(); + let params_reader = CacheHalo2ParamsReader::new_with_default_params_dir(); let agg_pk = sdk .agg_keygen( @@ -372,20 +439,24 @@ fn test_e2e_proof_generation_and_verification() { &DefaultStaticVerifierPvHandler, ) .unwrap(); + let evm_verifier = sdk - .generate_snark_verifier_contract(¶ms_reader, &agg_pk) + .generate_halo2_verifier_solidity(¶ms_reader, &agg_pk) .unwrap(); let evm_proof = sdk .generate_evm_proof( ¶ms_reader, Arc::new(app_pk), - app_committed_exe_for_test(app_log_blowup), + app_committed_exe, agg_pk, StdIn::default(), ) .unwrap(); - assert!(sdk.verify_evm_proof(&evm_verifier, &evm_proof).is_ok()); + + verify_evm_halo2_proof_with_fallback(&evm_verifier, &evm_proof).unwrap(); + sdk.verify_evm_halo2_proof(&evm_verifier, &evm_proof) + .unwrap(); } #[test] @@ -407,7 +478,8 @@ fn test_sdk_guest_build_and_transpile() { assert_eq!(one.instructions, two.instructions); let transpiler = Transpiler::::default() .with_extension(Rv32ITranspilerExtension) - .with_extension(Rv32MTranspilerExtension); + .with_extension(Rv32MTranspilerExtension) + .with_extension(Rv32IoTranspilerExtension); let _exe = sdk.transpile(one, transpiler).unwrap(); } @@ -418,10 +490,18 @@ fn test_inner_proof_codec_roundtrip() -> eyre::Result<()> { let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf(); pkg_dir.push("guest"); let elf = sdk.build(Default::default(), pkg_dir, &Default::default())?; + let vm_config = SdkVmConfig::builder() - .system(Default::default()) + .system(SdkSystemConfig { + config: SystemConfig::default() + .with_max_segment_len(200) + .with_continuations() + .with_public_values(NUM_PUB_VALUES), + }) .rv32i(Default::default()) .rv32m(Default::default()) + .io(Default::default()) + .native(Default::default()) .build(); assert!(vm_config.system.config.continuation_enabled); let exe = sdk.transpile(elf, vm_config.transpiler())?; diff --git a/extensions/native/recursion/src/halo2/wrapper.rs b/extensions/native/recursion/src/halo2/wrapper.rs index e890430c7c..a29c154ce5 100644 --- a/extensions/native/recursion/src/halo2/wrapper.rs +++ b/extensions/native/recursion/src/halo2/wrapper.rs @@ -27,8 +27,10 @@ use crate::halo2::{ Halo2Params, Halo2ProvingMetadata, Halo2ProvingPinning, RawEvmProof, }; +/// `FallbackEvmVerifier` is for the raw verifier contract outputted by +/// `snark-verifier`. #[derive(Debug, Clone, Serialize, Deserialize)] -pub struct EvmVerifier { +pub struct FallbackEvmVerifier { pub sol_code: String, pub artifact: EvmVerifierByteCode, } @@ -86,7 +88,10 @@ impl Halo2WrapperProvingKey { } } /// A helper function for testing to verify the proof of this circuit with evm verifier. - pub fn evm_verify(evm_verifier: &EvmVerifier, evm_proof: &RawEvmProof) -> Result { + pub fn evm_verify( + evm_verifier: &FallbackEvmVerifier, + evm_proof: &RawEvmProof, + ) -> Result { evm_verify( evm_verifier.artifact.bytecode.clone(), vec![evm_proof.instances.clone()], @@ -94,7 +99,7 @@ impl Halo2WrapperProvingKey { ) } /// Return deployment code for EVM verifier which can verify the snark of this circuit. - pub fn generate_evm_verifier(&self, params: &Halo2Params) -> EvmVerifier { + pub fn generate_fallback_evm_verifier(&self, params: &Halo2Params) -> FallbackEvmVerifier { assert_eq!( self.pinning.metadata.config_params.k as u32, params.k(), @@ -209,11 +214,11 @@ fn gen_evm_verifier( params: &Halo2Params, vk: &VerifyingKey, num_instance: Vec, -) -> EvmVerifier { +) -> FallbackEvmVerifier { let sol_code = gen_evm_verifier_sol_code::(params, vk, num_instance); let byte_code = compile_solidity(&sol_code); - EvmVerifier { + FallbackEvmVerifier { sol_code, artifact: EvmVerifierByteCode { sol_compiler_version: "0.8.19".to_string(), From 7fc3f10681c88f59b508ee42a42228f85e13a62a Mon Sep 17 00:00:00 2001 From: Lun-Kai Hsu Date: Mon, 7 Apr 2025 13:19:38 -0700 Subject: [PATCH 14/25] chore: cargo openvm build also outputs committed exe (#1560) --- Cargo.lock | 1 + crates/cli/Cargo.toml | 1 + crates/cli/src/commands/build.rs | 25 +++++++++++++++++++++++-- crates/cli/src/default.rs | 3 ++- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 150eb75304..a51778f9da 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1163,6 +1163,7 @@ version = "1.0.0" dependencies = [ "aws-config", "aws-sdk-s3", + "bitcode", "clap", "eyre", "hex", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 03959bd4e0..1b189949da 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -36,6 +36,7 @@ hex = "0.4.3" target-lexicon = "0.12.15" tempfile = "3.10.1" toml = { workspace = true } +bitcode.workspace = true [features] default = [] diff --git a/crates/cli/src/commands/build.rs b/crates/cli/src/commands/build.rs index e55b200384..6a2e0f2ba5 100644 --- a/crates/cli/src/commands/build.rs +++ b/crates/cli/src/commands/build.rs @@ -1,6 +1,7 @@ use std::{ fs::{create_dir_all, read, write}, path::PathBuf, + sync::Arc, }; use clap::Parser; @@ -18,7 +19,7 @@ use openvm_transpiler::{elf::Elf, openvm_platform::memory::MEM_SIZE}; use crate::{ default::{ DEFAULT_APP_CONFIG_PATH, DEFAULT_APP_EXE_PATH, DEFAULT_COMMITTED_APP_EXE_PATH, - DEFAULT_MANIFEST_DIR, + DEFAULT_EXE_COMMIT_PATH, DEFAULT_MANIFEST_DIR, }, util::read_config_toml_or_default, }; @@ -83,6 +84,13 @@ pub struct BuildArgs { )] pub committed_exe_output: PathBuf, + #[arg( + long, + default_value = DEFAULT_EXE_COMMIT_PATH, + help = "Output path for the exe commit (bn254 commit of committed program)" + )] + pub exe_commit_output: PathBuf, + #[arg(long, default_value = "release", help = "Build profile")] pub profile: String, } @@ -146,12 +154,24 @@ pub(crate) fn build(build_args: &BuildArgs) -> Result> { let exe = Sdk::new().transpile(elf, transpiler)?; let committed_exe = commit_app_exe(app_config.app_fri_params.fri_params, exe.clone()); write_exe_to_file(exe, output_path)?; + + if let Some(parent) = build_args.exe_commit_output.parent() { + create_dir_all(parent)?; + } + write( + &build_args.exe_commit_output, + committed_exe_as_bn254(&committed_exe).value.to_bytes(), + )?; if let Some(parent) = build_args.committed_exe_output.parent() { create_dir_all(parent)?; } + let committed_exe = match Arc::try_unwrap(committed_exe) { + Ok(exe) => exe, + Err(_) => return Err(eyre::eyre!("Failed to unwrap committed_exe Arc")), + }; write( &build_args.committed_exe_output, - committed_exe_as_bn254(&committed_exe).value.to_bytes(), + bitcode::serialize(&committed_exe)?, )?; println!( @@ -192,6 +212,7 @@ mod tests { config: PathBuf::from(DEFAULT_APP_CONFIG_PATH), exe_output: PathBuf::from(DEFAULT_APP_EXE_PATH), committed_exe_output: PathBuf::from(DEFAULT_COMMITTED_APP_EXE_PATH), + exe_commit_output: PathBuf::from(DEFAULT_EXE_COMMIT_PATH), profile: "dev".to_string(), target_dir: Some(target_dir.to_path_buf()), }; diff --git a/crates/cli/src/default.rs b/crates/cli/src/default.rs index 0292a24fb0..3d1e9156ed 100644 --- a/crates/cli/src/default.rs +++ b/crates/cli/src/default.rs @@ -10,7 +10,8 @@ pub const DEFAULT_EVM_HALO2_VERIFIER_PATH: &str = concat!(env!("HOME"), "/.openv pub const DEFAULT_APP_CONFIG_PATH: &str = "./openvm.toml"; pub const DEFAULT_APP_EXE_PATH: &str = "./openvm/app.vmexe"; -pub const DEFAULT_COMMITTED_APP_EXE_PATH: &str = "./openvm/committed_app_exe.bytes"; +pub const DEFAULT_EXE_COMMIT_PATH: &str = "./openvm/exe_commit.bytes"; +pub const DEFAULT_COMMITTED_APP_EXE_PATH: &str = "./openvm/committed_app_exe.bc"; pub const DEFAULT_APP_PK_PATH: &str = "./openvm/app.pk"; pub const DEFAULT_APP_VK_PATH: &str = "./openvm/app.vk"; pub const DEFAULT_APP_PROOF_PATH: &str = "./openvm/app.proof"; From fd7c864368770e36908888b9031a0405bff16952 Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Tue, 8 Apr 2025 22:11:58 -0400 Subject: [PATCH 15/25] chore(ci): enforce conventional commits PR title (#1564) --- .github/workflows/lints.yml | 2 +- .github/workflows/pr-title.yml | 83 ++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/pr-title.yml diff --git a/.github/workflows/lints.yml b/.github/workflows/lints.yml index 9fa9dec714..6d75c6b1b5 100644 --- a/.github/workflows/lints.yml +++ b/.github/workflows/lints.yml @@ -15,7 +15,7 @@ jobs: name: Lint runs-on: - runs-on=${{ github.run_id }} - - runner=8cpu-linux-x64 + - runner=64cpu-linux-x64 - extras=s3-cache steps: - uses: runs-on/action@v1 diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml new file mode 100644 index 0000000000..4b54db45fe --- /dev/null +++ b/.github/workflows/pr-title.yml @@ -0,0 +1,83 @@ +# Copied from https://github.com/paradigmxyz/reth/blob/a5755f72eb54d2c88d6f0b5778413144451e1724/.github/workflows/pr-title.yml +name: Pull Request + +on: + pull_request: + types: + - opened + - reopened + - edited + - synchronize + +permissions: + pull-requests: read + contents: read + +jobs: + conventional-title: + name: Validate PR title is Conventional Commit + runs-on: + - runs-on=${{ github.run_id }} + - runner=8cpu-linux-x64 + permissions: + pull-requests: write + steps: + - name: Check title + id: lint_pr_title + uses: amannn/action-semantic-pull-request@v5 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + types: | + fix + feat + chore + test + perf + refactor + docs + ci + continue-on-error: true + - name: Add PR Comment for Invalid Title + if: steps.lint_pr_title.outcome == 'failure' + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: pr-title-lint-error + message: | + Your PR title doesn't follow the Conventional Commit guidelines. + + **Example of valid titles:** + - `feat: add new user login` + - `fix: correct button size` + - `docs: update README` + + **Usage:** + - `feat`: Introduces a new feature + - `fix`: Patches a bug + - `chore`: General maintenance tasks or updates + - `test`: Adding new tests or modifying existing tests + - `perf`: Performance improvements + - `refactor`: Changes to improve code structure + - `docs`: Documentation updates + - `ci`: Changes to CI/CD configurations + + **Breaking Changes** + + Breaking changes are noted by using an exclamation mark. For example: + - `feat!: changed the API` + - `chore(node)!: Removed unused public function` + + **Help** + + For more information, follow the guidelines here: https://www.conventionalcommits.org/en/v1.0.0/ + + - name: Remove Comment for Valid Title + if: steps.lint_pr_title.outcome == 'success' + uses: marocchino/sticky-pull-request-comment@v2 + with: + header: pr-title-lint-error + delete: true + + - name: Fail workflow if title invalid + if: steps.lint_pr_title.outcome == 'failure' + run: exit 1 From a10f050d60bbca51c05ef2f0c61bf4182d637b3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Apr 2025 19:13:24 -0700 Subject: [PATCH 16/25] chore(deps): bump tokio from 1.43.0 to 1.43.1 (#1562) Bumps [tokio](https://github.com/tokio-rs/tokio) from 1.43.0 to 1.43.1.
    Commits
    • a7b658c chore: prepare Tokio v1.43.1 release
    • c1c8d10 Merge remote-tracking branch 'origin/tokio-1.38.x' into forward-port-1.38.x
    • aa303bc chore: prepare Tokio v1.38.2 release
    • 7b6ccb5 chore: backport CI fixes
    • 4b174ce sync: fix cloning value when receiving from broadcast channel
    • See full diff in compare view

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=tokio&package-manager=cargo&previous-version=1.43.0&new-version=1.43.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/openvm-org/openvm/network/alerts).
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- benchmarks/prove/Cargo.toml | 2 +- crates/cli/Cargo.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a51778f9da..a6b4e20d46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6278,9 +6278,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.43.0" +version = "1.43.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d61fa4ffa3de412bfea335c6ecff681de2b609ba3c77ef3e00e521813a9ed9e" +checksum = "492a604e2fd7f814268a378409e6c92b5525d747d10db9a229723f55a417958c" dependencies = [ "backtrace", "bytes", diff --git a/benchmarks/prove/Cargo.toml b/benchmarks/prove/Cargo.toml index 101fe8f966..b71e0f3fec 100644 --- a/benchmarks/prove/Cargo.toml +++ b/benchmarks/prove/Cargo.toml @@ -30,7 +30,7 @@ openvm-native-recursion = { workspace = true, features = ["test-utils"] } clap = { version = "4.5.9", features = ["derive", "env"] } eyre.workspace = true -tokio = { version = "1.41.1", features = ["rt", "rt-multi-thread", "macros"] } +tokio = { version = "1.43.1", features = ["rt", "rt-multi-thread", "macros"] } rand_chacha = { version = "0.3", default-features = false } k256 = { workspace = true, features = ["ecdsa"] } tiny-keccak.workspace = true diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 1b189949da..687dad46fd 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -26,7 +26,7 @@ openvm-stark-backend.workspace = true aws-sdk-s3 = "1.78" aws-config = "1.5" -tokio = { version = "1.41.1", features = ["rt", "rt-multi-thread", "macros"] } +tokio = { version = "1.43.1", features = ["rt", "rt-multi-thread", "macros"] } clap = { version = "4.5.9", features = ["derive", "env"] } eyre.workspace = true tracing.workspace = true From bd002924486fcdc8210e46cf3c46d4488d3abeda Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Apr 2025 09:05:55 -0700 Subject: [PATCH 17/25] chore(deps): bump crossbeam-channel from 0.5.14 to 0.5.15 (#1569) Bumps [crossbeam-channel](https://github.com/crossbeam-rs/crossbeam) from 0.5.14 to 0.5.15.
    Release notes

    Sourced from crossbeam-channel's releases.

    crossbeam-channel 0.5.15

    • Fix regression introduced in 0.5.12 that can lead to a double free when dropping unbounded channel. (#1187)
    Commits

    [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=crossbeam-channel&package-manager=cargo&previous-version=0.5.14&new-version=0.5.15)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
    Dependabot commands and options
    You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/openvm-org/openvm/network/alerts).
    Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6b4e20d46..5629a31d51 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1496,9 +1496,9 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ba6d68e24814cb8de6bb986db8222d3a027d15872cabc0d18817bc3c0e4471" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ "crossbeam-utils", ] From e827799fe2098a93900fb986cff8c2f4f5c4bb30 Mon Sep 17 00:00:00 2001 From: Ayush Shukla Date: Thu, 10 Apr 2025 13:57:40 -0400 Subject: [PATCH 18/25] fix(docs): typo in access adapter split/merge algorithm (#1566) --- docs/specs/memory.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/specs/memory.md b/docs/specs/memory.md index df8fd59931..3d8ea1dc1d 100644 --- a/docs/specs/memory.md +++ b/docs/specs/memory.md @@ -97,7 +97,7 @@ The _split_ and _merge_ operations for a subsegment of length `N` are handled by - Of course, merging two halves creates a subsegment with the timestamp being the maximal of two timestamps for the halves. - Splitting, however, just makes all child timestamps equal to the former timestamp of the segment being split. - All these timestamp conditions are checked in the `AccessAdapterAir`. -- When merging two segments `[l, r)` and `[m, r)`, the `AccessAdapterAir` sends to **memory bus** the information about `[l, r)` and receives the information about `[l, m)` and about `[m, r)`, all with multiplicity 1. Splitting does the same, but with multiplicity -1 (or, in other words, receives about `[l, r)` and sends about `[l, m)` and `[m, r)`). +- When merging two segments `[l, m)` and `[m, r)`, the `AccessAdapterAir` sends to **memory bus** the information about `[l, r)` and receives the information about `[l, m)` and about `[m, r)`, all with multiplicity 1. Splitting does the same, but with multiplicity -1 (or, in other words, receives about `[l, r)` and sends about `[l, m)` and `[m, r)`). - The information about `[l, r)` sent to the bus is, in this order: - address space, - `l`, From 24c2cf36fd878653a7e55c0e6965b58e02ae3273 Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Fri, 11 Apr 2025 21:22:58 -0400 Subject: [PATCH 19/25] feat(sdk)!: configurable aggregation tree shape in SDK (#1570) Introduce `AggregationTreeConfig` struct for simple configuration of aggregation tree. These were already in the provers, but not exposed to be changeable. Breaking API changes in SDK: - `AggStarkProver::new` - `ContinuationProver::new` - `Sdk` now internally contains `AggregationTreeConfig`, although `Sdk::new()` is unchanged and just sets a default Towards INT-3302 --- Cargo.lock | 10 +++---- benchmarks/prove/src/bin/fib_e2e.rs | 1 + benchmarks/prove/src/bin/kitchen_sink.rs | 1 + benchmarks/prove/src/util.rs | 15 ++++++----- crates/cli/src/commands/prove.rs | 9 +++++-- crates/sdk/src/config/mod.rs | 33 ++++++++++++++++++++++++ crates/sdk/src/lib.rs | 18 ++++++++++--- crates/sdk/src/prover/agg.rs | 12 ++++----- crates/sdk/src/prover/mod.rs | 12 ++++++--- crates/sdk/src/prover/stark.rs | 12 ++++++--- 10 files changed, 93 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5629a31d51..eaa9e308bb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1932,7 +1932,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2807,7 +2807,7 @@ checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi 0.4.0", "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -5458,7 +5458,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6077,7 +6077,7 @@ dependencies = [ "getrandom 0.3.1", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6732,7 +6732,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] diff --git a/benchmarks/prove/src/bin/fib_e2e.rs b/benchmarks/prove/src/bin/fib_e2e.rs index e99803eb2a..efee46e4cc 100644 --- a/benchmarks/prove/src/bin/fib_e2e.rs +++ b/benchmarks/prove/src/bin/fib_e2e.rs @@ -63,6 +63,7 @@ async fn main() -> Result<()> { app_pk, app_committed_exe, full_agg_pk, + args.agg_tree_config, ); e2e_prover.set_program_name("fib_e2e"); let _proof = e2e_prover.generate_proof_for_evm(stdin); diff --git a/benchmarks/prove/src/bin/kitchen_sink.rs b/benchmarks/prove/src/bin/kitchen_sink.rs index 80ffcd2578..dfdaa25887 100644 --- a/benchmarks/prove/src/bin/kitchen_sink.rs +++ b/benchmarks/prove/src/bin/kitchen_sink.rs @@ -85,6 +85,7 @@ fn main() -> Result<()> { app_pk, app_committed_exe, full_agg_pk, + args.agg_tree_config, ); prover.set_program_name("kitchen_sink"); let stdin = StdIn::default(); diff --git a/benchmarks/prove/src/util.rs b/benchmarks/prove/src/util.rs index 82241202b4..9eed73adf9 100644 --- a/benchmarks/prove/src/util.rs +++ b/benchmarks/prove/src/util.rs @@ -9,13 +9,12 @@ use openvm_native_compiler::conversion::CompilerOptions; use openvm_sdk::{ commit::commit_app_exe, config::{ - AggConfig, AggStarkConfig, AppConfig, Halo2Config, DEFAULT_APP_LOG_BLOWUP, - DEFAULT_INTERNAL_LOG_BLOWUP, DEFAULT_LEAF_LOG_BLOWUP, DEFAULT_ROOT_LOG_BLOWUP, + AggConfig, AggStarkConfig, AggregationTreeConfig, AppConfig, Halo2Config, + DEFAULT_APP_LOG_BLOWUP, DEFAULT_INTERNAL_LOG_BLOWUP, DEFAULT_LEAF_LOG_BLOWUP, + DEFAULT_ROOT_LOG_BLOWUP, }, keygen::{leaf_keygen, AppProvingKey}, - prover::{ - vm::local::VmLocalProver, AppProver, LeafProvingController, DEFAULT_NUM_CHILDREN_LEAF, - }, + prover::{vm::local::VmLocalProver, AppProver, LeafProvingController}, Sdk, StdIn, }; use openvm_stark_backend::utils::metrics_span; @@ -66,6 +65,10 @@ pub struct BenchmarkCli { #[arg(short, long, alias = "max_segment_length")] pub max_segment_length: Option, + /// Controls the arity (num_children) of the aggregation tree + #[command(flatten)] + pub agg_tree_config: AggregationTreeConfig, + /// Whether to execute with additional profiling metric collection #[arg(long)] pub profiling: bool, @@ -219,7 +222,7 @@ where let leaf_prover = VmLocalProver::::new(leaf_vm_pk, app_pk.leaf_committed_exe); let leaf_controller = LeafProvingController { - num_children: DEFAULT_NUM_CHILDREN_LEAF, + num_children: AggregationTreeConfig::default().num_children_leaf, }; leaf_controller.generate_proof(&leaf_prover, &app_proof); } diff --git a/crates/cli/src/commands/prove.rs b/crates/cli/src/commands/prove.rs index c2c1be894d..3474f96ea7 100644 --- a/crates/cli/src/commands/prove.rs +++ b/crates/cli/src/commands/prove.rs @@ -5,7 +5,7 @@ use eyre::Result; use openvm_native_recursion::halo2::utils::CacheHalo2ParamsReader; use openvm_sdk::{ commit::AppExecutionCommit, - config::SdkVmConfig, + config::{AggregationTreeConfig, SdkVmConfig}, fs::{ read_agg_pk_from_file, read_app_pk_from_file, read_exe_from_file, write_app_proof_to_file, write_evm_proof_to_file, @@ -56,12 +56,15 @@ enum ProveSubCommand { #[arg(long, action, help = "Path to output proof", default_value = DEFAULT_EVM_PROOF_PATH)] output: PathBuf, + + #[command(flatten)] + agg_tree_config: AggregationTreeConfig, }, } impl ProveCmd { pub fn run(&self) -> Result<()> { - let sdk = Sdk::new(); + let mut sdk = Sdk::new(); match &self.command { ProveSubCommand::App { app_pk, @@ -79,7 +82,9 @@ impl ProveCmd { exe, input, output, + agg_tree_config, } => { + sdk.set_agg_tree_config(*agg_tree_config); let params_reader = CacheHalo2ParamsReader::new(DEFAULT_PARAMS_DIR); let (app_pk, committed_exe, input) = Self::prepare_execution(&sdk, app_pk, exe, input)?; diff --git a/crates/sdk/src/config/mod.rs b/crates/sdk/src/config/mod.rs index 8d4525338d..6d552f3482 100644 --- a/crates/sdk/src/config/mod.rs +++ b/crates/sdk/src/config/mod.rs @@ -1,3 +1,4 @@ +use clap::Args; use openvm_circuit::arch::instructions::program::DEFAULT_MAX_NUM_PUBLIC_VALUES; use openvm_continuations::verifier::{ common::types::VmVerifierPvs, internal::types::InternalVmVerifierPvs, @@ -15,6 +16,11 @@ pub const DEFAULT_LEAF_LOG_BLOWUP: usize = 1; pub const DEFAULT_INTERNAL_LOG_BLOWUP: usize = 2; pub const DEFAULT_ROOT_LOG_BLOWUP: usize = 3; +// Aggregation Tree Defaults +const DEFAULT_NUM_CHILDREN_LEAF: usize = 1; +const DEFAULT_NUM_CHILDREN_INTERNAL: usize = 4; +const DEFAULT_MAX_INTERNAL_WRAPPER_LAYERS: usize = 4; + #[derive(Clone, Debug, Serialize, Deserialize)] pub struct AppConfig { #[serde(default)] @@ -59,6 +65,23 @@ pub struct Halo2Config { pub profiling: bool, } +#[derive(Clone, Copy, Debug, Serialize, Deserialize, Args)] +pub struct AggregationTreeConfig { + /// Each leaf verifier circuit will aggregate this many App VM proofs. + #[arg(long, default_value_t = DEFAULT_NUM_CHILDREN_LEAF)] + pub num_children_leaf: usize, + /// Each internal verifier circuit will aggregate this many proofs, + /// where each proof may be of either leaf or internal verifier (self) circuit. + #[arg(long, default_value_t = DEFAULT_NUM_CHILDREN_INTERNAL)] + pub num_children_internal: usize, + /// Safety threshold: how many times to do 1-to-1 aggregation of the "last" internal + /// verifier proof before it is small enough for the root verifier circuit. + /// Note: almost always no wrapping is needed. + #[arg(long, default_value_t = DEFAULT_MAX_INTERNAL_WRAPPER_LAYERS)] + pub max_internal_wrapper_layers: usize, + // root currently always has 1 child for now +} + impl AppConfig { pub fn new(app_fri_params: FriParameters, app_vm_config: VC) -> Self { Self { @@ -187,3 +210,13 @@ impl AggStarkConfig { config } } + +impl Default for AggregationTreeConfig { + fn default() -> Self { + Self { + num_children_leaf: DEFAULT_NUM_CHILDREN_LEAF, + num_children_internal: DEFAULT_NUM_CHILDREN_INTERNAL, + max_internal_wrapper_layers: DEFAULT_MAX_INTERNAL_WRAPPER_LAYERS, + } + } +} diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs index ee3d5a3d9c..a57561e7f4 100644 --- a/crates/sdk/src/lib.rs +++ b/crates/sdk/src/lib.rs @@ -10,7 +10,7 @@ use std::{ use alloy_primitives::{Bytes, FixedBytes}; use alloy_sol_types::{sol, SolCall, SolValue}; use commit::commit_app_exe; -use config::AppConfig; +use config::{AggregationTreeConfig, AppConfig}; use eyre::{Context, Result}; use keygen::{AppProvingKey, AppVerifyingKey}; use openvm_build::{ @@ -101,12 +101,14 @@ pub struct VerifiedContinuationVmPayload { } pub struct GenericSdk> { + agg_tree_config: AggregationTreeConfig, _phantom: PhantomData, } impl> Default for GenericSdk { fn default() -> Self { Self { + agg_tree_config: AggregationTreeConfig::default(), _phantom: PhantomData, } } @@ -119,6 +121,14 @@ impl> GenericSdk { Self::default() } + pub fn agg_tree_config(&self) -> &AggregationTreeConfig { + &self.agg_tree_config + } + + pub fn set_agg_tree_config(&mut self, agg_tree_config: AggregationTreeConfig) { + self.agg_tree_config = agg_tree_config; + } + pub fn build>( &self, guest_opts: GuestOptions, @@ -264,7 +274,8 @@ impl> GenericSdk { VC::Executor: Chip, VC::Periphery: Chip, { - let stark_prover = StarkProver::::new(app_pk, app_exe, agg_stark_pk); + let stark_prover = + StarkProver::::new(app_pk, app_exe, agg_stark_pk, self.agg_tree_config); let proof = stark_prover.generate_root_verifier_input(inputs); Ok(proof) } @@ -281,7 +292,8 @@ impl> GenericSdk { VC::Executor: Chip, VC::Periphery: Chip, { - let e2e_prover = ContinuationProver::::new(reader, app_pk, app_exe, agg_pk); + let e2e_prover = + ContinuationProver::::new(reader, app_pk, app_exe, agg_pk, self.agg_tree_config); let proof = e2e_prover.generate_proof_for_evm(inputs); Ok(proof) } diff --git a/crates/sdk/src/prover/agg.rs b/crates/sdk/src/prover/agg.rs index 3055516424..42f0d85d58 100644 --- a/crates/sdk/src/prover/agg.rs +++ b/crates/sdk/src/prover/agg.rs @@ -11,6 +11,7 @@ use openvm_stark_sdk::{engine::StarkFriEngine, openvm_stark_backend::proof::Proo use tracing::info_span; use crate::{ + config::AggregationTreeConfig, keygen::AggStarkProvingKey, prover::{ vm::{local::VmLocalProver, SingleSegmentVmProver}, @@ -19,10 +20,6 @@ use crate::{ NonRootCommittedExe, RootSC, F, SC, }; -pub const DEFAULT_NUM_CHILDREN_LEAF: usize = 1; -const DEFAULT_NUM_CHILDREN_INTERNAL: usize = 2; -const DEFAULT_MAX_INTERNAL_WRAPPER_LAYERS: usize = 4; - pub struct AggStarkProver> { leaf_prover: VmLocalProver, leaf_controller: LeafProvingController, @@ -43,11 +40,12 @@ impl> AggStarkProver { pub fn new( agg_stark_pk: AggStarkProvingKey, leaf_committed_exe: Arc, + tree_config: AggregationTreeConfig, ) -> Self { let leaf_prover = VmLocalProver::::new(agg_stark_pk.leaf_vm_pk, leaf_committed_exe); let leaf_controller = LeafProvingController { - num_children: DEFAULT_NUM_CHILDREN_LEAF, + num_children: tree_config.num_children_leaf, }; let internal_prover = VmLocalProver::::new( agg_stark_pk.internal_vm_pk, @@ -59,8 +57,8 @@ impl> AggStarkProver { leaf_controller, internal_prover, root_prover, - num_children_internal: DEFAULT_NUM_CHILDREN_INTERNAL, - max_internal_wrapper_layers: DEFAULT_MAX_INTERNAL_WRAPPER_LAYERS, + num_children_internal: tree_config.num_children_internal, + max_internal_wrapper_layers: tree_config.max_internal_wrapper_layers, } } diff --git a/crates/sdk/src/prover/mod.rs b/crates/sdk/src/prover/mod.rs index e0e4fedd04..f565adcbab 100644 --- a/crates/sdk/src/prover/mod.rs +++ b/crates/sdk/src/prover/mod.rs @@ -3,7 +3,9 @@ use std::sync::Arc; use openvm_circuit::arch::VmConfig; use openvm_stark_sdk::{engine::StarkFriEngine, openvm_stark_backend::Chip}; -use crate::{keygen::AppProvingKey, stdin::StdIn, NonRootCommittedExe, F, SC}; +use crate::{ + config::AggregationTreeConfig, keygen::AppProvingKey, stdin::StdIn, NonRootCommittedExe, F, SC, +}; mod agg; pub use agg::*; @@ -25,8 +27,8 @@ pub use stark::*; use crate::{keygen::AggProvingKey, prover::halo2::Halo2Prover, types::EvmProof}; pub struct ContinuationProver> { - stark_prover: StarkProver, - halo2_prover: Halo2Prover, + pub stark_prover: StarkProver, + pub halo2_prover: Halo2Prover, } impl> ContinuationProver { @@ -35,6 +37,7 @@ impl> ContinuationProver { app_pk: Arc>, app_committed_exe: Arc, agg_pk: AggProvingKey, + agg_tree_config: AggregationTreeConfig, ) -> Self where VC: VmConfig, @@ -43,7 +46,8 @@ impl> ContinuationProver { agg_stark_pk, halo2_pk, } = agg_pk; - let stark_prover = StarkProver::new(app_pk, app_committed_exe, agg_stark_pk); + let stark_prover = + StarkProver::new(app_pk, app_committed_exe, agg_stark_pk, agg_tree_config); Self { stark_prover, halo2_prover: Halo2Prover::new(reader, halo2_pk), diff --git a/crates/sdk/src/prover/stark.rs b/crates/sdk/src/prover/stark.rs index d9d8d17d14..c95bdc0655 100644 --- a/crates/sdk/src/prover/stark.rs +++ b/crates/sdk/src/prover/stark.rs @@ -6,20 +6,22 @@ use openvm_stark_backend::{proof::Proof, Chip}; use openvm_stark_sdk::engine::StarkFriEngine; use crate::{ + config::AggregationTreeConfig, keygen::{AggStarkProvingKey, AppProvingKey}, prover::{agg::AggStarkProver, app::AppProver}, NonRootCommittedExe, RootSC, StdIn, F, SC, }; pub struct StarkProver> { - app_prover: AppProver, - agg_prover: AggStarkProver, + pub app_prover: AppProver, + pub agg_prover: AggStarkProver, } impl> StarkProver { pub fn new( app_pk: Arc>, app_committed_exe: Arc, agg_stark_pk: AggStarkProvingKey, + agg_tree_config: AggregationTreeConfig, ) -> Self where VC: VmConfig, @@ -36,7 +38,11 @@ impl> StarkProver { Self { app_prover: AppProver::new(app_pk.app_vm_pk.clone(), app_committed_exe), - agg_prover: AggStarkProver::new(agg_stark_pk, app_pk.leaf_committed_exe.clone()), + agg_prover: AggStarkProver::new( + agg_stark_pk, + app_pk.leaf_committed_exe.clone(), + agg_tree_config, + ), } } pub fn set_program_name(&mut self, program_name: impl AsRef) -> &mut Self { From 39d6771f43478b7fd5ce58134be9c829ed48f6e0 Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Fri, 11 Apr 2025 22:30:20 -0400 Subject: [PATCH 20/25] perf: set default `num_children_internal=3` (#1573) The total proving time of `num_children_internal=4` vs 3 is about the same, but 4 leads to the `internal.0` verifier circuit's size being larger than the leaf verifier, so for the sake of having smaller circuits, we switch to `3` as the default. This is configurable via CLI and SDK, so it's just a default for convenience. --- crates/sdk/src/config/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/sdk/src/config/mod.rs b/crates/sdk/src/config/mod.rs index 6d552f3482..035e3709ef 100644 --- a/crates/sdk/src/config/mod.rs +++ b/crates/sdk/src/config/mod.rs @@ -18,7 +18,7 @@ pub const DEFAULT_ROOT_LOG_BLOWUP: usize = 3; // Aggregation Tree Defaults const DEFAULT_NUM_CHILDREN_LEAF: usize = 1; -const DEFAULT_NUM_CHILDREN_INTERNAL: usize = 4; +const DEFAULT_NUM_CHILDREN_INTERNAL: usize = 3; const DEFAULT_MAX_INTERNAL_WRAPPER_LAYERS: usize = 4; #[derive(Clone, Debug, Serialize, Deserialize)] From e4e180c28aca1bf065813e3c3076c4c46cb045e0 Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Sun, 13 Apr 2025 22:02:50 -0400 Subject: [PATCH 21/25] chore(fmt): wrap comments and format code comments (#1575) --- benchmarks/prove/src/bin/verify_fibair.rs | 3 +- benchmarks/prove/src/util.rs | 3 +- crates/circuits/mod-builder/src/builder.rs | 23 +++-- crates/circuits/mod-builder/src/core_chip.rs | 11 ++- .../mod-builder/src/field_variable.rs | 6 +- .../circuits/mod-builder/src/symbolic_expr.rs | 7 +- crates/circuits/mod-builder/src/tests.rs | 12 ++- crates/circuits/poseidon2-air/src/config.rs | 3 +- crates/circuits/poseidon2-air/src/lib.rs | 6 +- crates/circuits/poseidon2-air/src/permute.rs | 12 ++- crates/circuits/primitives/derive/src/lib.rs | 10 +- .../primitives/src/assert_less_than/mod.rs | 10 +- .../src/bigint/check_carry_mod_to_zero.rs | 4 +- crates/circuits/primitives/src/bigint/mod.rs | 3 +- crates/circuits/primitives/src/encoder/mod.rs | 12 ++- .../circuits/primitives/src/is_equal/mod.rs | 4 +- .../primitives/src/is_equal_array/mod.rs | 7 +- .../primitives/src/is_less_than/mod.rs | 7 +- .../primitives/src/is_less_than/tests.rs | 7 +- .../primitives/src/is_less_than_array/mod.rs | 16 +-- .../src/is_less_than_array/tests.rs | 8 +- crates/circuits/primitives/src/is_zero/mod.rs | 4 +- crates/circuits/primitives/src/lib.rs | 3 +- crates/circuits/primitives/src/range/bus.rs | 12 ++- crates/circuits/primitives/src/range/mod.rs | 3 +- .../circuits/primitives/src/range_gate/mod.rs | 3 +- .../primitives/src/range_tuple/mod.rs | 5 +- crates/circuits/primitives/src/sub_air.rs | 12 ++- .../circuits/primitives/src/var_range/mod.rs | 3 +- .../circuits/primitives/src/xor/lookup/mod.rs | 6 +- crates/circuits/sha256-air/src/air.rs | 97 +++++++++++-------- crates/circuits/sha256-air/src/columns.rs | 26 +++-- crates/circuits/sha256-air/src/trace.rs | 40 +++++--- .../src/verifier/internal/types.rs | 6 +- .../continuations/src/verifier/leaf/types.rs | 4 +- .../continuations/src/verifier/leaf/vars.rs | 4 +- crates/prof/src/lib.rs | 3 +- crates/sdk/src/codec.rs | 8 +- crates/sdk/src/commit.rs | 4 +- crates/sdk/src/keygen/dummy.rs | 3 +- crates/sdk/src/keygen/mod.rs | 6 +- crates/sdk/src/types.rs | 6 +- crates/toolchain/build/src/lib.rs | 7 +- crates/toolchain/custom_insn/src/lib.rs | 22 +++-- .../toolchain/instructions/src/instruction.rs | 3 +- crates/toolchain/instructions/src/lib.rs | 3 +- crates/toolchain/instructions/src/phantom.rs | 6 +- crates/toolchain/instructions/src/program.rs | 7 +- crates/toolchain/openvm/src/io/mod.rs | 6 +- crates/toolchain/openvm/src/lib.rs | 4 +- crates/toolchain/openvm/src/pal_abi.rs | 6 +- crates/toolchain/platform/src/getrandom.rs | 3 +- crates/toolchain/platform/src/rust_rt.rs | 8 +- .../toolchain/tests/tests/transpiler_tests.rs | 4 +- crates/toolchain/transpiler/src/extension.rs | 13 +-- crates/toolchain/transpiler/src/transpiler.rs | 10 +- crates/toolchain/transpiler/src/util.rs | 6 +- crates/vm/derive/src/lib.rs | 8 +- crates/vm/src/arch/config.rs | 11 ++- crates/vm/src/arch/execution.rs | 6 +- crates/vm/src/arch/extensions.rs | 32 +++--- crates/vm/src/arch/integration_api.rs | 36 ++++--- crates/vm/src/arch/segment.rs | 6 +- crates/vm/src/arch/testing/mod.rs | 3 +- crates/vm/src/arch/vm.rs | 16 +-- crates/vm/src/lib.rs | 4 +- crates/vm/src/metrics/cycle_tracker/mod.rs | 3 +- crates/vm/src/system/connector/mod.rs | 8 +- crates/vm/src/system/memory/adapter/air.rs | 3 +- crates/vm/src/system/memory/controller/mod.rs | 12 ++- crates/vm/src/system/memory/merkle/air.rs | 3 +- crates/vm/src/system/memory/merkle/mod.rs | 3 +- .../system/memory/offline_checker/bridge.rs | 12 +-- .../system/memory/offline_checker/columns.rs | 6 +- crates/vm/src/system/memory/persistent.rs | 3 +- crates/vm/src/system/memory/volatile/mod.rs | 15 +-- crates/vm/src/system/phantom/mod.rs | 3 +- crates/vm/src/system/poseidon2/air.rs | 4 +- crates/vm/src/system/poseidon2/chip.rs | 3 +- crates/vm/src/system/public_values/core.rs | 6 +- crates/vm/tests/integration_test.rs | 11 ++- extensions/algebra/circuit/src/fp2.rs | 8 +- .../algebra/circuit/src/modular_chip/is_eq.rs | 36 ++++--- .../circuit/src/modular_chip/muldiv.rs | 3 +- .../algebra/circuit/src/modular_chip/tests.rs | 6 +- extensions/algebra/complex-macros/src/lib.rs | 5 +- extensions/algebra/guest/src/field/mod.rs | 9 +- extensions/algebra/guest/src/halo2curves.rs | 9 +- extensions/algebra/guest/src/lib.rs | 3 +- extensions/algebra/moduli-macros/src/lib.rs | 10 +- .../ecc/circuit/src/weierstrass_chip/mod.rs | 4 +- .../ecc/circuit/src/weierstrass_chip/tests.rs | 6 +- extensions/ecc/guest/src/weierstrass.rs | 20 ++-- extensions/ecc/sw-macros/src/lib.rs | 14 ++- .../ecc/tests/programs/examples/decompress.rs | 5 +- extensions/keccak256/circuit/src/air.rs | 17 ++-- extensions/keccak256/circuit/src/columns.rs | 8 +- extensions/keccak256/circuit/src/lib.rs | 7 +- extensions/keccak256/circuit/src/trace.rs | 3 +- extensions/native/circuit/src/castf/core.rs | 3 +- .../circuit/src/field_arithmetic/core.rs | 3 +- extensions/native/circuit/src/fri/mod.rs | 17 ++-- .../native/circuit/src/poseidon2/columns.rs | 32 +++--- .../native/compiler/src/asm/instruction.rs | 9 +- .../src/constraints/halo2/baby_bear.rs | 6 +- .../src/constraints/halo2/compiler.rs | 9 +- .../src/constraints/halo2/poseidon2_perm.rs | 6 +- .../native/compiler/src/conversion/mod.rs | 3 +- extensions/native/compiler/src/ir/bits.rs | 16 +-- extensions/native/compiler/src/ir/builder.rs | 3 +- .../native/compiler/src/ir/instructions.rs | 56 +++++++---- extensions/native/compiler/src/ir/symbolic.rs | 3 +- extensions/native/recursion/src/fri/domain.rs | 4 +- extensions/native/recursion/src/fri/mod.rs | 6 +- .../native/recursion/src/fri/two_adic_pcs.rs | 46 +++++---- extensions/native/recursion/src/halo2/mod.rs | 3 +- extensions/native/recursion/src/stark/mod.rs | 19 ++-- extensions/native/recursion/src/types.rs | 5 +- extensions/native/recursion/src/utils.rs | 4 +- extensions/native/recursion/src/vars.rs | 5 +- extensions/native/recursion/src/view.rs | 3 +- .../pairing/circuit/src/fp12_chip/tests.rs | 3 +- .../miller_double_and_add_step.rs | 3 +- extensions/pairing/guest/src/bls12_381/mod.rs | 4 +- .../pairing/guest/src/bls12_381/pairing.rs | 40 ++++---- extensions/pairing/guest/src/bn254/mod.rs | 4 +- extensions/pairing/guest/src/bn254/pairing.rs | 31 +++--- .../halo2curves_shims/bls12_381/final_exp.rs | 13 ++- .../bls12_381/miller_loop.rs | 27 +++--- .../bls12_381/tests/test_miller_loop.rs | 3 +- .../src/halo2curves_shims/bn254/final_exp.rs | 3 +- .../halo2curves_shims/bn254/miller_loop.rs | 3 +- .../bn254/tests/test_final_exp.rs | 8 +- .../pairing/guest/src/pairing/miller_loop.rs | 8 +- .../pairing/guest/src/pairing/miller_step.rs | 9 +- extensions/pairing/guest/src/pairing/mod.rs | 4 +- .../guest/src/pairing/sextic_ext_field.rs | 4 +- .../examples/pairing_check_fallback.rs | 16 +-- .../programs/examples/pairing_miller_step.rs | 8 +- extensions/pairing/transpiler/src/lib.rs | 4 +- extensions/rv32-adapters/src/eq_mod.rs | 9 +- extensions/rv32-adapters/src/heap.rs | 4 +- extensions/rv32-adapters/src/heap_branch.rs | 15 +-- extensions/rv32-adapters/src/vec_heap.rs | 24 ++--- .../rv32-adapters/src/vec_heap_two_reads.rs | 15 +-- .../rv32im/circuit/src/adapters/loadstore.rs | 30 +++--- extensions/rv32im/circuit/src/adapters/mod.rs | 7 +- extensions/rv32im/circuit/src/auipc/core.rs | 17 ++-- .../rv32im/circuit/src/branch_eq/core.rs | 3 +- .../rv32im/circuit/src/branch_lt/core.rs | 11 ++- extensions/rv32im/circuit/src/divrem/core.rs | 11 ++- .../rv32im/circuit/src/hintstore/mod.rs | 34 ++++--- extensions/rv32im/circuit/src/jal_lui/core.rs | 3 +- extensions/rv32im/circuit/src/jalr/core.rs | 13 +-- .../rv32im/circuit/src/less_than/core.rs | 8 +- .../circuit/src/load_sign_extend/core.rs | 7 +- extensions/rv32im/circuit/src/mul/core.rs | 3 +- .../rv32im/transpiler/src/instructions.rs | 3 +- extensions/rv32im/transpiler/src/lib.rs | 3 +- .../sha256/circuit/src/sha256_chip/air.rs | 36 ++++--- .../sha256/circuit/src/sha256_chip/columns.rs | 9 +- .../sha256/circuit/src/sha256_chip/mod.rs | 3 +- .../sha256/circuit/src/sha256_chip/trace.rs | 3 +- rustfmt.toml | 5 + 164 files changed, 985 insertions(+), 677 deletions(-) diff --git a/benchmarks/prove/src/bin/verify_fibair.rs b/benchmarks/prove/src/bin/verify_fibair.rs index 3867f86f44..d2b75f7e71 100644 --- a/benchmarks/prove/src/bin/verify_fibair.rs +++ b/benchmarks/prove/src/bin/verify_fibair.rs @@ -35,7 +35,8 @@ fn main() -> Result<()> { ); run_with_metric_collection("OUTPUT_PATH", || -> Result<()> { - // run_test tries to setup tracing, but it will be ignored since run_with_metric_collection already sets it. + // run_test tries to setup tracing, but it will be ignored since run_with_metric_collection + // already sets it. let (fib_air, fib_input) = collect_airs_and_inputs!(fib_chip); let vdata = engine.run_test(fib_air, fib_input).unwrap(); // Unlike other apps, this "app" does not have continuations enabled. diff --git a/benchmarks/prove/src/util.rs b/benchmarks/prove/src/util.rs index 9eed73adf9..ae742cd591 100644 --- a/benchmarks/prove/src/util.rs +++ b/benchmarks/prove/src/util.rs @@ -208,7 +208,8 @@ where }); // 3. Executes runtime // 4. Generate trace - // 5. Generate STARK proofs for each segment (segmentation is determined by `config`), with timer. + // 5. Generate STARK proofs for each segment (segmentation is determined by `config`), with + // timer. let app_vk = app_pk.get_app_vk(); let prover = AppProver::::new(app_pk.app_vm_pk, committed_exe).with_program_name(bench_name); diff --git a/crates/circuits/mod-builder/src/builder.rs b/crates/circuits/mod-builder/src/builder.rs index 641b99317e..6e1c22a009 100644 --- a/crates/circuits/mod-builder/src/builder.rs +++ b/crates/circuits/mod-builder/src/builder.rs @@ -78,12 +78,13 @@ pub struct ExprBuilder { /// flag for debug mode debug: bool, - /// Whether the builder has been finalized. Only after finalize, we can do generate_subrow and eval etc. + /// Whether the builder has been finalized. Only after finalize, we can do generate_subrow and + /// eval etc. finalized: bool, // Setup opcode is a special op that verifies the modulus is correct. - // There are some chips that don't need it because we hardcode the modulus. E.g. the pairing ones. - // For those chips need setup, setup is derived: setup = is_valid - sum(all_flags) + // There are some chips that don't need it because we hardcode the modulus. E.g. the pairing + // ones. For those chips need setup, setup is derived: setup = is_valid - sum(all_flags) // Therefore when the chip only supports one opcode, user won't explicitly create a flag for it // and we will create a default flag for it on finalizing. needs_setup: bool, @@ -185,7 +186,8 @@ impl ExprBuilder { // so there should be same number of calls to the new_var, add_constraint and add_compute. pub fn new_var(&mut self) -> (usize, SymbolicExpr) { self.num_variables += 1; - // Allocate space for the new variable, to make sure they are corresponding to the same variable index. + // Allocate space for the new variable, to make sure they are corresponding to the same + // variable index. self.constraints.push(SymbolicExpr::Input(0)); self.computes.push(SymbolicExpr::Input(0)); self.q_limbs.push(0); @@ -349,10 +351,9 @@ impl SubAir for FieldExpr { builder.assert_bool(is_setup.clone()); // TODO[jpw]: currently we enforce at the program code level that: // - a valid program must call the correct setup opcodes to be correct - // - it would be better if we can constraint this in the circuit, - // however this has the challenge that when the same chip is used - // across continuation segments, - // only the first segment will have setup called + // - it would be better if we can constraint this in the circuit, however this has the + // challenge that when the same chip is used across continuation segments, only the + // first segment will have setup called let expected = iter::empty() .chain({ @@ -472,7 +473,8 @@ impl TraceSubRowGenerator for FieldExpr { .collect::>(); let zero = OverflowInt::::from_canonical_unsigned_limbs(vec![0], limb_bits); let mut vars_overflow = vec![zero; self.num_variables]; - // Note: in cases where the prime fits in less limbs than `num_limbs`, we use the smaller number of limbs. + // Note: in cases where the prime fits in less limbs than `num_limbs`, we use the smaller + // number of limbs. let prime_overflow = OverflowInt::::from_biguint(&self.prime, self.limb_bits, None); let constants: Vec<_> = self @@ -493,7 +495,8 @@ impl TraceSubRowGenerator for FieldExpr { vars_overflow[i] = OverflowInt::::from_biguint(&vars[i], self.limb_bits, Some(self.num_limbs)); } - // We need to have all variables computed first because, e.g. constraints[2] might need variables[3]. + // We need to have all variables computed first because, e.g. constraints[2] might need + // variables[3]. for i in 0..self.constraints.len() { // expr = q * p let expr_bigint = diff --git a/crates/circuits/mod-builder/src/core_chip.rs b/crates/circuits/mod-builder/src/core_chip.rs index 0499ce961c..30e9c65dbb 100644 --- a/crates/circuits/mod-builder/src/core_chip.rs +++ b/crates/circuits/mod-builder/src/core_chip.rs @@ -35,7 +35,8 @@ pub struct FieldExpressionCoreAir { /// All the opcode indices (including setup) supported by this Air. /// The last one must be the setup opcode if it's a chip needs setup. pub local_opcode_idx: Vec, - /// Opcode flag idx (indices from builder.new_flag()) for all except setup opcode. Empty if single op chip. + /// Opcode flag idx (indices from builder.new_flag()) for all except setup opcode. Empty if + /// single op chip. pub opcode_flag_idx: Vec, // Example 1: 1-op chip EcAdd that needs setup // local_opcode_idx = [0, 2], where 0 is EcAdd, 2 is setup @@ -178,7 +179,8 @@ pub struct FieldExpressionCoreChip { pub name: String, - /// Whether to finalize the trace. True if all-zero rows don't satisfy the constraints (e.g. there is int_add) + /// Whether to finalize the trace. True if all-zero rows don't satisfy the constraints (e.g. + /// there is int_add) pub should_finalize: bool, } @@ -245,8 +247,9 @@ where let local_opcode_idx = opcode.local_opcode_idx(self.air.offset); let mut flags = vec![]; - // If the chip doesn't need setup, (right now) it must be single op chip and thus no flag is needed. - // Otherwise, there is a flag for each opcode and will be derived by is_valid - sum(flags). + // If the chip doesn't need setup, (right now) it must be single op chip and thus no flag is + // needed. Otherwise, there is a flag for each opcode and will be derived by + // is_valid - sum(flags). if self.expr().needs_setup() { flags = vec![false; self.air.num_flags()]; self.air diff --git a/crates/circuits/mod-builder/src/field_variable.rs b/crates/circuits/mod-builder/src/field_variable.rs index 4f53e649e8..fcf0c20e79 100644 --- a/crates/circuits/mod-builder/src/field_variable.rs +++ b/crates/circuits/mod-builder/src/field_variable.rs @@ -89,7 +89,8 @@ impl FieldVariable { fn save_if_overflow( a: &mut FieldVariable, // will save this variable if overflow - expr: SymbolicExpr, // the "compute" expression of the result variable. Note that we need to check if constraint overflows + expr: SymbolicExpr, /* the "compute" expression of the result variable. Note that we + * need to check if constraint overflows */ limb_max_abs: usize, // The max abs of limbs of compute expression. ) { if let SymbolicExpr::Var(_) = a.expr { @@ -115,7 +116,8 @@ impl FieldVariable { // TODO[Lun-Kai]: rethink about how should auto-save work. // This implementation requires self and other to be mutable, and might actually mutate them. - // This might surprise the caller or introduce hard bug if the caller clone the FieldVariable and then call this. + // This might surprise the caller or introduce hard bug if the caller clone the FieldVariable + // and then call this. pub fn add(&mut self, other: &mut FieldVariable) -> FieldVariable { assert!(Rc::ptr_eq(&self.builder, &other.builder)); let limb_max_fn = |a: &FieldVariable, b: &FieldVariable| a.limb_max_abs + b.limb_max_abs; diff --git a/crates/circuits/mod-builder/src/symbolic_expr.rs b/crates/circuits/mod-builder/src/symbolic_expr.rs index 8febde4cd1..a84bf6504a 100644 --- a/crates/circuits/mod-builder/src/symbolic_expr.rs +++ b/crates/circuits/mod-builder/src/symbolic_expr.rs @@ -222,7 +222,8 @@ impl SymbolicExpr { SymbolicExpr::IntAdd(lhs, s) => { let (lhs_max_pos, lhs_max_neg) = lhs.max_abs(proper_max); let scalar = BigUint::from_usize(s.unsigned_abs()).unwrap(); - // Optimization opportunity: since `s` is a constant, we can likely do better than this bound. + // Optimization opportunity: since `s` is a constant, we can likely do better than + // this bound. (lhs_max_pos + &scalar, lhs_max_neg + &scalar) } SymbolicExpr::IntMul(lhs, s) => { @@ -243,8 +244,8 @@ impl SymbolicExpr { } /// Returns the maximum possible size, in bits, of each limb in `self.expr`. - /// This is already tracked in `FieldVariable`. However when auto saving in `FieldVariable::div`, - /// we need to know it from the `SymbolicExpr` only. + /// This is already tracked in `FieldVariable`. However when auto saving in + /// `FieldVariable::div`, we need to know it from the `SymbolicExpr` only. /// self should be a constraint expr. pub fn constraint_limb_max_abs(&self, limb_bits: usize, num_limbs: usize) -> usize { let canonical_limb_max_abs = (1 << limb_bits) - 1; diff --git a/crates/circuits/mod-builder/src/tests.rs b/crates/circuits/mod-builder/src/tests.rs index b0ed723b19..d217c0c5c2 100644 --- a/crates/circuits/mod-builder/src/tests.rs +++ b/crates/circuits/mod-builder/src/tests.rs @@ -135,8 +135,8 @@ fn test_auto_carry_intmul() { let mut x3 = &mut x1 * &mut x2; // The int_mul below will overflow: // x3 should have max_overflow_bits = 8 + 8 + log2(32) = 21 - // The carry bits = "max_overflow_bits - limb_bits + 1" will exceed 17 if it exceeds 17 + 8 - 1 = 24. - // So it triggers x3 to be saved first. + // The carry bits = "max_overflow_bits - limb_bits + 1" will exceed 17 if it exceeds 17 + 8 - 1 + // = 24. So it triggers x3 to be saved first. let mut x4 = x3.int_mul(9); assert_eq!(x3.expr, SymbolicExpr::Var(0)); x4.save(); @@ -229,7 +229,8 @@ fn test_auto_carry_div() { let x2 = ExprBuilder::new_input(builder.clone()); // The choice of scalar (7) needs to be such that // 1. the denominator 7x^2 doesn't trigger autosave, >=8 doesn't work. - // 2. But doing a division on it triggers autosave, because of division constraint, <= 6 doesn't work. + // 2. But doing a division on it triggers autosave, because of division constraint, <= 6 doesn't + // work. let mut x3 = x1.square().int_mul(7) / x2; x3.save(); @@ -387,8 +388,9 @@ fn test_symbolic_limbs_mul() { Box::new(SymbolicExpr::Var(0)), Box::new(SymbolicExpr::Var(1)), ); - // x * y = pq, and x,y can be up to 2^256 - 1 so q can be up to ceil((2^256 - 1)^2 / p) which has 257 bits, which is 33 limbs - // x * y has 63 limbs, but p * q can have 64 limbs since q is 33 limbs + // x * y = pq, and x,y can be up to 2^256 - 1 so q can be up to ceil((2^256 - 1)^2 / p) which + // has 257 bits, which is 33 limbs x * y has 63 limbs, but p * q can have 64 limbs since q + // is 33 limbs let expected_q = 33; let expected_carry = 64; test_symbolic_limbs(expr, expected_q, expected_carry); diff --git a/crates/circuits/poseidon2-air/src/config.rs b/crates/circuits/poseidon2-air/src/config.rs index 4519784b59..be597c6dc6 100644 --- a/crates/circuits/poseidon2-air/src/config.rs +++ b/crates/circuits/poseidon2-air/src/config.rs @@ -8,7 +8,8 @@ use super::{ BABY_BEAR_POSEIDON2_HALF_FULL_ROUNDS, BABY_BEAR_POSEIDON2_PARTIAL_ROUNDS, POSEIDON2_WIDTH, }; -// Currently only contains round constants, but this struct may contain other configuration parameters in the future. +// Currently only contains round constants, but this struct may contain other configuration +// parameters in the future. #[derive(Clone, Copy, Debug)] pub struct Poseidon2Config { pub constants: Poseidon2Constants, diff --git a/crates/circuits/poseidon2-air/src/lib.rs b/crates/circuits/poseidon2-air/src/lib.rs index db8d825e20..8a51ee88c7 100644 --- a/crates/circuits/poseidon2-air/src/lib.rs +++ b/crates/circuits/poseidon2-air/src/lib.rs @@ -2,7 +2,8 @@ //! get around some complications with field-specific generics associated with Poseidon2. //! Currently it is only intended for use in OpenVM with BabyBear. //! -//! We do not recommend external use of this crate, and suggest using the [p3_poseidon2_air] crate directly. +//! We do not recommend external use of this crate, and suggest using the [p3_poseidon2_air] crate +//! directly. use std::sync::Arc; @@ -39,7 +40,8 @@ pub const BABY_BEAR_POSEIDON2_PARTIAL_ROUNDS: usize = 13; // Currently we only support SBOX_DEGREE = 7 pub const BABY_BEAR_POSEIDON2_SBOX_DEGREE: u64 = 7; -/// `SBOX_REGISTERS` affects the max constraint degree of the AIR. See [p3_poseidon2_air] for more details. +/// `SBOX_REGISTERS` affects the max constraint degree of the AIR. See [p3_poseidon2_air] for more +/// details. #[derive(Debug)] pub struct Poseidon2SubChip { // This is Arc purely because Poseidon2Air cannot derive Clone diff --git a/crates/circuits/poseidon2-air/src/permute.rs b/crates/circuits/poseidon2-air/src/permute.rs index d239928cd5..db3ecb0496 100644 --- a/crates/circuits/poseidon2-air/src/permute.rs +++ b/crates/circuits/poseidon2-air/src/permute.rs @@ -18,14 +18,16 @@ pub trait Poseidon2MatrixConfig: Clone + Sync { fn int_diag_m1_matrix() -> [F; WIDTH]; } -/// This type needs to implement GenericPoseidon2LinearLayers generic in F so that our Poseidon2SubAir can also -/// be generic in F, but in reality each implementation of this struct's functions should be field specific. To -/// circumvent this, Poseidon2LinearLayers is generic in F but **currently requires** that F is BabyBear. +/// This type needs to implement GenericPoseidon2LinearLayers generic in F so that our +/// Poseidon2SubAir can also be generic in F, but in reality each implementation of this struct's +/// functions should be field specific. To circumvent this, Poseidon2LinearLayers is generic in F +/// but **currently requires** that F is BabyBear. #[derive(Debug, Clone)] pub struct BabyBearPoseidon2LinearLayers; -// This is the same as the implementation for GenericPoseidon2LinearLayersMonty31 except that we drop the -// clause that FA needs be multipliable by BabyBear. +// This is the same as the implementation for +// GenericPoseidon2LinearLayersMonty31 except +// that we drop the clause that FA needs be multipliable by BabyBear. // TODO[jpw/stephen]: This is clearly not the best way to do this, but it would // require some reworking in plonky3 to get around the generics. impl GenericPoseidon2LinearLayers for BabyBearPoseidon2LinearLayers { diff --git a/crates/circuits/primitives/derive/src/lib.rs b/crates/circuits/primitives/derive/src/lib.rs index 1cece4e3fb..47ff1e220a 100644 --- a/crates/circuits/primitives/derive/src/lib.rs +++ b/crates/circuits/primitives/derive/src/lib.rs @@ -38,7 +38,8 @@ pub fn aligned_borrow_derive(input: TokenStream) -> TokenStream { }) .collect::>(); - // Get impl generics (``), type generics (``), where clause (`where T: Clone`) + // Get impl generics (``), type generics (``), where + // clause (`where T: Clone`) let (impl_generics, type_generics, where_clause) = ast.generics.split_for_impl(); let methods = quote! { @@ -331,8 +332,8 @@ pub fn bytes_stateful_derive(input: TokenStream) -> TokenStream { } _ => panic!("Only unnamed fields are supported"), }; - // Use full path ::openvm_circuit... so it can be used either within or outside the vm crate. - // Assume F is already generic of the field. + // Use full path ::openvm_circuit... so it can be used either within or outside the vm + // crate. Assume F is already generic of the field. let mut new_generics = generics.clone(); let where_clause = new_generics.make_where_clause(); where_clause @@ -365,7 +366,8 @@ pub fn bytes_stateful_derive(input: TokenStream) -> TokenStream { (variant_name, field) }) .collect::>(); - // Use full path ::openvm_stark_backend... so it can be used either within or outside the vm crate. + // Use full path ::openvm_stark_backend... so it can be used either within or outside + // the vm crate. let (load_state_arms, store_state_arms): (Vec<_>, Vec<_>) = multiunzip(variants.iter().map(|(variant_name, field)| { let field_ty = &field.ty; diff --git a/crates/circuits/primitives/src/assert_less_than/mod.rs b/crates/circuits/primitives/src/assert_less_than/mod.rs index 78f454f36b..53054c713a 100644 --- a/crates/circuits/primitives/src/assert_less_than/mod.rs +++ b/crates/circuits/primitives/src/assert_less_than/mod.rs @@ -131,10 +131,11 @@ impl AssertLtSubAir { }); // constrain that y - x - 1 is equal to the constructed lower value. - // this enforces that the intermediate value is in the range [0, 2^max_bits - 1], which is equivalent to x < y + // this enforces that the intermediate value is in the range [0, 2^max_bits - 1], which is + // equivalent to x < y builder.when(io.count).assert_eq(intermed_val, lower); - // the degree of this constraint is expected to be deg(count) + max(deg(intermed_val), deg(lower)) - // since we are constraining count * intermed_val == count * lower + // the degree of this constraint is expected to be deg(count) + max(deg(intermed_val), + // deg(lower)) since we are constraining count * intermed_val == count * lower } #[inline(always)] @@ -185,7 +186,8 @@ impl SubAir for AssertLtSubAir { impl TraceSubRowGenerator for AssertLtSubAir { /// (range_checker, x, y) - // x, y are u32 because memory records are storing u32 and there would be needless conversions. It also prevents a F: PrimeField32 trait bound. + // x, y are u32 because memory records are storing u32 and there would be needless conversions. + // It also prevents a F: PrimeField32 trait bound. type TraceContext<'a> = (&'a VariableRangeCheckerChip, u32, u32); /// lower_decomp type ColsMut<'a> = &'a mut [F]; diff --git a/crates/circuits/primitives/src/bigint/check_carry_mod_to_zero.rs b/crates/circuits/primitives/src/bigint/check_carry_mod_to_zero.rs index e99b4c6a9c..35b00c63b2 100644 --- a/crates/circuits/primitives/src/bigint/check_carry_mod_to_zero.rs +++ b/crates/circuits/primitives/src/bigint/check_carry_mod_to_zero.rs @@ -18,8 +18,8 @@ pub struct CheckCarryModToZeroCols { pub carries: Vec, // We will check that expr - quotient * modulus = 0, which imples expr is 0 mod modulus. - // quotient can be negative, and this means there is no unique way to represent it as limbs but it's fine. - // Each limb will be range-checked to be in [-2^limb_bits, 2^limb_bits). + // quotient can be negative, and this means there is no unique way to represent it as limbs but + // it's fine. Each limb will be range-checked to be in [-2^limb_bits, 2^limb_bits). pub quotient: Vec, } diff --git a/crates/circuits/primitives/src/bigint/mod.rs b/crates/circuits/primitives/src/bigint/mod.rs index 3e57ffa343..83305a2689 100644 --- a/crates/circuits/primitives/src/bigint/mod.rs +++ b/crates/circuits/primitives/src/bigint/mod.rs @@ -36,7 +36,8 @@ impl OverflowInt { } } - // Limbs can be negative. So the max_overflow_bits and limb_max_abs are different from the range check result. + // Limbs can be negative. So the max_overflow_bits and limb_max_abs are different from the range + // check result. pub fn from_canonical_signed_limbs(x: Vec, limb_bits: usize) -> OverflowInt { OverflowInt { limbs: x, diff --git a/crates/circuits/primitives/src/encoder/mod.rs b/crates/circuits/primitives/src/encoder/mod.rs index 31309e9865..b162518757 100644 --- a/crates/circuits/primitives/src/encoder/mod.rs +++ b/crates/circuits/primitives/src/encoder/mod.rs @@ -20,7 +20,8 @@ pub struct Encoder { /// The number of flags, excluding the invalid/dummy flag. flag_cnt: usize, /// Maximal degree of the flag expressions. - /// The maximal degree of the equalities in the AIR, however, **is one higher:** that is, `max_flag_degree + 1`. + /// The maximal degree of the equalities in the AIR, however, **is one higher:** that is, + /// `max_flag_degree + 1`. max_flag_degree: u32, /// All possible points in the k-dimensional space that can be used to encode flags pts: Vec>, @@ -34,7 +35,8 @@ impl Encoder { /// The zero point is reserved for the dummy row. /// `max_degree` is the upper bound for the flag expressions, but the `eval` function /// of the encoder itself will use some constraints of degree `max_degree + 1`. - /// `reserve_invalid` indicates if the encoder should reserve the (0, ..., 0) point as an invalid/dummy flag. + /// `reserve_invalid` indicates if the encoder should reserve the (0, ..., 0) point as an + /// invalid/dummy flag. pub fn new(cnt: usize, max_degree: u32, reserve_invalid: bool) -> Self { // Calculate binomial coefficient (d+k choose k) to determine how many points we can encode let binomial = |x: u32| { @@ -109,7 +111,8 @@ impl Encoder { expr * denom.inverse() } - /// Get the polynomial expression that equals 1 when the variables encode the flag at index flag_idx + /// Get the polynomial expression that equals 1 when the variables encode the flag at index + /// flag_idx pub fn get_flag_expr( &self, flag_idx: usize, @@ -125,7 +128,8 @@ impl Encoder { self.pts[flag_idx + self.reserve_invalid as usize].clone() } - /// Returns an expression that is 1 if the variables encode a valid flag and 0 if they encode the invalid point + /// Returns an expression that is 1 if the variables encode a valid flag and 0 if they encode + /// the invalid point pub fn is_valid(&self, vars: &[AB::Var]) -> AB::Expr { AB::Expr::ONE - self.expression_for_point::(&self.pts[0], vars) } diff --git a/crates/circuits/primitives/src/is_equal/mod.rs b/crates/circuits/primitives/src/is_equal/mod.rs index c7bdaac139..7a2ec362ab 100644 --- a/crates/circuits/primitives/src/is_equal/mod.rs +++ b/crates/circuits/primitives/src/is_equal/mod.rs @@ -16,8 +16,8 @@ pub struct IsEqualIo { pub y: T, /// The boolean output, constrained to equal (x == y), when `condition != 0`. pub out: T, - /// Constraints only hold when `condition != 0`. When `condition == 0`, setting all trace values - /// to zero still passes the constraints. + /// Constraints only hold when `condition != 0`. When `condition == 0`, setting all trace + /// values to zero still passes the constraints. pub condition: T, } diff --git a/crates/circuits/primitives/src/is_equal_array/mod.rs b/crates/circuits/primitives/src/is_equal_array/mod.rs index b6adc4f9fb..586c29333b 100644 --- a/crates/circuits/primitives/src/is_equal_array/mod.rs +++ b/crates/circuits/primitives/src/is_equal_array/mod.rs @@ -14,8 +14,8 @@ pub struct IsEqArrayIo { pub y: [T; NUM], /// The boolean output, constrained to equal (x == y) when `condition != 0`. pub out: T, - /// Constraints only hold when `condition != 0`. When `condition == 0`, setting all trace values - /// to zero still passes the constraints. + /// Constraints only hold when `condition != 0`. When `condition == 0`, setting all trace + /// values to zero still passes the constraints. pub condition: T, } @@ -51,7 +51,8 @@ impl SubAir for IsEqArraySubAir { let mut sum = io.out.clone(); // If x == y: then sum == 1 implies out = 1. // If x != y: then out * (x[i] - y[i]) == 0 implies out = 0. - // to get the sum == 1 to be satisfied, we set diff_inv_marker[i] = (x[i] - y[i])^{-1} at the first index i such that x[i] != y[i]. + // to get the sum == 1 to be satisfied, we set diff_inv_marker[i] = (x[i] - + // y[i])^{-1} at the first index i such that x[i] != y[i]. for (x_i, y_i, inv_marker_i) in izip!(io.x, io.y, diff_inv_marker) { sum += (x_i.clone() - y_i.clone()) * inv_marker_i; builder.assert_zero(io.out.clone() * (x_i - y_i)); diff --git a/crates/circuits/primitives/src/is_less_than/mod.rs b/crates/circuits/primitives/src/is_less_than/mod.rs index b980679416..b4fc8948f8 100644 --- a/crates/circuits/primitives/src/is_less_than/mod.rs +++ b/crates/circuits/primitives/src/is_less_than/mod.rs @@ -75,8 +75,8 @@ pub struct IsLtSubAir { pub bus: VariableRangeCheckerBus, /// The maximum number of bits for the numbers to compare /// Soundness requirement: max_bits <= 29 - /// max_bits > 29 doesn't work: the approach is to decompose and range check `y - x - 1 + 2^max_bits` is non-negative. - /// This requires 2^{max_bits+1} < |F|. + /// max_bits > 29 doesn't work: the approach is to decompose and range check `y - x - 1 + + /// 2^max_bits` is non-negative. This requires 2^{max_bits+1} < |F|. /// When F::bits() = 31, this implies max_bits <= 29. pub max_bits: usize, /// `decomp_limbs = max_bits.div_ceil(bus.range_max_bits)`. @@ -135,7 +135,8 @@ impl IsLtSubAir { let out = out.into(); // constrain that the lower + out * 2^max_bits is the correct intermediate sum let check_val = lower + out.clone() * AB::Expr::from_canonical_usize(1 << self.max_bits); - // the degree of this constraint is expected to be deg(count) + max(deg(intermed_val), deg(lower)) + // the degree of this constraint is expected to be deg(count) + max(deg(intermed_val), + // deg(lower)) builder.when(condition).assert_eq(intermed_val, check_val); builder.assert_bool(out); } diff --git a/crates/circuits/primitives/src/is_less_than/tests.rs b/crates/circuits/primitives/src/is_less_than/tests.rs index 1136da01e9..a9f211b659 100644 --- a/crates/circuits/primitives/src/is_less_than/tests.rs +++ b/crates/circuits/primitives/src/is_less_than/tests.rs @@ -33,8 +33,8 @@ pub struct IsLessThanCols { pub lower_decomp: Vec, } -/// Note that this air has no const generics. The parameters such as `max_bits, decomp_limbs` are all -/// configured in the constructor at runtime. +/// Note that this air has no const generics. The parameters such as `max_bits, decomp_limbs` are +/// all configured in the constructor at runtime. #[derive(Clone, Copy)] pub struct IsLtTestAir(pub IsLtSubAir); @@ -94,7 +94,8 @@ impl IsLessThanChip { } } -// We create a custom struct of mutable references since `IsLessThanCols` cannot derive `AlignedBorrow`. +// We create a custom struct of mutable references since `IsLessThanCols` cannot derive +// `AlignedBorrow`. pub struct IsLessThanColsMut<'a, T> { pub x: &'a mut T, pub y: &'a mut T, diff --git a/crates/circuits/primitives/src/is_less_than_array/mod.rs b/crates/circuits/primitives/src/is_less_than_array/mod.rs index f0e8d04c1e..5113a83ad7 100644 --- a/crates/circuits/primitives/src/is_less_than_array/mod.rs +++ b/crates/circuits/primitives/src/is_less_than_array/mod.rs @@ -21,8 +21,8 @@ pub mod tests; pub struct IsLtArrayIo { pub x: [T; NUM], pub y: [T; NUM], - /// The boolean output, constrained to equal (x < y) when `condition != 0`. The less than comparison - /// is done lexicographically. + /// The boolean output, constrained to equal (x < y) when `condition != 0`. The less than + /// comparison is done lexicographically. pub out: T, /// Constraints only hold when `count != 0`. When `count == 0`, setting all trace values /// to zero still passes the constraints. @@ -34,7 +34,8 @@ pub struct IsLtArrayIo { #[derive(AlignedBorrow, Clone, Copy, Debug)] pub struct IsLtArrayAuxCols { // `diff_marker` is filled with 0 except at the lowest index i such that - // `x[i] != y[i]`. If such an `i` exists then it is constrained that `diff_inv = inv(y[i] - x[i])`. + // `x[i] != y[i]`. If such an `i` exists then it is constrained that `diff_inv = inv(y[i] - + // x[i])`. pub diff_marker: [T; NUM], pub diff_inv: T, pub lt_aux: LessThanAuxCols, @@ -135,11 +136,12 @@ impl IsLtArraySubAir { } builder.assert_bool(prefix_sum.clone()); // When condition != 0, - // - If `x != y`, then `prefix_sum = 1` so marker[i] must be nonzero iff - // i is the first index where `x[i] != y[i]`. Constrains that - // `diff_inv * (y[i] - x[i]) = 1` (`diff_val` is non-zero). + // - If `x != y`, then `prefix_sum = 1` so marker[i] must be nonzero iff i is the first + // index where `x[i] != y[i]`. Constrains that `diff_inv * (y[i] - x[i]) = 1` (`diff_val` + // is non-zero). // - If `x == y`, then `prefix_sum = 0` and `out == 0` (below) - // - `prefix_sum` cannot be 1 because all diff are zero and it would be impossible to find an inverse. + // - `prefix_sum` cannot be 1 because all diff are zero and it would be impossible to + // find an inverse. builder .when(io.count.clone()) diff --git a/crates/circuits/primitives/src/is_less_than_array/tests.rs b/crates/circuits/primitives/src/is_less_than_array/tests.rs index 4e9f69a1b7..b709ef5b9d 100644 --- a/crates/circuits/primitives/src/is_less_than_array/tests.rs +++ b/crates/circuits/primitives/src/is_less_than_array/tests.rs @@ -66,11 +66,11 @@ impl Air } /// This chip computes whether one tuple is lexicographically less than another. Each element of the -/// tuple has its own max number of bits, given by the limb_bits array. The chip assumes that each limb -/// is within its given max limb_bits. +/// tuple has its own max number of bits, given by the limb_bits array. The chip assumes that each +/// limb is within its given max limb_bits. /// -/// The IsLessThanTupleChip uses the IsLessThanChip as a subchip to check whether individual tuple elements -/// are less than each other. +/// The IsLessThanTupleChip uses the IsLessThanChip as a subchip to check whether individual tuple +/// elements are less than each other. pub struct IsLtArrayChip { pub air: IsLtArrayTestAir, pub range_checker: Arc, diff --git a/crates/circuits/primitives/src/is_zero/mod.rs b/crates/circuits/primitives/src/is_zero/mod.rs index 951d134256..9d2944416c 100644 --- a/crates/circuits/primitives/src/is_zero/mod.rs +++ b/crates/circuits/primitives/src/is_zero/mod.rs @@ -13,8 +13,8 @@ pub struct IsZeroIo { pub x: T, /// The boolean output, constrained to equal (x == 0) when `condition != 0`.. pub out: T, - /// Constraints only hold when `condition != 0`. When `condition == 0`, setting all trace values - /// to zero still passes the constraints. + /// Constraints only hold when `condition != 0`. When `condition == 0`, setting all trace + /// values to zero still passes the constraints. pub condition: T, } diff --git a/crates/circuits/primitives/src/lib.rs b/crates/circuits/primitives/src/lib.rs index c03cfd0b90..723cc017f1 100644 --- a/crates/circuits/primitives/src/lib.rs +++ b/crates/circuits/primitives/src/lib.rs @@ -1,5 +1,6 @@ //! This crate contains a collection of primitives for use when building circuits. -//! The primitives are separated into two types: standalone [Air](openvm_stark_backend::p3_air::Air)s and [SubAir]s. +//! The primitives are separated into two types: standalone +//! [Air](openvm_stark_backend::p3_air::Air)s and [SubAir]s. //! //! The following modules contain standalone [Air](openvm_stark_backend::p3_air::Air)s: //! - [range] diff --git a/crates/circuits/primitives/src/range/bus.rs b/crates/circuits/primitives/src/range/bus.rs index 988d1a131c..e7315dd635 100644 --- a/crates/circuits/primitives/src/range/bus.rs +++ b/crates/circuits/primitives/src/range/bus.rs @@ -20,7 +20,8 @@ impl RangeCheckBus { /// Range check that `x` is in the range `[0, 2^max_bits)`. /// - /// This can be used when `2^max_bits < self.range_max` **if `2 * self.range_max` is less than the field modulus**. + /// This can be used when `2^max_bits < self.range_max` **if `2 * self.range_max` is less than + /// the field modulus**. pub fn range_check( &self, x: impl Into, @@ -97,10 +98,13 @@ impl BitsCheckBusInteraction { { let count = count.into(); if self.shift > 0 { - // if 2^max_bits < range_max, then we also range check that `x + (range_max - 2^max_bits) < range_max` + // if 2^max_bits < range_max, then we also range check that `x + (range_max - + // 2^max_bits) < range_max` // - this will hold if `x < 2^max_bits` (necessary) - // - if `x < range_max` then we know the integer value `x.as_canonical_u32() + (range_max - 2^max_bits) < 2*range_max`. - // **Assuming that `2*range_max < F::MODULUS`, then additionally knowing `x + (range_max - 2^max_bits) < range_max` implies `x < 2^max_bits`. + // - if `x < range_max` then we know the integer value `x.as_canonical_u32() + + // (range_max - 2^max_bits) < 2*range_max`. **Assuming that `2*range_max < + // F::MODULUS`, then additionally knowing `x + (range_max - 2^max_bits) < range_max` + // implies `x < 2^max_bits`. self.bus.lookup_key( builder, [self.x.clone() + AB::Expr::from_canonical_u32(self.shift)], diff --git a/crates/circuits/primitives/src/range/mod.rs b/crates/circuits/primitives/src/range/mod.rs index 87ffe1cf7f..39dd70aae7 100644 --- a/crates/circuits/primitives/src/range/mod.rs +++ b/crates/circuits/primitives/src/range/mod.rs @@ -1,6 +1,7 @@ //! Range check for a fixed bit size via preprocessed trace. //! -//! Caution: We almost always prefer to use the [VariableRangeCheckerChip](super::var_range::VariableRangeCheckerChip) instead of this chip. +//! Caution: We almost always prefer to use the +//! [VariableRangeCheckerChip](super::var_range::VariableRangeCheckerChip) instead of this chip. // Adapted from Valida use core::mem::size_of; diff --git a/crates/circuits/primitives/src/range_gate/mod.rs b/crates/circuits/primitives/src/range_gate/mod.rs index 214994cf17..7c1a877c49 100644 --- a/crates/circuits/primitives/src/range_gate/mod.rs +++ b/crates/circuits/primitives/src/range_gate/mod.rs @@ -1,6 +1,7 @@ //! Range check for a fixed bit size without using preprocessed trace. //! -//! Caution: We almost always prefer to use the [VariableRangeCheckerChip](super::var_range::VariableRangeCheckerChip) instead of this chip. +//! Caution: We almost always prefer to use the +//! [VariableRangeCheckerChip](super::var_range::VariableRangeCheckerChip) instead of this chip. use std::{ borrow::Borrow, diff --git a/crates/circuits/primitives/src/range_tuple/mod.rs b/crates/circuits/primitives/src/range_tuple/mod.rs index 1b797b1078..3d0754cc9a 100644 --- a/crates/circuits/primitives/src/range_tuple/mod.rs +++ b/crates/circuits/primitives/src/range_tuple/mod.rs @@ -1,7 +1,8 @@ //! Range check a tuple simultaneously. //! When you know you want to range check `(x, y)` to `x_bits, y_bits` respectively -//! and `2^{x_bits + y_bits} < ~2^20`, then you can use this chip to do the range check in one interaction -//! versus the two interactions necessary if you were to use [VariableRangeCheckerChip](super::var_range::VariableRangeCheckerChip) instead. +//! and `2^{x_bits + y_bits} < ~2^20`, then you can use this chip to do the range check in one +//! interaction versus the two interactions necessary if you were to use +//! [VariableRangeCheckerChip](super::var_range::VariableRangeCheckerChip) instead. use std::{ mem::size_of, diff --git a/crates/circuits/primitives/src/sub_air.rs b/crates/circuits/primitives/src/sub_air.rs index c9d4ccd471..56b1435f8b 100644 --- a/crates/circuits/primitives/src/sub_air.rs +++ b/crates/circuits/primitives/src/sub_air.rs @@ -15,8 +15,8 @@ use openvm_stark_backend::p3_air::AirBuilder; /// the `SubAir` from the `Io` part. These `AuxCols` are typically just slices of `AB::Var`. /// /// This trait only owns the constraints, but it is expected that the [TraceSubRowGenerator] trait -/// or some analogous functionality is also implemented so that the trace generation of the `AuxCols` -/// of each row can be done purely in terms of the `Io` part. +/// or some analogous functionality is also implemented so that the trace generation of the +/// `AuxCols` of each row can be done purely in terms of the `Io` part. pub trait SubAir { /// Type to define the context, typically in terms of `AB::Expr` that are needed /// to define the SubAir's constraints. @@ -38,12 +38,14 @@ pub trait SubAir { // [jpw] This could be part of SubAir, but I want to keep SubAir to be constraints only pub trait TraceSubRowGenerator { /// The minimal amount of information needed to generate the sub-row of the trace matrix. - /// This type has a lifetime so other context, such as references to other chips, can be provided. + /// This type has a lifetime so other context, such as references to other chips, can be + /// provided. type TraceContext<'a> where Self: 'a; - /// The type for the columns to mutate. Often this can be `&'a mut Cols` if `Cols` is on the stack. - /// For structs that use the heap, this should be a struct that contains mutable slices. + /// The type for the columns to mutate. Often this can be `&'a mut Cols` if `Cols` is on the + /// stack. For structs that use the heap, this should be a struct that contains mutable + /// slices. type ColsMut<'a> where Self: 'a; diff --git a/crates/circuits/primitives/src/var_range/mod.rs b/crates/circuits/primitives/src/var_range/mod.rs index 0475f69489..1ba3f2e776 100644 --- a/crates/circuits/primitives/src/var_range/mod.rs +++ b/crates/circuits/primitives/src/var_range/mod.rs @@ -134,7 +134,8 @@ impl VariableRangeCheckerChip { )] pub fn add_count(&self, value: u32, max_bits: usize) { // index is 2^max_bits + value - 1 + 1 for the extra [0, 0] row - // if each [value, max_bits] is valid, the sends multiset will be exactly the receives multiset + // if each [value, max_bits] is valid, the sends multiset will be exactly the receives + // multiset let idx = (1 << max_bits) + (value as usize); assert!( idx < self.count.len(), diff --git a/crates/circuits/primitives/src/xor/lookup/mod.rs b/crates/circuits/primitives/src/xor/lookup/mod.rs index 3e968c460b..c9e76ad4c9 100644 --- a/crates/circuits/primitives/src/xor/lookup/mod.rs +++ b/crates/circuits/primitives/src/xor/lookup/mod.rs @@ -50,7 +50,8 @@ pub struct XorLookupPreprocessedCols { pub const NUM_XOR_LOOKUP_COLS: usize = size_of::>(); pub const NUM_XOR_LOOKUP_PREPROCESSED_COLS: usize = size_of::>(); -/// Xor via preprocessed lookup table. Can only be used if inputs have less than approximately 10-bits. +/// Xor via preprocessed lookup table. Can only be used if inputs have less than approximately +/// 10-bits. #[derive(Clone, Copy, Debug, derive_new::new)] pub struct XorLookupAir { pub bus: XorBus, @@ -99,7 +100,8 @@ where /// This chip gets requests to compute the xor of two numbers x and y of at most M bits. /// It generates a preprocessed table with a row for each possible triple (x, y, x^y) -/// and keeps count of the number of times each triple is requested for the single main trace column. +/// and keeps count of the number of times each triple is requested for the single main trace +/// column. #[derive(Debug)] pub struct XorLookupChip { pub air: XorLookupAir, diff --git a/crates/circuits/sha256-air/src/air.rs b/crates/circuits/sha256-air/src/air.rs index e47aa96504..96578984d0 100644 --- a/crates/circuits/sha256-air/src/air.rs +++ b/crates/circuits/sha256-air/src/air.rs @@ -76,7 +76,8 @@ impl Sha256Air { let main = builder.main(); let local = main.row_slice(0); - // Doesn't matter which column struct we use here as we are only interested in the common columns + // Doesn't matter which column struct we use here as we are only interested in the common + // columns let local_cols: &Sha256DigestCols = local[start_col..start_col + SHA256_DIGEST_WIDTH].borrow(); let flags = &local_cols.flags; @@ -114,8 +115,8 @@ impl Sha256Air { flags.is_padding_row(), ); - // Constrain a, e, being composed of bits: we make sure a and e are always in the same place in the trace matrix - // Note: this has to be true for every row, even padding rows + // Constrain a, e, being composed of bits: we make sure a and e are always in the same place + // in the trace matrix Note: this has to be true for every row, even padding rows for i in 0..SHA256_ROUNDS_PER_ROW { for j in 0..SHA256_WORD_BITS { builder.assert_bool(local_cols.hash.a[i][j]); @@ -134,7 +135,8 @@ impl Sha256Air { local: &Sha256RoundCols, next: &Sha256DigestCols, ) { - // Check that if this is the last row of a message or an inpadding row, the hash should be the [SHA256_H] + // Check that if this is the last row of a message or an inpadding row, the hash should be + // the [SHA256_H] for i in 0..SHA256_ROUNDS_PER_ROW { let a = next.hash.a[i].map(|x| x.into()); let e = next.hash.e[i].map(|x| x.into()); @@ -142,7 +144,8 @@ impl Sha256Air { let a_limb = compose::(&a[j * 16..(j + 1) * 16], 1); let e_limb = compose::(&e[j * 16..(j + 1) * 16], 1); - // If it is a padding row or the last row of a message, the `hash` should be the [SHA256_H] + // If it is a padding row or the last row of a message, the `hash` should be the + // [SHA256_H] builder .when( next.flags.is_padding_row() @@ -169,7 +172,8 @@ impl Sha256Air { } } - // Check if last row of a non-last block, the `hash` should be equal to the final hash of the current block + // Check if last row of a non-last block, the `hash` should be equal to the final hash of + // the current block for i in 0..SHA256_ROUNDS_PER_ROW { let prev_a = next.hash.a[i].map(|x| x.into()); let prev_e = next.hash.e[i].map(|x| x.into()); @@ -216,7 +220,8 @@ impl Sha256Air { .when(next.flags.is_digest_row) .assert_bool(carry.clone()); } - // constrain the final hash limbs two at a time since we can do two checks per interaction + // constrain the final hash limbs two at a time since we can do two checks per + // interaction for chunk in next.final_hash[i].chunks(2) { self.bitwise_lookup_bus .send_range(chunk[0], chunk[1]) @@ -237,13 +242,14 @@ impl Sha256Air { next[start_col..start_col + SHA256_ROUND_WIDTH].borrow(); let local_is_padding_row = local_cols.flags.is_padding_row(); - // Note that there will always be a padding row in the trace since the unpadded height is a multiple of 17. - // So the next row is padding iff the current block is the last block in the trace. + // Note that there will always be a padding row in the trace since the unpadded height is a + // multiple of 17. So the next row is padding iff the current block is the last + // block in the trace. let next_is_padding_row = next_cols.flags.is_padding_row(); // We check that the very last block has `is_last_block` set to true, which guarantees that - // there is at least one complete message. If other digest rows have `is_last_block` set to true, - // then the trace will be interpreted as containing multiple messages. + // there is at least one complete message. If other digest rows have `is_last_block` set to + // true, then the trace will be interpreted as containing multiple messages. builder .when(next_is_padding_row.clone()) .when(local_cols.flags.is_digest_row) @@ -361,7 +367,8 @@ impl Sha256Air { &self, builder: &mut AB, local: &Sha256DigestCols, - is_last_block_of_trace: AB::Expr, // note this indicates the last block of the trace, not the last block of the message + is_last_block_of_trace: AB::Expr, /* note this indicates the last block of the trace, + * not the last block of the message */ ) { // Constrain that next block's `prev_hash` is equal to the current block's `hash` let composed_hash: [[::Expr; SHA256_WORD_U16S]; SHA256_HASH_WORDS] = @@ -402,9 +409,9 @@ impl Sha256Air { } /// Constrain the message schedule additions for `next` row - /// Note: For every addition we need to constrain the following for each of [SHA256_WORD_U16S] limbs - /// sig_1(w_{t-2})[i] + w_{t-7}[i] + sig_0(w_{t-15})[i] + w_{t-16}[i] + carry_w[t][i-1] - carry_w[t][i] * 2^16 - w_t[i] == 0 - /// Refer to [https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf] + /// Note: For every addition we need to constrain the following for each of [SHA256_WORD_U16S] + /// limbs sig_1(w_{t-2})[i] + w_{t-7}[i] + sig_0(w_{t-15})[i] + w_{t-16}[i] + + /// carry_w[t][i-1] - carry_w[t][i] * 2^16 - w_t[i] == 0 Refer to [https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf] fn eval_message_schedule( &self, builder: &mut AB, @@ -429,12 +436,14 @@ impl Sha256Air { } // Constrain intermed for `next` row - // We will only constrain intermed_12 for rows [3, 14], and let it be unconstrained for other rows - // Other rows should put the needed value in intermed_12 to make the below summation constraint hold + // We will only constrain intermed_12 for rows [3, 14], and let it be unconstrained for + // other rows Other rows should put the needed value in intermed_12 to make the + // below summation constraint hold let is_row_3_14 = self .row_idx_encoder .contains_flag_range::(&next.flags.row_idx, 3..=14); - // We will only constrain intermed_8 for rows [2, 13], and let it unconstrained for other rows + // We will only constrain intermed_8 for rows [2, 13], and let it unconstrained for other + // rows let is_row_2_13 = self .row_idx_encoder .contains_flag_range::(&next.flags.row_idx, 2..=13); @@ -447,8 +456,10 @@ impl Sha256Air { let w_idx_limb = compose::(&w_idx[j * 16..(j + 1) * 16], 1); let sig_w_limb = compose::(&sig_w[j * 16..(j + 1) * 16], 1); - // We would like to constrain this only on rows 0..16, but we can't do a conditional check because the degree is already 3. - // So we must fill in `intermed_4` with dummy values on rows 0 and 16 to ensure the constraint holds on these rows. + // We would like to constrain this only on rows 0..16, but we can't do a conditional + // check because the degree is already 3. So we must fill in + // `intermed_4` with dummy values on rows 0 and 16 to ensure the constraint holds on + // these rows. builder.when_transition().assert_eq( next.schedule_helper.intermed_4[i][j], w_idx_limb + sig_w_limb, @@ -485,11 +496,14 @@ impl Sha256Air { }); // Constrain `W_{idx} = sig_1(W_{idx-2}) + W_{idx-7} + sig_0(W_{idx-15}) + W_{idx-16}` - // We would like to constrain this only on rows 4..16, but we can't do a conditional check because the degree of sum is already 3 - // So we must fill in `intermed_12` with dummy values on rows 0..3 and 15 and 16 to ensure the constraint holds on rows - // 0..4 and 16. Note that the dummy value goes in the previous row to make the current row's constraint hold. + // We would like to constrain this only on rows 4..16, but we can't do a conditional + // check because the degree of sum is already 3 So we must fill in + // `intermed_12` with dummy values on rows 0..3 and 15 and 16 to ensure the constraint + // holds on rows 0..4 and 16. Note that the dummy value goes in the previous + // row to make the current row's constraint hold. constraint_word_addition( - // Note: here we can't do a conditional check because the degree of sum is already 3 + // Note: here we can't do a conditional check because the degree of sum is already + // 3 &mut builder.when_transition(), &[&small_sig1_field::(&w[i + 2])], &[&w_7, &intermed_16], @@ -528,8 +542,9 @@ impl Sha256Air { let e = [local.work_vars.e, next.work_vars.e].concat(); for i in 0..SHA256_ROUNDS_PER_ROW { for j in 0..SHA256_WORD_U16S { - // Although we need carry_a <= 6 and carry_e <= 5, constraining carry_a, carry_e in [0, 2^8) is enough - // to prevent overflow and ensure the soundness of the addition we want to check + // Although we need carry_a <= 6 and carry_e <= 5, constraining carry_a, carry_e in + // [0, 2^8) is enough to prevent overflow and ensure the soundness + // of the addition we want to check self.bitwise_lookup_bus .send_range(local.work_vars.carry_a[i][j], local.work_vars.carry_e[i][j]) .eval(builder, local.flags.is_round_row); @@ -556,16 +571,19 @@ impl Sha256Air { }); // Constrain `a = h + sig_1(e) + ch(e, f, g) + K + W + sig_0(a) + Maj(a, b, c)` - // We have to enforce this constraint on all rows since the degree of the constraint is already 3. - // So, we must fill in `carry_a` with dummy values on digest rows to ensure the constraint holds. + // We have to enforce this constraint on all rows since the degree of the constraint is + // already 3. So, we must fill in `carry_a` with dummy values on digest rows + // to ensure the constraint holds. constraint_word_addition( builder, &[ - &e[i].map(|x| x.into()), // previous `h` + &e[i].map(|x| x.into()), // previous `h` &big_sig1_field::(&e[i + 3]), // sig_1 of previous `e` - &ch_field::(&e[i + 3], &e[i + 2], &e[i + 1]), // Ch of previous `e`, `f`, `g` - &big_sig0_field::(&a[i + 3]), // sig_0 of previous `a` - &maj_field::(&a[i + 3], &a[i + 2], &a[i + 1]), // Maj of previous a, b, c + &ch_field::(&e[i + 3], &e[i + 2], &e[i + 1]), /* Ch of previous + * `e`, `f`, `g` */ + &big_sig0_field::(&a[i + 3]), // sig_0 of previous `a` + &maj_field::(&a[i + 3], &a[i + 2], &a[i + 1]), /* Maj of previous + * a, b, c */ ], &[&w_limbs, &k_limbs], // K and W &a[i + 4], // new `a` @@ -573,15 +591,18 @@ impl Sha256Air { ); // Constrain `e = d + h + sig_1(e) + ch(e, f, g) + K + W` - // We have to enforce this constraint on all rows since the degree of the constraint is already 3. - // So, we must fill in `carry_e` with dummy values on digest rows to ensure the constraint holds. + // We have to enforce this constraint on all rows since the degree of the constraint is + // already 3. So, we must fill in `carry_e` with dummy values on digest rows + // to ensure the constraint holds. constraint_word_addition( builder, &[ - &a[i].map(|x| x.into()), // previous `d` - &e[i].map(|x| x.into()), // previous `h` - &big_sig1_field::(&e[i + 3]), // sig_1 of previous `e` - &ch_field::(&e[i + 3], &e[i + 2], &e[i + 1]), // Ch of previous `e`, `f`, `g` + &a[i].map(|x| x.into()), // previous `d` + &e[i].map(|x| x.into()), // previous `h` + &big_sig1_field::(&e[i + 3]), /* sig_1 of previous + * `e` */ + &ch_field::(&e[i + 3], &e[i + 2], &e[i + 1]), /* Ch of previous + * `e`, `f`, `g` */ ], &[&w_limbs, &k_limbs], // K and W &e[i + 4], // new `e` diff --git a/crates/circuits/sha256-air/src/columns.rs b/crates/circuits/sha256-air/src/columns.rs index 173aca0943..1c735394c3 100644 --- a/crates/circuits/sha256-air/src/columns.rs +++ b/crates/circuits/sha256-air/src/columns.rs @@ -12,8 +12,9 @@ use super::{ /// - First 16 rows use Sha256RoundCols /// - Final row uses Sha256DigestCols /// -/// Note that for soundness, we require that there is always a padding row after the last digest row in the trace. -/// Right now, this is true because the unpadded height is a multiple of 17, and thus not a power of 2. +/// Note that for soundness, we require that there is always a padding row after the last digest row +/// in the trace. Right now, this is true because the unpadded height is a multiple of 17, and thus +/// not a power of 2. /// /// Sha256RoundCols and Sha256DigestCols share the same first 3 fields: /// - flags @@ -22,7 +23,8 @@ use super::{ /// /// This design allows for: /// 1. Common constraints to work on either struct type by accessing these shared fields -/// 2. Specific constraints to use the appropriate struct, with flags helping to do conditional constraints +/// 2. Specific constraints to use the appropriate struct, with flags helping to do conditional +/// constraints /// /// Note that the `Sha256WorkVarsCols` field it is used for different purposes in the two structs. #[repr(C)] @@ -60,8 +62,9 @@ pub struct Sha256MessageScheduleCols { /// The message schedule words as 32-bit integers /// The first 16 words will be the message data pub w: [[T; SHA256_WORD_BITS]; SHA256_ROUNDS_PER_ROW], - /// Will be message schedule carries for rows 4..16 and a buffer for rows 0..4 to be used freely by wrapper chips - /// Note: carries are 2 bit numbers represented using 2 cells as individual bits + /// Will be message schedule carries for rows 4..16 and a buffer for rows 0..4 to be used + /// freely by wrapper chips Note: carries are 2 bit numbers represented using 2 cells as + /// individual bits pub carry_or_buffer: [[T; SHA256_WORD_U8S]; SHA256_ROUNDS_PER_ROW], } @@ -87,7 +90,8 @@ pub struct Sha256MessageHelperCols { pub w_3: [[T; SHA256_WORD_U16S]; SHA256_ROUNDS_PER_ROW - 1], /// Here intermediate(i) = w_i + sig_0(w_{i+1}) /// Intermed_t represents the intermediate t rounds ago - /// This is needed to constrain the message schedule, since we can only constrain on two rows at a time + /// This is needed to constrain the message schedule, since we can only constrain on two rows + /// at a time pub intermed_4: [[T; SHA256_WORD_U16S]; SHA256_ROUNDS_PER_ROW], pub intermed_8: [[T; SHA256_WORD_U16S]; SHA256_ROUNDS_PER_ROW], pub intermed_12: [[T; SHA256_WORD_U16S]; SHA256_ROUNDS_PER_ROW], @@ -117,14 +121,16 @@ pub struct Sha256FlagsCols { } impl> Sha256FlagsCols { - // This refers to the padding rows that are added to the air to make the trace length a power of 2. - // Not to be confused with the padding added to messages as part of the SHA hash function. + // This refers to the padding rows that are added to the air to make the trace length a power of + // 2. Not to be confused with the padding added to messages as part of the SHA hash + // function. pub fn is_not_padding_row(&self) -> O { self.is_round_row + self.is_digest_row } - // This refers to the padding rows that are added to the air to make the trace length a power of 2. - // Not to be confused with the padding added to messages as part of the SHA hash function. + // This refers to the padding rows that are added to the air to make the trace length a power of + // 2. Not to be confused with the padding added to messages as part of the SHA hash + // function. pub fn is_padding_row(&self) -> O where O: FieldAlgebra, diff --git a/crates/circuits/sha256-air/src/trace.rs b/crates/circuits/sha256-air/src/trace.rs index 3862cc0443..eaf9174f50 100644 --- a/crates/circuits/sha256-air/src/trace.rs +++ b/crates/circuits/sha256-air/src/trace.rs @@ -22,8 +22,9 @@ use crate::{ }; /// The trace generation of SHA256 should be done in two passes. -/// The first pass should do `get_block_trace` for every block and generate the invalid rows through `get_default_row` -/// The second pass should go through all the blocks and call `generate_missing_cells` +/// The first pass should do `get_block_trace` for every block and generate the invalid rows through +/// `get_default_row` The second pass should go through all the blocks and call +/// `generate_missing_cells` impl Sha256Air { /// This function takes the input_message (padding not handled), the previous hash, /// and returns the new hash after processing the block input @@ -37,12 +38,13 @@ impl Sha256Air { new_hash } - /// This function takes a 512-bit chunk of the input message (padding not handled), the previous hash, - /// a flag indicating if it's the last block, the global block index, the local block index, - /// and the buffer values that will be put in rows 0..4. - /// Will populate the given `trace` with the trace of the block, where the width of the trace is `trace_width` - /// and the starting column for the `Sha256Air` is `trace_start_col`. - /// **Note**: this function only generates some of the required trace. Another pass is required, refer to [`Self::generate_missing_cells`] for details. + /// This function takes a 512-bit chunk of the input message (padding not handled), the previous + /// hash, a flag indicating if it's the last block, the global block index, the local block + /// index, and the buffer values that will be put in rows 0..4. + /// Will populate the given `trace` with the trace of the block, where the width of the trace is + /// `trace_width` and the starting column for the `Sha256Air` is `trace_start_col`. + /// **Note**: this function only generates some of the required trace. Another pass is required, + /// refer to [`Self::generate_missing_cells`] for details. #[allow(clippy::too_many_arguments)] pub fn generate_block_trace( &self, @@ -285,14 +287,17 @@ impl Sha256Air { } if i == SHA256_ROWS_PER_BLOCK - 2 { // `next` is a digest row. - // Fill in `carry_a` and `carry_e` with dummy values so the constraints on `a` and `e` hold. + // Fill in `carry_a` and `carry_e` with dummy values so the constraints on `a` and + // `e` hold. Self::generate_carry_ae(local_cols, next_cols); - // Fill in row 16's `intermed_4` with dummy values so the message schedule constraints holds on that row + // Fill in row 16's `intermed_4` with dummy values so the message schedule + // constraints holds on that row Self::generate_intermed_4(local_cols, next_cols); } if i <= 2 { // i is in 0..3. - // Fill in `local.intermed_12` with dummy values so the message schedule constraints hold on rows 1..4. + // Fill in `local.intermed_12` with dummy values so the message schedule constraints + // hold on rows 1..4. Self::generate_intermed_12(local_cols, next_cols); } } @@ -320,11 +325,14 @@ impl Sha256Air { row_16[trace_start_col..trace_start_col + SHA256_ROUND_WIDTH].borrow_mut(); let cols_17: &mut Sha256RoundCols = row_17[trace_start_col..trace_start_col + SHA256_ROUND_WIDTH].borrow_mut(); - // Fill in row 15's `intermed_12` with dummy values so the message schedule constraints holds on row 16 + // Fill in row 15's `intermed_12` with dummy values so the message schedule constraints + // holds on row 16 Self::generate_intermed_12(cols_15, cols_16); - // Fill in row 16's `intermed_12` with dummy values so the message schedule constraints holds on the next block's row 0 + // Fill in row 16's `intermed_12` with dummy values so the message schedule constraints + // holds on the next block's row 0 Self::generate_intermed_12(cols_16, cols_17); - // Fill in row 0's `intermed_4` with dummy values so the message schedule constraints holds on that row + // Fill in row 0's `intermed_4` with dummy values so the message schedule constraints holds + // on that row Self::generate_intermed_4(cols_16, cols_17); } @@ -362,8 +370,8 @@ impl Sha256Air { }); } - /// The following functions do the calculations in native field since they will be called on padding rows - /// which can overflow and we need to make sure it matches the AIR constraints + /// The following functions do the calculations in native field since they will be called on + /// padding rows which can overflow and we need to make sure it matches the AIR constraints /// Puts the correct carrys in the `next_row`, the resulting carrys can be out of bound fn generate_carry_ae( local_cols: &Sha256RoundCols, diff --git a/crates/continuations/src/verifier/internal/types.rs b/crates/continuations/src/verifier/internal/types.rs index 53b255ac7c..9512518843 100644 --- a/crates/continuations/src/verifier/internal/types.rs +++ b/crates/continuations/src/verifier/internal/types.rs @@ -76,9 +76,9 @@ impl InternalVmVerifierPvs> { pub struct InternalVmVerifierExtraPvs { /// The commitment of the leaf verifier program. pub leaf_verifier_commit: [T; DIGEST_SIZE], - /// For recursion verification, a program need its own commitment, but its own commitment cannot - /// be hardcoded inside the program itself. So the commitment has to be read from external and - /// be committed. + /// For recursion verification, a program need its own commitment, but its own commitment + /// cannot be hardcoded inside the program itself. So the commitment has to be read from + /// external and be committed. pub internal_program_commit: [T; DIGEST_SIZE], } diff --git a/crates/continuations/src/verifier/leaf/types.rs b/crates/continuations/src/verifier/leaf/types.rs index 63b41eca3e..16aca7a169 100644 --- a/crates/continuations/src/verifier/leaf/types.rs +++ b/crates/continuations/src/verifier/leaf/types.rs @@ -32,8 +32,8 @@ assert_impl_all!(LeafVmVerifierInput: Serialize, Deseri #[derive(Serialize, Deserialize, Clone, Debug)] pub struct UserPublicValuesRootProof { /// Sibling hashes for proving the merkle root of public values. For a specific VM, the path - /// is constant. So we don't need the boolean which indicates if a node is a left child or right - /// child. + /// is constant. So we don't need the boolean which indicates if a node is a left child or + /// right child. pub sibling_hashes: Vec<[F; DIGEST_SIZE]>, pub public_values_commit: [F; DIGEST_SIZE], } diff --git a/crates/continuations/src/verifier/leaf/vars.rs b/crates/continuations/src/verifier/leaf/vars.rs index 9fcf90d2db..860621f395 100644 --- a/crates/continuations/src/verifier/leaf/vars.rs +++ b/crates/continuations/src/verifier/leaf/vars.rs @@ -19,8 +19,8 @@ use crate::{ #[derive(DslVariable, Clone)] pub struct UserPublicValuesRootProofVariable { /// Sibling hashes for proving the merkle root of public values. For a specific VM, the path - /// is constant. So we don't need the boolean which indicates if a node is a left child or right - /// child. + /// is constant. So we don't need the boolean which indicates if a node is a left child or + /// right child. pub sibling_hashes: Array; CHUNK]>, pub public_values_commit: [Felt; CHUNK], } diff --git a/crates/prof/src/lib.rs b/crates/prof/src/lib.rs index 65468fd0de..ab5823f21b 100644 --- a/crates/prof/src/lib.rs +++ b/crates/prof/src/lib.rs @@ -109,7 +109,8 @@ impl MetricDb { for label_keys in sorted_keys { if label_keys.contains(&"cycle_tracker_span".to_string()) { - // Skip cycle_tracker_span as it is too long for markdown and visualized in flamegraphs + // Skip cycle_tracker_span as it is too long for markdown and visualized in + // flamegraphs continue; } let metrics_dict = &self.dict_by_label_types[&label_keys]; diff --git a/crates/sdk/src/codec.rs b/crates/sdk/src/codec.rs index 50ccd75271..c66f254625 100644 --- a/crates/sdk/src/codec.rs +++ b/crates/sdk/src/codec.rs @@ -115,8 +115,8 @@ impl Encode for Proof { // Helper function to encode OpeningProof // ``` // pub struct OpeningProof { -// pub proof: PcsProof, -// pub values: OpenedValues, +// pub proof: PcsProof, +// pub values: OpenedValues, // } // ``` fn encode_opening_proof( @@ -226,7 +226,6 @@ impl Encode for InnerQueryProof { /// pub opening_proof: Vec<[F; DIGEST_SIZE]>, /// } /// ``` - /// // @dev [jpw]: We prefer to keep the implementation all in one function // without `impl Encode` on subtypes because it obfuscates what the overall // struct consists of. @@ -278,7 +277,8 @@ fn encode_commitments(commitments: &[Com], writer: &mut W) -> Resu encode_slice(&coms, writer) } -// Can't implement Encode on Com because Rust complains about associated trait types when you don't own the trait (in this case SC) +// Can't implement Encode on Com because Rust complains about associated trait types when you +// don't own the trait (in this case SC) impl Encode for [F; DIGEST_SIZE] { fn encode(&self, writer: &mut W) -> Result<()> { for val in self { diff --git a/crates/sdk/src/commit.rs b/crates/sdk/src/commit.rs index 2e396b2763..7045d96443 100644 --- a/crates/sdk/src/commit.rs +++ b/crates/sdk/src/commit.rs @@ -35,8 +35,8 @@ pub struct AppExecutionCommit { } impl AppExecutionCommit { - /// Users should use this function to compute `AppExecutionCommit` and check it against the final - /// proof. + /// Users should use this function to compute `AppExecutionCommit` and check it against the + /// final proof. pub fn compute>( app_vm_config: &VC, app_exe: &NonRootCommittedExe, diff --git a/crates/sdk/src/keygen/dummy.rs b/crates/sdk/src/keygen/dummy.rs index 5000a14041..44b66454b9 100644 --- a/crates/sdk/src/keygen/dummy.rs +++ b/crates/sdk/src/keygen/dummy.rs @@ -177,7 +177,8 @@ where let overridden_heights = if let Some(overridden_heights) = overridden_heights { overridden_heights } else { - // We first execute once to get the trace heights from dummy_exe, then pad to powers of 2 (forcing trace height 0 to 1) + // We first execute once to get the trace heights from dummy_exe, then pad to powers of 2 + // (forcing trace height 0 to 1) let executor = VmExecutor::new(app_vm_pk.vm_config.clone()); let mut results = executor .execute_segments(dummy_exe.exe.clone(), vec![]) diff --git a/crates/sdk/src/keygen/mod.rs b/crates/sdk/src/keygen/mod.rs index 0b6c6cd27b..bbd6ec269e 100644 --- a/crates/sdk/src/keygen/mod.rs +++ b/crates/sdk/src/keygen/mod.rs @@ -83,7 +83,8 @@ pub struct AggStarkProvingKey { pub struct Halo2ProvingKey { /// Static verifier to verify a stark proof of the root verifier. pub verifier: Halo2VerifierProvingKey, - /// Wrapper circuit to verify static verifier and reduce the verification costs in the final proof. + /// Wrapper circuit to verify static verifier and reduce the verification costs in the final + /// proof. pub wrapper: Halo2WrapperProvingKey, /// Whether to collect detailed profiling metrics pub profiling: bool, @@ -236,7 +237,8 @@ fn check_recursive_verifier_size( if fri_reduced_opening_trace_height > (1 << (Val::::TWO_ADICITY - next_log_blowup)) { tracing::warn!("recursive verifier size may be too large; FriReducedOpening height ({fri_reduced_opening_trace_height}) > {}", 1 << (Val::::TWO_ADICITY - next_log_blowup)); } - // Second check: static check for log up soundness constraints using FriReducedOpening trace height as proxy + // Second check: static check for log up soundness constraints using FriReducedOpening trace + // height as proxy if fri_reduced_opening_trace_height as u32 >= Val::::ORDER_U32 / 200 { tracing::warn!( "recursive verifier size may violate log up soundness constraints; {} > {}", diff --git a/crates/sdk/src/types.rs b/crates/sdk/src/types.rs index b8eb124d85..f191f6b864 100644 --- a/crates/sdk/src/types.rs +++ b/crates/sdk/src/types.rs @@ -23,7 +23,8 @@ pub struct EvmHalo2Verifier { #[derive(Clone, Debug, Deserialize, Serialize)] pub struct EvmProof { #[serde_as(as = "serde_with::hex::Hex")] - /// Bn254Fr public values for accumulators in flatten little-endian bytes. Length is `NUM_BN254_ACCUMULATORS * BN254_BYTES`. + /// Bn254Fr public values for accumulators in flatten little-endian bytes. Length is + /// `NUM_BN254_ACCUMULATORS * BN254_BYTES`. pub accumulators: Vec, #[serde_as(as = "serde_with::hex::Hex")] /// 1 Bn254Fr public value for exe commit in little-endian bytes. @@ -35,7 +36,8 @@ pub struct EvmProof { /// Bn254Fr user public values in little-endian bytes. pub user_public_values: Vec, #[serde_as(as = "serde_with::hex::Hex")] - /// Bn254Fr proof in little-endian bytes. The circuit only has 1 advice column, so the proof is of length `NUM_BN254_PROOF * BN254_BYTES`. + /// Bn254Fr proof in little-endian bytes. The circuit only has 1 advice column, so the proof is + /// of length `NUM_BN254_PROOF * BN254_BYTES`. pub proof: Vec, } diff --git a/crates/toolchain/build/src/lib.rs b/crates/toolchain/build/src/lib.rs index ce8844f3df..8b1c8e1112 100644 --- a/crates/toolchain/build/src/lib.rs +++ b/crates/toolchain/build/src/lib.rs @@ -103,7 +103,8 @@ pub fn current_package() -> Package { get_package(env::var("CARGO_MANIFEST_DIR").unwrap()) } -/// Reads the value of the environment variable `OPENVM_SKIP_BUILD` and returns true if it is set to 1. +/// Reads the value of the environment variable `OPENVM_SKIP_BUILD` and returns true if it is set to +/// 1. pub fn is_skip_build() -> bool { !get_env_var(SKIP_BUILD_ENV).is_empty() } @@ -269,8 +270,8 @@ pub fn build_guest_package( return Err(None); } - // Check if the required toolchain and rust-src component are installed, and if not, install them. - // This requires that `rustup` is installed. + // Check if the required toolchain and rust-src component are installed, and if not, install + // them. This requires that `rustup` is installed. if let Err(code) = ensure_toolchain_installed(RUSTUP_TOOLCHAIN_NAME, &["rust-src"]) { eprintln!("rustup toolchain commands failed. Please ensure rustup is installed (https://www.rust-lang.org/tools/install)"); return Err(Some(code)); diff --git a/crates/toolchain/custom_insn/src/lib.rs b/crates/toolchain/custom_insn/src/lib.rs index 57dedc55d0..7e5fe31233 100644 --- a/crates/toolchain/custom_insn/src/lib.rs +++ b/crates/toolchain/custom_insn/src/lib.rs @@ -290,13 +290,15 @@ mod kw { /// rs2 = In rs2 /// ); /// ``` -/// Here, `opcode`, `funct3`, and `funct7` are the opcode, funct3, and funct7 fields of the RISC-V instruction. -/// `rd`, `rs1`, and `rs2` are the destination register, source register 1, and source register 2 respectively. -/// The `In`, `Out`, `InOut`, and `Const` keywords are required to specify the type of the register arguments. -/// They translate to `in(reg)`, `out(reg)`, `inout(reg)`, and `const` respectively, and mean +/// Here, `opcode`, `funct3`, and `funct7` are the opcode, funct3, and funct7 fields of the RISC-V +/// instruction. `rd`, `rs1`, and `rs2` are the destination register, source register 1, and source +/// register 2 respectively. The `In`, `Out`, `InOut`, and `Const` keywords are required to specify +/// the type of the register arguments. They translate to `in(reg)`, `out(reg)`, `inout(reg)`, and +/// `const` respectively, and mean /// - "read the value from this variable" before execution (`In`), /// - "write the value to this variable" after execution (`Out`), -/// - "read the value from this variable, then write it back to the same variable" after execution (`InOut`), and +/// - "read the value from this variable, then write it back to the same variable" after execution +/// (`InOut`), and /// - "use this constant value" (`Const`). #[proc_macro] pub fn custom_insn_r(input: proc_macro::TokenStream) -> proc_macro::TokenStream { @@ -347,12 +349,14 @@ pub fn custom_insn_r(input: proc_macro::TokenStream) -> proc_macro::TokenStream /// ); /// ``` /// Here, `opcode`, `funct3` are the opcode and funct3 fields of the RISC-V instruction. -/// `rd`, `rs1`, and `imm` are the destination register, source register 1, and immediate value respectively. -/// The `In`, `Out`, `InOut`, and `Const` keywords are required to specify the type of the register arguments. -/// They translate to `in(reg)`, `out(reg)`, `inout(reg)`, and `const` respectively, and mean +/// `rd`, `rs1`, and `imm` are the destination register, source register 1, and immediate value +/// respectively. The `In`, `Out`, `InOut`, and `Const` keywords are required to specify the type of +/// the register arguments. They translate to `in(reg)`, `out(reg)`, `inout(reg)`, and `const` +/// respectively, and mean /// - "read the value from this variable" before execution (`In`), /// - "write the value to this variable" after execution (`Out`), -/// - "read the value from this variable, then write it back to the same variable" after execution (`InOut`), and +/// - "read the value from this variable, then write it back to the same variable" after execution +/// (`InOut`), and /// - "use this constant value" (`Const`). /// /// The `imm` argument is required to be a constant value. diff --git a/crates/toolchain/instructions/src/instruction.rs b/crates/toolchain/instructions/src/instruction.rs index 0650729616..4b0f31e271 100644 --- a/crates/toolchain/instructions/src/instruction.rs +++ b/crates/toolchain/instructions/src/instruction.rs @@ -100,7 +100,8 @@ impl Instruction { impl Default for Instruction { fn default() -> Self { Self { - opcode: VmOpcode::from_usize(0), // there is no real default opcode, this field must always be set + opcode: VmOpcode::from_usize(0), /* there is no real default opcode, this field must + * always be set */ a: T::default(), b: T::default(), c: T::default(), diff --git a/crates/toolchain/instructions/src/lib.rs b/crates/toolchain/instructions/src/lib.rs index 5c5455344d..c251e77d0d 100644 --- a/crates/toolchain/instructions/src/lib.rs +++ b/crates/toolchain/instructions/src/lib.rs @@ -11,7 +11,8 @@ pub mod exe; pub mod instruction; mod phantom; pub mod program; -/// Module with traits and constants for RISC-V instruction definitions for custom OpenVM instructions. +/// Module with traits and constants for RISC-V instruction definitions for custom OpenVM +/// instructions. pub mod riscv; pub mod utils; diff --git a/crates/toolchain/instructions/src/phantom.rs b/crates/toolchain/instructions/src/phantom.rs index 1ae7e2d49a..06139d2507 100644 --- a/crates/toolchain/instructions/src/phantom.rs +++ b/crates/toolchain/instructions/src/phantom.rs @@ -3,11 +3,13 @@ use strum::FromRepr; #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)] pub struct PhantomDiscriminant(pub u16); -/// Phantom instructions owned by the system. These are handled in the `ExecutionSegment`, as opposed to the `PhantomChip`. +/// Phantom instructions owned by the system. These are handled in the `ExecutionSegment`, as +/// opposed to the `PhantomChip`. #[derive(Copy, Clone, Debug, PartialEq, Eq, FromRepr)] #[repr(u16)] pub enum SysPhantom { - /// Does nothing at constraint and runtime level besides advance pc by [DEFAULT_PC_STEP](super::program::DEFAULT_PC_STEP). + /// Does nothing at constraint and runtime level besides advance pc by + /// [DEFAULT_PC_STEP](super::program::DEFAULT_PC_STEP). Nop = 0, /// Causes the runtime to panic, on host machine and prints a backtrace. DebugPanic, diff --git a/crates/toolchain/instructions/src/program.rs b/crates/toolchain/instructions/src/program.rs index 568d794f64..08bbc51806 100644 --- a/crates/toolchain/instructions/src/program.rs +++ b/crates/toolchain/instructions/src/program.rs @@ -17,7 +17,8 @@ pub const MAX_ALLOWED_PC: u32 = (1 << PC_BITS) - 1; pub struct Program { /// A map from program counter to instruction. /// Sometimes the instructions are enumerated as 0, 4, 8, etc. - /// Maybe at some point we will replace this with a struct that would have a `Vec` under the hood and divide the incoming `pc` by whatever given. + /// Maybe at some point we will replace this with a struct that would have a `Vec` under the + /// hood and divide the incoming `pc` by whatever given. pub instructions_and_debug_infos: Vec, Option)>>, pub step: u32, pub pc_base: u32, @@ -71,8 +72,8 @@ impl Program { } } - /// We assume that pc_start = pc_base = 0 everywhere except the RISC-V programs, until we need otherwise - /// We use [DEFAULT_PC_STEP] for consistency with RISC-V + /// We assume that pc_start = pc_base = 0 everywhere except the RISC-V programs, until we need + /// otherwise We use [DEFAULT_PC_STEP] for consistency with RISC-V pub fn from_instructions_and_debug_infos( instructions: &[Instruction], debug_infos: &[Option], diff --git a/crates/toolchain/openvm/src/io/mod.rs b/crates/toolchain/openvm/src/io/mod.rs index de22862f45..0c3b80ccca 100644 --- a/crates/toolchain/openvm/src/io/mod.rs +++ b/crates/toolchain/openvm/src/io/mod.rs @@ -66,14 +66,16 @@ pub(crate) fn read_vec_by_len(len: usize) -> Vec { // Allocate a buffer of the required length // We prefer that the allocator should allocate this buffer to a 4-byte boundary, // but we do not specify it here because `Vec` safety requires the alignment to - // exactly equal the alignment of `u8`, which is 1. See `Vec::from_raw_parts` for more details. + // exactly equal the alignment of `u8`, which is 1. See `Vec::from_raw_parts` for more + // details. // // Note: the bump allocator we use by default has minimum alignment of 4 bytes. // The heap-embedded-alloc uses linked list allocator, which has a minimum alignment of // `sizeof(usize) * 2 = 8` on 32-bit architectures: https://github.com/rust-osdev/linked-list-allocator/blob/b5caf3271259ddda60927752fa26527e0ccd2d56/src/hole.rs#L429 let mut bytes = Vec::with_capacity(capacity); hint_buffer_u32!(bytes.as_mut_ptr(), num_words); - // SAFETY: We populate a `Vec` by hintstore-ing `num_words` 4 byte words. We set the length to `len` and don't care about the extra `capacity - len` bytes stored. + // SAFETY: We populate a `Vec` by hintstore-ing `num_words` 4 byte words. We set the + // length to `len` and don't care about the extra `capacity - len` bytes stored. unsafe { bytes.set_len(len); } diff --git a/crates/toolchain/openvm/src/lib.rs b/crates/toolchain/openvm/src/lib.rs index 88bffc471d..134d10b559 100644 --- a/crates/toolchain/openvm/src/lib.rs +++ b/crates/toolchain/openvm/src/lib.rs @@ -88,8 +88,8 @@ macro_rules! entry { } }; } -/// This macro does nothing. You should name the function `main` so that the normal rust main function -/// setup is used. +/// This macro does nothing. You should name the function `main` so that the normal rust main +/// function setup is used. #[cfg(any(feature = "std", not(target_os = "zkvm")))] #[macro_export] macro_rules! entry { diff --git a/crates/toolchain/openvm/src/pal_abi.rs b/crates/toolchain/openvm/src/pal_abi.rs index 5e7717df24..0ab3d3f386 100644 --- a/crates/toolchain/openvm/src/pal_abi.rs +++ b/crates/toolchain/openvm/src/pal_abi.rs @@ -1,9 +1,9 @@ /// For rust std library compatibility, we need to define the ABI specified in /// /// while we are using target = "riscv32im-risc0-zkvm-elf". -/// This will be removed once a dedicated rust toolchain is used because OpenVM does not handle system -/// operations in the same way: there is no operating system and even the standard library should be -/// directly handled with intrinsics. +/// This will be removed once a dedicated rust toolchain is used because OpenVM does not handle +/// system operations in the same way: there is no operating system and even the standard +/// library should be directly handled with intrinsics. use openvm_platform::{fileno::*, memory::sys_alloc_aligned, rust_rt::terminate, WORD_SIZE}; use openvm_rv32im_guest::{hint_buffer_u32, hint_random, raw_print_str_from_bytes}; diff --git a/crates/toolchain/platform/src/getrandom.rs b/crates/toolchain/platform/src/getrandom.rs index 4b8753e6dd..1edb4578ee 100644 --- a/crates/toolchain/platform/src/getrandom.rs +++ b/crates/toolchain/platform/src/getrandom.rs @@ -1,4 +1,5 @@ -//! We need to export a custom getrandom implementation just to get crates that import getrandom to compile. +//! We need to export a custom getrandom implementation just to get crates that import getrandom to +//! compile. use getrandom::{register_custom_getrandom, Error}; /// This is a getrandom handler for the zkvm. It's intended to hook into a diff --git a/crates/toolchain/platform/src/rust_rt.rs b/crates/toolchain/platform/src/rust_rt.rs index 1cef2cb072..477dd73ce6 100644 --- a/crates/toolchain/platform/src/rust_rt.rs +++ b/crates/toolchain/platform/src/rust_rt.rs @@ -1,13 +1,13 @@ //! This module contains the components required to link a Rust binary. //! //! In particular: -//! * It defines an entrypoint ensuring initialization and finalization are done -//! properly. +//! * It defines an entrypoint ensuring initialization and finalization are done properly. //! * It includes a panic handler. //! * It includes an allocator. -/// WARNING: the [SYSTEM_OPCODE] here should be equal to `SYSTEM_OPCODE` in `extensions_rv32im_guest` -/// Can't import `openvm_rv32im_guest` here because would create a circular dependency +/// WARNING: the [SYSTEM_OPCODE] here should be equal to `SYSTEM_OPCODE` in +/// `extensions_rv32im_guest` Can't import `openvm_rv32im_guest` here because would create a +/// circular dependency #[cfg(target_os = "zkvm")] /// This is custom-0 defined in RISC-V spec document const SYSTEM_OPCODE: u8 = 0x0b; diff --git a/crates/toolchain/tests/tests/transpiler_tests.rs b/crates/toolchain/tests/tests/transpiler_tests.rs index 5e82b60430..82d74afcca 100644 --- a/crates/toolchain/tests/tests/transpiler_tests.rs +++ b/crates/toolchain/tests/tests/transpiler_tests.rs @@ -50,8 +50,8 @@ fn test_decode_elf() -> Result<()> { } // To create ELF directly from .S file, `brew install riscv-gnu-toolchain` and run -// `riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles -e _start -Ttext 0 fib.S -o rv32im-fib-from-as` -// riscv64-unknown-elf-gcc supports rv32im if you set -march target +// `riscv64-unknown-elf-gcc -march=rv32im -mabi=ilp32 -nostartfiles -e _start -Ttext 0 fib.S -o +// rv32im-fib-from-as` riscv64-unknown-elf-gcc supports rv32im if you set -march target #[test_case("tests/data/rv32im-fib-from-as")] #[test_case("tests/data/rv32im-intrin-from-as")] fn test_generate_program(elf_path: &str) -> Result<()> { diff --git a/crates/toolchain/transpiler/src/extension.rs b/crates/toolchain/transpiler/src/extension.rs index 3ed4d054fd..a8061642a3 100644 --- a/crates/toolchain/transpiler/src/extension.rs +++ b/crates/toolchain/transpiler/src/extension.rs @@ -2,13 +2,14 @@ use openvm_instructions::instruction::Instruction; /// Trait to add custom RISC-V instruction transpilation to OpenVM instruction format. /// RISC-V instructions always come in 32-bit chunks. -/// An important feature is that multiple 32-bit RISC-V instructions can be transpiled into a single OpenVM instruction. -/// See [process_custom](Self::process_custom) for details. +/// An important feature is that multiple 32-bit RISC-V instructions can be transpiled into a single +/// OpenVM instruction. See [process_custom](Self::process_custom) for details. pub trait TranspilerExtension { - /// The `instruction_stream` provides a view of the remaining RISC-V instructions to be processed, - /// presented as 32-bit chunks. The [process_custom](Self::process_custom) should determine if it knows how to transpile - /// the next contiguous section of RISC-V instructions into an [`Instruction`]. - /// It returns `None` if it cannot transpile. Otherwise it returns `TranspilerOutput { instructions, used_u32s }` to indicate that + /// The `instruction_stream` provides a view of the remaining RISC-V instructions to be + /// processed, presented as 32-bit chunks. The [process_custom](Self::process_custom) should + /// determine if it knows how to transpile the next contiguous section of RISC-V + /// instructions into an [`Instruction`]. It returns `None` if it cannot transpile. + /// Otherwise it returns `TranspilerOutput { instructions, used_u32s }` to indicate that /// `instruction_stream[..used_u32s]` should be transpiled into `instructions`. fn process_custom(&self, instruction_stream: &[u32]) -> Option>; } diff --git a/crates/toolchain/transpiler/src/transpiler.rs b/crates/toolchain/transpiler/src/transpiler.rs index 7a15247c55..54e2c1e91d 100644 --- a/crates/toolchain/transpiler/src/transpiler.rs +++ b/crates/toolchain/transpiler/src/transpiler.rs @@ -42,11 +42,11 @@ impl Transpiler { } /// Iterates over a sequence of 32-bit RISC-V instructions `instructions_u32`. The iterator - /// applies every processor in the [`Transpiler`] to determine if one of them knows how to transpile - /// the current instruction (and possibly a contiguous section of following instructions). - /// If so, it advances the iterator by the amount specified by the processor. - /// The transpiler will panic if two different processors claim to know how to transpile the same instruction - /// to avoid ambiguity. + /// applies every processor in the [`Transpiler`] to determine if one of them knows how to + /// transpile the current instruction (and possibly a contiguous section of following + /// instructions). If so, it advances the iterator by the amount specified by the processor. + /// The transpiler will panic if two different processors claim to know how to transpile the + /// same instruction to avoid ambiguity. pub fn transpile( &self, instructions_u32: &[u32], diff --git a/crates/toolchain/transpiler/src/util.rs b/crates/toolchain/transpiler/src/util.rs index 4d6d858121..d9135de153 100644 --- a/crates/toolchain/transpiler/src/util.rs +++ b/crates/toolchain/transpiler/src/util.rs @@ -39,7 +39,8 @@ pub fn from_r_type( ) } -/// Create a new [`Instruction`] from an I-type instruction. Should only be used for ALU instructions because `imm` is transpiled in a special way. +/// Create a new [`Instruction`] from an I-type instruction. Should only be used for ALU +/// instructions because `imm` is transpiled in a special way. pub fn from_i_type(opcode: usize, dec_insn: &IType) -> Instruction { if dec_insn.rd == 0 { return nop(); @@ -147,7 +148,8 @@ pub fn from_u_type(opcode: usize, dec_insn: &UType) -> Instruct ) } -/// Create a new [`Instruction`] that exits with code 2. This is equivalent to program panic but with a special exit code for debugging. +/// Create a new [`Instruction`] that exits with code 2. This is equivalent to program panic but +/// with a special exit code for debugging. pub fn unimp() -> Instruction { Instruction { opcode: SystemOpcode::TERMINATE.global_opcode(), diff --git a/crates/vm/derive/src/lib.rs b/crates/vm/derive/src/lib.rs index 33f061e6f2..37dca6e4ed 100644 --- a/crates/vm/derive/src/lib.rs +++ b/crates/vm/derive/src/lib.rs @@ -26,8 +26,8 @@ pub fn instruction_executor_derive(input: TokenStream) -> TokenStream { } _ => panic!("Only unnamed fields are supported"), }; - // Use full path ::openvm_circuit... so it can be used either within or outside the vm crate. - // Assume F is already generic of the field. + // Use full path ::openvm_circuit... so it can be used either within or outside the vm + // crate. Assume F is already generic of the field. let mut new_generics = generics.clone(); let where_clause = new_generics.make_where_clause(); where_clause.predicates.push( @@ -73,8 +73,8 @@ pub fn instruction_executor_derive(input: TokenStream) -> TokenStream { _ => None, }) .expect("First generic must be type for Field"); - // Use full path ::openvm_circuit... so it can be used either within or outside the vm crate. - // Assume F is already generic of the field. + // Use full path ::openvm_circuit... so it can be used either within or outside the vm + // crate. Assume F is already generic of the field. let (execute_arms, get_opcode_name_arms): (Vec<_>, Vec<_>) = multiunzip(variants.iter().map(|(variant_name, field)| { let field_ty = &field.ty; diff --git a/crates/vm/src/arch/config.rs b/crates/vm/src/arch/config.rs index f804ecc2b0..30d92130a1 100644 --- a/crates/vm/src/arch/config.rs +++ b/crates/vm/src/arch/config.rs @@ -39,7 +39,10 @@ pub trait VmConfig: Clone + Serialize + DeserializeOwned { #[derive(Debug, Serialize, Deserialize, Clone, new, Copy)] pub struct MemoryConfig { - /// The maximum height of the address space. This means the trie has `as_height` layers for searching the address space. The allowed address spaces are those in the range `[as_offset, as_offset + 2^as_height)` where `as_offset` is currently fixed to `1` to not allow address space `0` in memory. + /// The maximum height of the address space. This means the trie has `as_height` layers for + /// searching the address space. The allowed address spaces are those in the range `[as_offset, + /// as_offset + 2^as_height)` where `as_offset` is currently fixed to `1` to not allow address + /// space `0` in memory. pub as_height: usize, /// The offset of the address space. Should be fixed to equal `1`. pub as_offset: u32, @@ -78,9 +81,9 @@ pub struct SystemConfig { /// In single segment mode, `num_public_values` is the number of public values of /// `PublicValuesChip`. In this case, verifier can read public values directly. /// In continuation mode, public values are stored in a special address space. - /// `num_public_values` indicates the number of allowed addresses in that address space. The verifier - /// cannot read public values directly, but they can decommit the public values from the memory - /// merkle root. + /// `num_public_values` indicates the number of allowed addresses in that address space. The + /// verifier cannot read public values directly, but they can decommit the public values + /// from the memory merkle root. pub num_public_values: usize, /// Whether to collect detailed profiling metrics. /// **Warning**: this slows down the runtime. diff --git a/crates/vm/src/arch/execution.rs b/crates/vm/src/arch/execution.rs index 080abd73ce..4edc88d355 100644 --- a/crates/vm/src/arch/execution.rs +++ b/crates/vm/src/arch/execution.rs @@ -234,7 +234,8 @@ impl ExecutionBridge { } } - /// If `to_pc` is `Some`, then `pc_inc` is ignored and the `to_state` uses `to_pc`. Otherwise `to_pc = from_pc + pc_inc`. + /// If `to_pc` is `Some`, then `pc_inc` is ignored and the `to_state` uses `to_pc`. Otherwise + /// `to_pc = from_pc + pc_inc`. pub fn execute_and_increment_or_set_pc( &self, opcode: impl Into, @@ -314,7 +315,8 @@ impl From<(u32, Option)> for PcIncOrSet { } /// Phantom sub-instructions affect the runtime of the VM and the trace matrix values. -/// However they all have no AIR constraints besides advancing the pc by [DEFAULT_PC_STEP](openvm_instructions::program::DEFAULT_PC_STEP). +/// However they all have no AIR constraints besides advancing the pc by +/// [DEFAULT_PC_STEP](openvm_instructions::program::DEFAULT_PC_STEP). /// /// They should not mutate memory, but they can mutate the input & hint streams. /// diff --git a/crates/vm/src/arch/extensions.rs b/crates/vm/src/arch/extensions.rs index dc523f91d5..adda318f6a 100644 --- a/crates/vm/src/arch/extensions.rs +++ b/crates/vm/src/arch/extensions.rs @@ -266,7 +266,8 @@ impl VmInventory { } } - /// Append `other` to current inventory. This means `self` comes earlier in the dependency chain. + /// Append `other` to current inventory. This means `self` comes earlier in the dependency + /// chain. pub fn append(&mut self, mut other: VmInventory) -> Result<(), VmInventoryError> { let num_executors = self.executors.len(); let num_periphery = self.periphery.len(); @@ -651,7 +652,8 @@ impl VmChipComplex { { let mut builder = VmInventoryBuilder::new(&self.config, &self.base, &self.streams, self.bus_idx_mgr); - // Add range checker for convenience, the other system base chips aren't included - they can be accessed directly from builder + // Add range checker for convenience, the other system base chips aren't included - they can + // be accessed directly from builder builder.add_chip(&self.base.range_checker_chip); for chip in self.inventory.executors() { builder.add_chip(chip); @@ -790,7 +792,8 @@ impl VmChipComplex { self.base.memory_controller.set_initial_memory(memory); } - /// Warning: this sets the stream in all chips which have a shared mutable reference to the streams. + /// Warning: this sets the stream in all chips which have a shared mutable reference to the + /// streams. pub(crate) fn set_streams(&mut self, streams: Streams) { *self.streams.lock().unwrap() = streams; } @@ -870,7 +873,8 @@ impl VmChipComplex { /// useful for regular users. /// /// **Warning**: the order of `get_trace_heights` is deterministic, but it is not the same as - /// the order of `air_names`. In other words, the order here does not match the order of AIR IDs. + /// the order of `air_names`. In other words, the order here does not match the order of AIR + /// IDs. pub fn get_internal_trace_heights(&self) -> VmComplexTraceHeights where E: ChipUsageGetter, @@ -885,8 +889,9 @@ impl VmChipComplex { /// Return dummy trace heights of (SystemBase, Inventory). Usually this is for aggregation to /// generate a dummy proof and not useful for regular users. /// - /// **Warning**: the order of `get_dummy_trace_heights` is deterministic, but it is not the same as - /// the order of `air_names`. In other words, the order here does not match the order of AIR IDs. + /// **Warning**: the order of `get_dummy_trace_heights` is deterministic, but it is not the same + /// as the order of `air_names`. In other words, the order here does not match the order of + /// AIR IDs. pub fn get_dummy_internal_trace_heights(&self) -> VmComplexTraceHeights where E: ChipUsageGetter, @@ -944,8 +949,9 @@ impl VmChipComplex { } /// Return trace cells of all chips in order. - /// This returns 0 cells for chips with preprocessed trace because the number of trace cells is constant in those cases. - /// This function is used to sample periodically and provided to the segmentation strategy to decide whether to segment during execution. + /// This returns 0 cells for chips with preprocessed trace because the number of trace cells is + /// constant in those cases. This function is used to sample periodically and provided to + /// the segmentation strategy to decide whether to segment during execution. pub(crate) fn current_trace_cells(&self) -> Vec where E: ChipUsageGetter, @@ -1062,9 +1068,10 @@ impl VmChipComplex { debug_assert_eq!(builder.curr_air_id, CONNECTOR_AIR_ID); builder.add_air_proof_input(connector_chip.generate_air_proof_input()); - // Go through all chips in inventory in reverse order they were added (to resolve dependencies) - // Important Note: for air_id ordering reasons, we want to generate_air_proof_input for - // public values and memory chips **last** but include them into the `builder` **first**. + // Go through all chips in inventory in reverse order they were added (to resolve + // dependencies) Important Note: for air_id ordering reasons, we want to + // generate_air_proof_input for public values and memory chips **last** but include + // them into the `builder` **first**. let mut public_values_input = None; let mut insertion_order = self.inventory.insertion_order; insertion_order.reverse(); @@ -1147,7 +1154,8 @@ impl VmProofInputBuilder { } } /// Adds air proof input if one of the main trace matrices is non-empty. - /// Always increments the internal `curr_air_id` regardless of whether a new air proof input was added or not. + /// Always increments the internal `curr_air_id` regardless of whether a new air proof input was + /// added or not. fn add_air_proof_input(&mut self, air_proof_input: AirProofInput) { let h = if !air_proof_input.raw.cached_mains.is_empty() { air_proof_input.raw.cached_mains[0].height() diff --git a/crates/vm/src/arch/integration_api.rs b/crates/vm/src/arch/integration_api.rs index 745f8b58cc..b1116d8c48 100644 --- a/crates/vm/src/arch/integration_api.rs +++ b/crates/vm/src/arch/integration_api.rs @@ -49,8 +49,8 @@ pub trait VmAdapterChip { type Interface: VmAdapterInterface; - /// Given instruction, perform memory reads and return only the read data that the integrator needs to use. - /// This is called at the start of instruction execution. + /// Given instruction, perform memory reads and return only the read data that the integrator + /// needs to use. This is called at the start of instruction execution. /// /// The implementer may choose to store data in the `Self::ReadRecord` struct, for example in /// an [Option], which will later be sent to the `postprocess` method. @@ -64,8 +64,9 @@ pub trait VmAdapterChip { Self::ReadRecord, )>; - /// Given instruction and the data to write, perform memory writes and return the `(record, next_timestamp)` - /// of the full adapter record for this instruction. This is guaranteed to be called after `preprocess`. + /// Given instruction and the data to write, perform memory writes and return the `(record, + /// next_timestamp)` of the full adapter record for this instruction. This is guaranteed to + /// be called after `preprocess`. fn postprocess( &mut self, memory: &mut MemoryController, @@ -94,9 +95,11 @@ pub trait VmAdapterAir: BaseAir { type Interface: VmAdapterInterface; /// [Air](openvm_stark_backend::p3_air::Air) constraints owned by the adapter. - /// The `interface` is given as abstract expressions so it can be directly used in other AIR constraints. + /// The `interface` is given as abstract expressions so it can be directly used in other AIR + /// constraints. /// - /// Adapters should document the max constraint degree as a function of the constraint degrees of `reads, writes, instruction`. + /// Adapters should document the max constraint degree as a function of the constraint degrees + /// of `reads, writes, instruction`. fn eval( &self, builder: &mut AB, @@ -110,9 +113,11 @@ pub trait VmAdapterAir: BaseAir { /// Trait to be implemented on primitive chip to integrate with the machine. pub trait VmCoreChip> { - /// Minimum data that must be recorded to be able to generate trace for one row of `PrimitiveAir`. + /// Minimum data that must be recorded to be able to generate trace for one row of + /// `PrimitiveAir`. type Record: Send + Serialize + DeserializeOwned; - /// The primitive AIR with main constraints that do not depend on memory and other architecture-specifics. + /// The primitive AIR with main constraints that do not depend on memory and other + /// architecture-specifics. type Air: BaseAirWithPublicValues + Clone; #[allow(clippy::type_complexity)] @@ -138,9 +143,10 @@ pub trait VmCoreChip> { fn air(&self) -> &Self::Air; - /// Finalize the trace, especially the padded rows if the all-zero rows don't satisfy the constraints. - /// This is done **after** records are consumed and the trace matrix is generated. - /// Most implementations should just leave the default implementation if padding with rows of all 0s satisfies the constraints. + /// Finalize the trace, especially the padded rows if the all-zero rows don't satisfy the + /// constraints. This is done **after** records are consumed and the trace matrix is + /// generated. Most implementations should just leave the default implementation if padding + /// with rows of all 0s satisfies the constraints. fn finalize(&self, _trace: &mut RowMajorMatrix, _num_records: usize) { // do nothing by default } @@ -394,7 +400,6 @@ where /// The most common adapter interface. /// Performs `NUM_READS` batch reads of size `READ_SIZE` and /// `NUM_WRITES` batch writes of size `WRITE_SIZE`. -/// pub struct BasicAdapterInterface< T, PI, @@ -484,7 +489,8 @@ impl< type ProcessedInstruction = MinimalInstruction; } -/// Similar to `BasicAdapterInterface`, but it flattens the reads and writes into a single flat array for each +/// Similar to `BasicAdapterInterface`, but it flattens the reads and writes into a single flat +/// array for each pub struct FlatInterface( PhantomData, PhantomData, @@ -498,8 +504,8 @@ impl VmAdapterInterfac type ProcessedInstruction = PI; } -/// An interface that is fully determined during runtime. This should **only** be used as a last resort when static -/// compile-time guarantees cannot be made. +/// An interface that is fully determined during runtime. This should **only** be used as a last +/// resort when static compile-time guarantees cannot be made. #[derive(Serialize, Deserialize)] pub struct DynAdapterInterface(PhantomData); diff --git a/crates/vm/src/arch/segment.rs b/crates/vm/src/arch/segment.rs index 56833b7e26..634632ce2b 100644 --- a/crates/vm/src/arch/segment.rs +++ b/crates/vm/src/arch/segment.rs @@ -262,7 +262,8 @@ impl> ExecutionSegment { break; } - // Some phantom instruction handling is more convenient to do here than in PhantomChip. + // Some phantom instruction handling is more convenient to do here than in + // PhantomChip. if opcode == SystemOpcode::PHANTOM.global_opcode() { // Note: the discriminant is the lower 16 bits of the c operand. let discriminant = c.as_canonical_u32() as u16; @@ -357,7 +358,8 @@ impl> ExecutionSegment { }) } - /// Returns bool of whether to switch to next segment or not. This is called every clock cycle inside of Core trace generation. + /// Returns bool of whether to switch to next segment or not. This is called every clock cycle + /// inside of Core trace generation. fn should_segment(&mut self) -> bool { if !self.system_config().continuation_enabled { return false; diff --git a/crates/vm/src/arch/testing/mod.rs b/crates/vm/src/arch/testing/mod.rs index c3aced7c33..44b19177be 100644 --- a/crates/vm/src/arch/testing/mod.rs +++ b/crates/vm/src/arch/testing/mod.rs @@ -339,7 +339,8 @@ where zip(airs, air_proof_inputs).filter(|(_, input)| input.main_trace_height() > 0), ); } - self = self.load(range_checker); // this must be last because other trace generation mutates its state + self = self.load(range_checker); // this must be last because other trace generation + // mutates its state } self } diff --git a/crates/vm/src/arch/vm.rs b/crates/vm/src/arch/vm.rs index c885d34cf0..7e4f99a0e3 100644 --- a/crates/vm/src/arch/vm.rs +++ b/crates/vm/src/arch/vm.rs @@ -209,7 +209,8 @@ where /// Executes a program until a segmentation happens. /// Returns the last segment and the vm state for next segment. - /// This is so that the tracegen and proving of this segment can be immediately started (on a separate machine). + /// This is so that the tracegen and proving of this segment can be immediately started (on a + /// separate machine). pub fn execute_until_segment( &self, exe: impl Into>, @@ -628,9 +629,10 @@ where .collect() } - /// Verify segment proofs, checking continuation boundary conditions between segments if VM memory is persistent - /// The behavior of this function differs depending on whether continuations is enabled or not. - /// We recommend to call the functions [`verify_segments`] or [`verify_single`] directly instead. + /// Verify segment proofs, checking continuation boundary conditions between segments if VM + /// memory is persistent The behavior of this function differs depending on whether + /// continuations is enabled or not. We recommend to call the functions [`verify_segments`] + /// or [`verify_single`] directly instead. pub fn verify( &self, vk: &MultiStarkVerifyingKey, @@ -687,9 +689,9 @@ pub struct VerifiedExecutionPayload { /// - `vk` is a valid verifying key of a VM circuit. /// /// Returns: -/// - The commitment to the [VmCommittedExe] extracted from `proofs`. -/// It is the responsibility of the caller to check that the returned commitment matches -/// the VM executable that the VM was supposed to execute. +/// - The commitment to the [VmCommittedExe] extracted from `proofs`. It is the responsibility of +/// the caller to check that the returned commitment matches the VM executable that the VM was +/// supposed to execute. /// - The Merkle root of the final memory state. /// /// ## Note diff --git a/crates/vm/src/lib.rs b/crates/vm/src/lib.rs index 685738e476..2e3ba461c5 100644 --- a/crates/vm/src/lib.rs +++ b/crates/vm/src/lib.rs @@ -11,8 +11,8 @@ pub mod arch; #[cfg(feature = "bench-metrics")] pub mod metrics; /// System chips that are always required by the architecture. -/// (The [PhantomChip](system::phantom::PhantomChip) is not technically required for a functioning VM, -/// but there is almost always a need for it.) +/// (The [PhantomChip](system::phantom::PhantomChip) is not technically required for a functioning +/// VM, but there is almost always a need for it.) pub mod system; /// Utility functions and test utils pub mod utils; diff --git a/crates/vm/src/metrics/cycle_tracker/mod.rs b/crates/vm/src/metrics/cycle_tracker/mod.rs index 06cbe09193..9b435d93e4 100644 --- a/crates/vm/src/metrics/cycle_tracker/mod.rs +++ b/crates/vm/src/metrics/cycle_tracker/mod.rs @@ -10,7 +10,8 @@ impl CycleTracker { } /// Starts a new cycle tracker span for the given name. - /// If a span already exists for the given name, it ends the existing span and pushes a new one to the vec. + /// If a span already exists for the given name, it ends the existing span and pushes a new one + /// to the vec. pub fn start(&mut self, mut name: String) { // hack to remove "CT-" prefix if name.starts_with("CT-") { diff --git a/crates/vm/src/system/connector/mod.rs b/crates/vm/src/system/connector/mod.rs index 8044a48451..dc9ff88ea2 100644 --- a/crates/vm/src/system/connector/mod.rs +++ b/crates/vm/src/system/connector/mod.rs @@ -161,10 +161,12 @@ impl Air (AB::Expr::ONE - prep_local[0]) * end.is_terminate, ); - // The following constraints hold on every row, so we rename `begin` to `local` to avoid confusion. + // The following constraints hold on every row, so we rename `begin` to `local` to avoid + // confusion. let local = begin; - // We decompose and range check `local.timestamp` as `timestamp_low_limb, timestamp_high_limb` where - // `timestamp = timestamp_low_limb + timestamp_high_limb * 2^range_max_bits`. + // We decompose and range check `local.timestamp` as `timestamp_low_limb, + // timestamp_high_limb` where `timestamp = timestamp_low_limb + timestamp_high_limb + // * 2^range_max_bits`. let (low_bits, high_bits) = self.timestamp_limb_bits(); let high_limb = (local.timestamp - local.timestamp_low_limb) * AB::F::ONE.div_2exp_u64(self.range_bus.range_max_bits as u64); diff --git a/crates/vm/src/system/memory/adapter/air.rs b/crates/vm/src/system/memory/adapter/air.rs index 8bb9fdb699..bcc367b0ec 100644 --- a/crates/vm/src/system/memory/adapter/air.rs +++ b/crates/vm/src/system/memory/adapter/air.rs @@ -67,7 +67,8 @@ impl Air for AccessAdapterAir { // assuming valid: // Split = 1 => direction = 1 => receive parent with count 1, send left/right with count 1 - // Split = 0 => direction = -1 => receive parent with count -1, send left/right with count -1 + // Split = 0 => direction = -1 => receive parent with count -1, send left/right with count + // -1 let direction = local.is_valid * (AB::Expr::TWO * local.is_split - AB::Expr::ONE); self.memory_bus diff --git a/crates/vm/src/system/memory/controller/mod.rs b/crates/vm/src/system/memory/controller/mod.rs index 9c2a3497b3..680a03ab8e 100644 --- a/crates/vm/src/system/memory/controller/mod.rs +++ b/crates/vm/src/system/memory/controller/mod.rs @@ -457,9 +457,9 @@ impl MemoryController { fn replay_access_log(&mut self) { let log = mem::take(&mut self.memory.log); if log.is_empty() { - // Online memory logs may be empty, but offline memory may be replayed from external sources. - // In these cases, we skip the calls to replay access logs because `set_log_capacity` would - // panic. + // Online memory logs may be empty, but offline memory may be replayed from external + // sources. In these cases, we skip the calls to replay access logs because + // `set_log_capacity` would panic. tracing::debug!("skipping replay_access_log"); return; } @@ -477,7 +477,8 @@ impl MemoryController { } } - /// Low-level API to replay a single memory access log entry and populate the [OfflineMemory], [MemoryInterface], and `AccessAdapterInventory`. + /// Low-level API to replay a single memory access log entry and populate the [OfflineMemory], + /// [MemoryInterface], and `AccessAdapterInventory`. pub fn replay_access( entry: MemoryLogEntry, offline_memory: &mut OfflineMemory, @@ -720,7 +721,8 @@ pub struct MemoryAuxColsFactory { pub(crate) _marker: PhantomData, } -// NOTE[jpw]: The `make_*_aux_cols` functions should be thread-safe so they can be used in parallelized trace generation. +// NOTE[jpw]: The `make_*_aux_cols` functions should be thread-safe so they can be used in +// parallelized trace generation. impl MemoryAuxColsFactory { pub fn generate_read_aux(&self, read: &MemoryRecord, buffer: &mut MemoryReadAuxCols) { assert!( diff --git a/crates/vm/src/system/memory/merkle/air.rs b/crates/vm/src/system/memory/merkle/air.rs index 77877ffe87..003aa31f78 100644 --- a/crates/vm/src/system/memory/merkle/air.rs +++ b/crates/vm/src/system/memory/merkle/air.rs @@ -75,7 +75,8 @@ impl Ai // row with least height should have `height_section` = 0, `is_root` = 0 builder.when_last_row().assert_zero(local.height_section); builder.when_last_row().assert_zero(local.is_root); - // `height_section` changes from 0 to 1 only when `parent_height` changes from `address_height` to `address_height` + 1 + // `height_section` changes from 0 to 1 only when `parent_height` changes from + // `address_height` to `address_height` + 1 builder .when_transition() .when_ne( diff --git a/crates/vm/src/system/memory/merkle/mod.rs b/crates/vm/src/system/memory/merkle/mod.rs index 30728a32d7..74f8951bc4 100644 --- a/crates/vm/src/system/memory/merkle/mod.rs +++ b/crates/vm/src/system/memory/merkle/mod.rs @@ -28,7 +28,8 @@ struct FinalState { } impl MemoryMerkleChip { - /// `compression_bus` is the bus for direct (no-memory involved) interactions to call the cryptographic compression function. + /// `compression_bus` is the bus for direct (no-memory involved) interactions to call the + /// cryptographic compression function. pub fn new( memory_dimensions: MemoryDimensions, merkle_bus: PermutationCheckBus, diff --git a/crates/vm/src/system/memory/offline_checker/bridge.rs b/crates/vm/src/system/memory/offline_checker/bridge.rs index 44705d15b6..2c7e180cfb 100644 --- a/crates/vm/src/system/memory/offline_checker/bridge.rs +++ b/crates/vm/src/system/memory/offline_checker/bridge.rs @@ -17,14 +17,14 @@ use crate::system::memory::{ MemoryAddress, }; -/// AUX_LEN is the number of auxiliary columns (aka the number of limbs that the input numbers will be decomposed into) -/// for the `AssertLtSubAir` in the `MemoryOfflineChecker`. +/// AUX_LEN is the number of auxiliary columns (aka the number of limbs that the input numbers will +/// be decomposed into) for the `AssertLtSubAir` in the `MemoryOfflineChecker`. /// Warning: This requires that (clk_max_bits + decomp - 1) / decomp = AUX_LEN /// in MemoryOfflineChecker (or whenever AssertLtSubAir is used) pub(crate) const AUX_LEN: usize = 2; -/// The [MemoryBridge] is used within AIR evaluation functions to constrain logical memory operations (read/write). -/// It adds all necessary constraints and interactions. +/// The [MemoryBridge] is used within AIR evaluation functions to constrain logical memory +/// operations (read/write). It adds all necessary constraints and interactions. #[derive(Clone, Copy, Debug)] pub struct MemoryBridge { offline_checker: MemoryOfflineChecker, @@ -212,8 +212,8 @@ impl> MemoryReadOrImmediateOperation<'_, F, V } } -/// Constraints and interactions for a logical memory write of `(address, data)` at time `timestamp`. -/// This reads `(address, data_prev, timestamp_prev)` from the memory bus and writes +/// Constraints and interactions for a logical memory write of `(address, data)` at time +/// `timestamp`. This reads `(address, data_prev, timestamp_prev)` from the memory bus and writes /// `(address, data, timestamp)` to the memory bus. /// Includes constraints for `timestamp_prev < timestamp`. /// diff --git a/crates/vm/src/system/memory/offline_checker/columns.rs b/crates/vm/src/system/memory/offline_checker/columns.rs index 5ba1b8da6c..5a27b3e433 100644 --- a/crates/vm/src/system/memory/offline_checker/columns.rs +++ b/crates/vm/src/system/memory/offline_checker/columns.rs @@ -95,8 +95,10 @@ pub struct MemoryReadOrImmediateAuxCols { impl AsRef> for MemoryWriteAuxCols { fn as_ref(&self) -> &MemoryReadAuxCols { // Safety: - // - `MemoryReadAuxCols` is repr(C) and its only field is the first field of `MemoryWriteAuxCols`. - // - Thus, the memory layout of `MemoryWriteAuxCols` begins with a valid `MemoryReadAuxCols`. + // - `MemoryReadAuxCols` is repr(C) and its only field is the first field of + // `MemoryWriteAuxCols`. + // - Thus, the memory layout of `MemoryWriteAuxCols` begins with a valid + // `MemoryReadAuxCols`. unsafe { &*(self as *const MemoryWriteAuxCols as *const MemoryReadAuxCols) } } } diff --git a/crates/vm/src/system/memory/persistent.rs b/crates/vm/src/system/memory/persistent.rs index 8936685080..45f9fe9dbd 100644 --- a/crates/vm/src/system/memory/persistent.rs +++ b/crates/vm/src/system/memory/persistent.rs @@ -49,7 +49,8 @@ pub struct PersistentBoundaryCols { /// /// Sends the following interactions: /// - if `expand_direction` is 1, sends `[0, 0, address_space_label, leaf_label]` to `merkle_bus`. -/// - if `expand_direction` is -1, receives `[1, 0, address_space_label, leaf_label]` from `merkle_bus`. +/// - if `expand_direction` is -1, receives `[1, 0, address_space_label, leaf_label]` from +/// `merkle_bus`. #[derive(Clone, Debug)] pub struct PersistentBoundaryAir { pub memory_dims: MemoryDimensions, diff --git a/crates/vm/src/system/memory/volatile/mod.rs b/crates/vm/src/system/memory/volatile/mod.rs index 981624964f..e01162c789 100644 --- a/crates/vm/src/system/memory/volatile/mod.rs +++ b/crates/vm/src/system/memory/volatile/mod.rs @@ -139,7 +139,8 @@ impl Air for VolatileBoundaryAir { .eval(builder, local.is_valid); } let range_max_bits = self.range_bus().range_max_bits; - // Compose addr_space_limbs and pointer_limbs into addr_space, pointer for both local and next + // Compose addr_space_limbs and pointer_limbs into addr_space, pointer for both local and + // next let [addr_space, next_addr_space] = [&local.addr_space_limbs, &next.addr_space_limbs] .map(|limbs| compose::(limbs, range_max_bits)); let [pointer, next_pointer] = [&local.pointer_limbs, &next.pointer_limbs] @@ -153,7 +154,8 @@ impl Air for VolatileBoundaryAir { out: AB::Expr::ONE, count: next.is_valid.into(), }; - // N.B.: this will do range checks (but not other constraints) on the last row if the first row has is_valid = 1 due to wraparound + // N.B.: this will do range checks (but not other constraints) on the last row if the first + // row has is_valid = 1 due to wraparound self.addr_lt_air .eval(builder, (lt_io, (&local.addr_lt_aux).into())); @@ -214,8 +216,8 @@ impl VolatileBoundaryChip { pub fn set_overridden_height(&mut self, overridden_height: usize) { self.overridden_height = Some(overridden_height); } - /// Volatile memory requires the starting and final memory to be in equipartition with block size `1`. - /// When block size is `1`, then the `label` is the same as the address pointer. + /// Volatile memory requires the starting and final memory to be in equipartition with block + /// size `1`. When block size is `1`, then the `label` is the same as the address pointer. pub fn finalize(&mut self, final_memory: TimestampedEquipartition) { self.final_memory = Some(final_memory); } @@ -230,8 +232,9 @@ where } fn generate_air_proof_input(self) -> AirProofInput { - // Volatile memory requires the starting and final memory to be in equipartition with block size `1`. - // When block size is `1`, then the `label` is the same as the address pointer. + // Volatile memory requires the starting and final memory to be in equipartition with block + // size `1`. When block size is `1`, then the `label` is the same as the address + // pointer. let width = self.trace_width(); let air = Arc::new(self.air); let final_memory = self diff --git a/crates/vm/src/system/phantom/mod.rs b/crates/vm/src/system/phantom/mod.rs index 9da168c75b..28977fe2cd 100644 --- a/crates/vm/src/system/phantom/mod.rs +++ b/crates/vm/src/system/phantom/mod.rs @@ -36,7 +36,8 @@ use crate::{ mod tests; /// PhantomAir still needs columns for each nonzero operand in a phantom instruction. -/// We currently allow `a,b,c` where the lower 16 bits of `c` are used as the [PhantomInstruction] discriminant. +/// We currently allow `a,b,c` where the lower 16 bits of `c` are used as the [PhantomInstruction] +/// discriminant. const NUM_PHANTOM_OPERANDS: usize = 3; #[derive(Clone, Debug)] diff --git a/crates/vm/src/system/poseidon2/air.rs b/crates/vm/src/system/poseidon2/air.rs index 124892ca32..99769d253d 100644 --- a/crates/vm/src/system/poseidon2/air.rs +++ b/crates/vm/src/system/poseidon2/air.rs @@ -17,8 +17,8 @@ use super::columns::Poseidon2PeripheryCols; /// Poseidon2 Air, VM version. /// -/// Carries the subair for subtrace generation. Sticking to the conventions, this struct carries no state. -/// `direct` determines whether direct interactions are enabled. By default they are on. +/// Carries the subair for subtrace generation. Sticking to the conventions, this struct carries no +/// state. `direct` determines whether direct interactions are enabled. By default they are on. #[derive(Clone, new, Debug)] pub struct Poseidon2PeripheryAir { pub(super) subair: Arc>, diff --git a/crates/vm/src/system/poseidon2/chip.rs b/crates/vm/src/system/poseidon2/chip.rs index 8ddfa982df..e0059f1ce1 100644 --- a/crates/vm/src/system/poseidon2/chip.rs +++ b/crates/vm/src/system/poseidon2/chip.rs @@ -58,7 +58,8 @@ impl HasherChip { } impl PublicValuesCoreChip { - /// **Note:** `max_degree` is the maximum degree of the constraint polynomials to represent the flags. - /// If you want the overall AIR's constraint degree to be `<= max_constraint_degree`, then typically - /// you should set `max_degree` to `max_constraint_degree - 1`. + /// **Note:** `max_degree` is the maximum degree of the constraint polynomials to represent the + /// flags. If you want the overall AIR's constraint degree to be `<= max_constraint_degree`, + /// then typically you should set `max_degree` to `max_constraint_degree - 1`. pub fn new(num_custom_pvs: usize, max_degree: u32) -> Self { Self { air: PublicValuesCoreAir::new(num_custom_pvs, max_degree), diff --git a/crates/vm/tests/integration_test.rs b/crates/vm/tests/integration_test.rs index e8fb2574ff..168d756111 100644 --- a/crates/vm/tests/integration_test.rs +++ b/crates/vm/tests/integration_test.rs @@ -209,8 +209,8 @@ fn test_vm_override_executor_height() { #[test] fn test_vm_1_optional_air() { - // Aggregation VmConfig has Core/Poseidon2/FieldArithmetic/FieldExtension chips. The program only - // uses Core and FieldArithmetic. All other chips should not have AIR proof inputs. + // Aggregation VmConfig has Core/Poseidon2/FieldArithmetic/FieldExtension chips. The program + // only uses Core and FieldArithmetic. All other chips should not have AIR proof inputs. let config = NativeConfig::aggregation(4, 3); let engine = BabyBearPoseidon2Engine::new(standard_fri_params_with_100_bits_conjectured_security(3)); @@ -381,8 +381,8 @@ fn test_vm_1_persistent() { merkle_air_proof_input.raw.public_values[..8], // The value when you start with zeros and repeatedly hash the value with itself // ptr_max_bits + as_height - 2 times. - // The height of the tree is ptr_max_bits + as_height - log2(8). The leaf also must be hashed once - // with padding for security. + // The height of the tree is ptr_max_bits + as_height - log2(8). The leaf also must be + // hashed once with padding for security. digest ); } @@ -490,7 +490,8 @@ fn test_vm_fibonacci_old() { #[test] fn test_vm_fibonacci_old_cycle_tracker() { - // NOTE: Instructions commented until cycle tracker instructions are not counted as additional assembly Instructions + // NOTE: Instructions commented until cycle tracker instructions are not counted as additional + // assembly Instructions let instructions = vec![ Instruction::debug(PhantomDiscriminant(SysPhantom::CtStart as u16)), Instruction::debug(PhantomDiscriminant(SysPhantom::CtStart as u16)), diff --git a/extensions/algebra/circuit/src/fp2.rs b/extensions/algebra/circuit/src/fp2.rs index 9cdf5663e5..48fcd535d5 100644 --- a/extensions/algebra/circuit/src/fp2.rs +++ b/extensions/algebra/circuit/src/fp2.rs @@ -2,7 +2,8 @@ use std::{cell::RefCell, rc::Rc}; use openvm_mod_circuit_builder::{ExprBuilder, FieldVariable, SymbolicExpr}; -/// Quadratic field extension of `Fp` defined by `Fp2 = Fp[u]/(1 + u^2)`. Assumes that `-1` is not a quadratic residue in `Fp`, which is equivalent to `p` being congruent to `3 (mod 4)`. +/// Quadratic field extension of `Fp` defined by `Fp2 = Fp[u]/(1 + u^2)`. Assumes that `-1` is not a +/// quadratic residue in `Fp`, which is equivalent to `p` being congruent to `3 (mod 4)`. /// Extends Mod Builder to work with Fp2 variables. #[derive(Clone)] pub struct Fp2 { @@ -91,8 +92,9 @@ impl Fp2 { // (1) x0 = y0*z0 - y1*z1 and // (2) x1 = y1*z0 + y0*z1 // which implies z0 and z1 are computed as above. - // Observe (1)*y0 + (2)*y1 yields x0*y0 + x1*y1 = z0(y0^2 + y1^2) and so z0 = (x0*y0 + x1*y1) / (y0^2 + y1^2) as needed. - // Observe (1)*(-y1) + (2)*y0 yields x1*y0 - x0*y1 = z1(y0^2 + y1^2) and so z1 = (x1*y0 - x0*y1) / (y0^2 + y1^2) as needed. + // Observe (1)*y0 + (2)*y1 yields x0*y0 + x1*y1 = z0(y0^2 + y1^2) and so z0 = (x0*y0 + + // x1*y1) / (y0^2 + y1^2) as needed. Observe (1)*(-y1) + (2)*y0 yields x1*y0 - x0*y1 + // = z1(y0^2 + y1^2) and so z1 = (x1*y0 - x0*y1) / (y0^2 + y1^2) as needed. // Constraint 1: x0 = y0*z0 - y1*z1 let constraint1 = &self.c0.expr - &other.c0.expr * &fake_z0 + &other.c1.expr * &fake_z1; diff --git a/extensions/algebra/circuit/src/modular_chip/is_eq.rs b/extensions/algebra/circuit/src/modular_chip/is_eq.rs index 854ba1e5ea..fe91585466 100644 --- a/extensions/algebra/circuit/src/modular_chip/is_eq.rs +++ b/extensions/algebra/circuit/src/modular_chip/is_eq.rs @@ -47,11 +47,11 @@ pub struct ModularIsEqualCoreCols { // Define c_diff_idx analogously. Then let b_lt_diff = N[b_diff_idx] - b[b_diff_idx] and // c_lt_diff = N[c_diff_idx] - c[c_diff_idx], where both must be in [0, 2^LIMB_BITS). // - // To constrain the above, we will use lt_marker, which will indicate where b_diff_idx and c_diff_idx are. - // Set lt_marker[b_diff_idx] = 1, lt_marker[c_diff_idx] = c_lt_mark, and 0 everywhere - // else. If b_diff_idx == c_diff_idx then c_lt_mark = 1, else c_lt_mark = 2. The purpose of - // c_lt_mark is to handle the edge case where b_diff_idx == c_diff_idx (because we cannot set - // lt_marker[b_diff_idx] to 1 and 2 at the same time). + // To constrain the above, we will use lt_marker, which will indicate where b_diff_idx and + // c_diff_idx are. Set lt_marker[b_diff_idx] = 1, lt_marker[c_diff_idx] = c_lt_mark, and 0 + // everywhere else. If b_diff_idx == c_diff_idx then c_lt_mark = 1, else c_lt_mark = 2. The + // purpose of c_lt_mark is to handle the edge case where b_diff_idx == c_diff_idx (because + // we cannot set lt_marker[b_diff_idx] to 1 and 2 at the same time). pub lt_marker: [T; READ_LIMBS], pub b_lt_diff: T, pub c_lt_diff: T, @@ -204,16 +204,20 @@ where // Constrain b < N. // First, we constrain b[i] = N[i] for i > b_diff_idx. - // We do this by constraining that b[i] = N[i] when prefix_sum is not 1 or lt_marker_sum. - // - If is_setup = 0, then lt_marker_sum is either 1 or 3. In this case, prefix_sum is 0, 1, 2, or 3. - // It can be verified by casework that i > b_diff_idx iff prefix_sum is not 1 or lt_marker_sum. - // - If is_setup = 1, then we want to constrain b[i] = N[i] for all i. In this case, lt_marker_sum is 2 - // and prefix_sum is 0 or 2. So we constrain b[i] = N[i] when prefix_sum is not 1, which works. + // We do this by constraining that b[i] = N[i] when prefix_sum is not 1 or + // lt_marker_sum. + // - If is_setup = 0, then lt_marker_sum is either 1 or 3. In this case, prefix_sum is + // 0, 1, 2, or 3. It can be verified by casework that i > b_diff_idx iff prefix_sum + // is not 1 or lt_marker_sum. + // - If is_setup = 1, then we want to constrain b[i] = N[i] for all i. In this case, + // lt_marker_sum is 2 and prefix_sum is 0 or 2. So we constrain b[i] = N[i] when + // prefix_sum is not 1, which works. builder .when_ne(prefix_sum.clone(), AB::F::ONE) .when_ne(prefix_sum.clone(), lt_marker_sum.clone() - cols.is_setup) .assert_eq(cols.b[i], modulus[i]); - // Note that lt_marker[i] is either 0, 1, or 2 and lt_marker[i] being 1 indicates b[i] < N[i] (i.e. i == b_diff_idx). + // Note that lt_marker[i] is either 0, 1, or 2 and lt_marker[i] being 1 indicates b[i] < + // N[i] (i.e. i == b_diff_idx). builder .when_ne(cols.lt_marker[i], AB::F::ZERO) .when_ne(cols.lt_marker[i], AB::F::from_canonical_u8(2)) @@ -221,14 +225,16 @@ where // Constrain c < N. // First, we constrain c[i] = N[i] for i > c_diff_idx. - // We do this by constraining that c[i] = N[i] when prefix_sum is not c_lt_mark or lt_marker_sum. - // It can be verified by casework that i > c_diff_idx iff prefix_sum is not c_lt_mark or lt_marker_sum. + // We do this by constraining that c[i] = N[i] when prefix_sum is not c_lt_mark or + // lt_marker_sum. It can be verified by casework that i > c_diff_idx iff + // prefix_sum is not c_lt_mark or lt_marker_sum. builder .when_ne(prefix_sum.clone(), cols.c_lt_mark) .when_ne(prefix_sum.clone(), lt_marker_sum.clone()) .assert_eq(cols.c[i], modulus[i]); - // Note that lt_marker[i] is either 0, 1, or 2 and lt_marker[i] being c_lt_mark indicates c[i] < N[i] (i.e. i == c_diff_idx). - // Since c_lt_mark is 1 or 2, we have {0, 1, 2} \ {0, 3 - c_lt_mark} = {c_lt_mark}. + // Note that lt_marker[i] is either 0, 1, or 2 and lt_marker[i] being c_lt_mark + // indicates c[i] < N[i] (i.e. i == c_diff_idx). Since c_lt_mark is 1 or 2, + // we have {0, 1, 2} \ {0, 3 - c_lt_mark} = {c_lt_mark}. builder .when_ne(cols.lt_marker[i], AB::F::ZERO) .when_ne( diff --git a/extensions/algebra/circuit/src/modular_chip/muldiv.rs b/extensions/algebra/circuit/src/modular_chip/muldiv.rs index fe5ca49cdd..30f063e2b1 100644 --- a/extensions/algebra/circuit/src/modular_chip/muldiv.rs +++ b/extensions/algebra/circuit/src/modular_chip/muldiv.rs @@ -33,7 +33,8 @@ pub fn muldiv_expr( // constraint is x * y = z, or z * y = x let lvar = FieldVariable::select(is_mul_flag, &x, &z); let rvar = FieldVariable::select(is_mul_flag, &z, &x); - // When it's SETUP op, x = p == 0, y = 0, both flags are false, and it still works: z * 0 - x = 0, whatever z is. + // When it's SETUP op, x = p == 0, y = 0, both flags are false, and it still works: z * 0 - x = + // 0, whatever z is. let constraint = lvar * y.clone() - rvar; builder.borrow_mut().set_constraint(z_idx, constraint.expr); let compute = SymbolicExpr::Select( diff --git a/extensions/algebra/circuit/src/modular_chip/tests.rs b/extensions/algebra/circuit/src/modular_chip/tests.rs index bc3520cd76..1ad3310f76 100644 --- a/extensions/algebra/circuit/src/modular_chip/tests.rs +++ b/extensions/algebra/circuit/src/modular_chip/tests.rs @@ -462,7 +462,8 @@ where F::from_canonical_u32(self.chip.air.modulus_limbs[READ_LIMBS - 1]) - record.b[READ_LIMBS - 1]; } else if record.b[0] == F::from_canonical_u32(2) { - // test the constraint that b[i] = N[i] for all i when prefix_sum is not 1 or lt_marker_sum - is_setup + // test the constraint that b[i] = N[i] for all i when prefix_sum is not 1 or + // lt_marker_sum - is_setup row_slice.c_lt_mark = F::from_canonical_u8(2); row_slice.lt_marker = [F::ZERO; READ_LIMBS]; row_slice.lt_marker[READ_LIMBS - 1] = F::from_canonical_u8(2); @@ -499,7 +500,8 @@ fn test_is_equal_setup_bad< >( opcode_offset: usize, modulus: BigUint, - b_val: u32, // used to select which bug to test. currently only 1, 2, and 3 are supported (because there are three bugs to test) + b_val: u32, /* used to select which bug to test. currently only 1, 2, and 3 are supported + * (because there are three bugs to test) */ ) { let bitwise_bus = BitwiseOperationLookupBus::new(BITWISE_OP_LOOKUP_BUS); let bitwise_chip = SharedBitwiseOperationLookupChip::::new(bitwise_bus); diff --git a/extensions/algebra/complex-macros/src/lib.rs b/extensions/algebra/complex-macros/src/lib.rs index 884f819d24..d829abeeed 100644 --- a/extensions/algebra/complex-macros/src/lib.rs +++ b/extensions/algebra/complex-macros/src/lib.rs @@ -519,8 +519,9 @@ pub fn complex_declare(input: TokenStream) -> TokenStream { /// /// complex_init!(Complex2 { mod_idx = 1 }, Complex1 { mod_idx = 0 }); /// ``` -/// In particular, the order of complex types in the macro doesn't have to match the order of moduli in `moduli_init!`, -/// but they should be accompanied by the `mod_idx` corresponding to the order in the `moduli_init!` macro (not `moduli_declare!`). +/// In particular, the order of complex types in the macro doesn't have to match the order of moduli +/// in `moduli_init!`, but they should be accompanied by the `mod_idx` corresponding to the order in +/// the `moduli_init!` macro (not `moduli_declare!`). #[proc_macro] pub fn complex_init(input: TokenStream) -> TokenStream { let MacroArgs { items } = parse_macro_input!(input as MacroArgs); diff --git a/extensions/algebra/guest/src/field/mod.rs b/extensions/algebra/guest/src/field/mod.rs index d9d0d678e8..326bd08838 100644 --- a/extensions/algebra/guest/src/field/mod.rs +++ b/extensions/algebra/guest/src/field/mod.rs @@ -6,7 +6,8 @@ use core::{ use crate::{DivAssignUnsafe, DivUnsafe}; -// TODO[jpw]: the shared parts of Field and IntMod should be moved into a new `IntegralDomain` trait. +// TODO[jpw]: the shared parts of Field and IntMod should be moved into a new `IntegralDomain` +// trait. /// This is a simplified trait for field elements. pub trait Field: Sized @@ -62,7 +63,8 @@ pub trait Field: pub trait FieldExtension { /// Extension field degree. const D: usize; - /// This should be [BaseField; D]. It is an associated type due to rust const generic limitations. + /// This should be [BaseField; D]. It is an associated type due to rust const generic + /// limitations. type Coeffs: Sized; /// Create an extension field element from its base field coefficients. @@ -80,7 +82,8 @@ pub trait FieldExtension { /// Embed a base field element into an extension field element. fn embed(base_elem: BaseField) -> Self; - /// Frobenius map: take `self` to the `p^power`th power, where `p` is the prime characteristic of the field. + /// Frobenius map: take `self` to the `p^power`th power, where `p` is the prime characteristic + /// of the field. fn frobenius_map(&self, power: usize) -> Self; /// Multiply an extension field element by an element in the base field diff --git a/extensions/algebra/guest/src/halo2curves.rs b/extensions/algebra/guest/src/halo2curves.rs index 6571b1e98e..a9a6513ac6 100644 --- a/extensions/algebra/guest/src/halo2curves.rs +++ b/extensions/algebra/guest/src/halo2curves.rs @@ -123,7 +123,8 @@ mod bn254 { } } - /// FieldExtension for Fq12 with Fq6 as base field since halo2curves does not implement `Field` for Fq6. + /// FieldExtension for Fq12 with Fq6 as base field since halo2curves does not implement `Field` + /// for Fq6. impl FieldExtension for Fq12 { const D: usize = 6; type Coeffs = [Fq2; 6]; @@ -289,9 +290,11 @@ mod bls12_381 { } } - /// Note that halo2curves does not implement `Field` for Fq6, so we need to implement the intermediate points manually. + /// Note that halo2curves does not implement `Field` for Fq6, so we need to implement the + /// intermediate points manually. /// - /// FieldExtension for Fq12 with Fq2 as base field since halo2curves does not implement `Field` for Fq6. + /// FieldExtension for Fq12 with Fq2 as base field since halo2curves does not implement `Field` + /// for Fq6. impl FieldExtension for Fq12 { const D: usize = 6; type Coeffs = [Fq2; 6]; diff --git a/extensions/algebra/guest/src/lib.rs b/extensions/algebra/guest/src/lib.rs index 27c78bf42e..1d778f0013 100644 --- a/extensions/algebra/guest/src/lib.rs +++ b/extensions/algebra/guest/src/lib.rs @@ -118,7 +118,8 @@ pub trait IntMod: { /// Underlying representation of IntMod. Usually of the form `[u8; NUM_LIMBS]`. type Repr: AsRef<[u8]> + AsMut<[u8]>; - /// `SelfRef<'a>` should almost always be `&'a Self`. This is a way to include implementations of binary operations where both sides are `&'a Self`. + /// `SelfRef<'a>` should almost always be `&'a Self`. This is a way to include implementations + /// of binary operations where both sides are `&'a Self`. type SelfRef<'a>: Add<&'a Self, Output = Self> + Sub<&'a Self, Output = Self> + Neg diff --git a/extensions/algebra/moduli-macros/src/lib.rs b/extensions/algebra/moduli-macros/src/lib.rs index 78e779a3f5..5d8d921f2f 100644 --- a/extensions/algebra/moduli-macros/src/lib.rs +++ b/extensions/algebra/moduli-macros/src/lib.rs @@ -12,15 +12,16 @@ use syn::{ static MOD_IDX: AtomicUsize = AtomicUsize::new(0); -/// This macro generates the code to setup the modulus for a given prime. Also it places the moduli into a special static variable to be later extracted from the ELF and used by the VM. -/// Usage: +/// This macro generates the code to setup the modulus for a given prime. Also it places the moduli +/// into a special static variable to be later extracted from the ELF and used by the VM. Usage: /// ``` /// moduli_declare! { /// Bls12381 { modulus = "0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab" }, /// Bn254 { modulus = "21888242871839275222246405745257275088696311157297823662689037894645226208583" }, /// } /// ``` -/// This creates two structs, `Bls12381` and `Bn254`, each representing the modular arithmetic class (implementing `Add`, `Sub` and so on). +/// This creates two structs, `Bls12381` and `Bn254`, each representing the modular arithmetic class +/// (implementing `Add`, `Sub` and so on). #[proc_macro] pub fn moduli_declare(input: TokenStream) -> TokenStream { let MacroArgs { items } = parse_macro_input!(input as MacroArgs); @@ -783,7 +784,8 @@ pub fn moduli_init(input: TokenStream) -> TokenStream { let serialized_modulus = core::iter::once(1) // 1 for "modulus" - .chain(core::iter::once(mod_idx as u8)) // mod_idx is u8 for now (can make it u32), because we don't know the order of variables in the elf + .chain(core::iter::once(mod_idx as u8)) // mod_idx is u8 for now (can make it u32), because we don't know the order of + // variables in the elf .chain((modulus_bytes.len() as u32).to_le_bytes().iter().copied()) .chain(modulus_bytes.iter().copied()) .collect::>(); diff --git a/extensions/ecc/circuit/src/weierstrass_chip/mod.rs b/extensions/ecc/circuit/src/weierstrass_chip/mod.rs index 1738c69556..0bcee1facf 100644 --- a/extensions/ecc/circuit/src/weierstrass_chip/mod.rs +++ b/extensions/ecc/circuit/src/weierstrass_chip/mod.rs @@ -23,8 +23,8 @@ use openvm_stark_backend::p3_field::PrimeField32; /// BLOCK_SIZE: how many cells do we read at a time, must be a power of 2. /// BLOCKS: how many blocks do we need to represent one input or output -/// For example, for bls12_381, BLOCK_SIZE = 16, each element has 3 blocks and with two elements per input AffinePoint, BLOCKS = 6. -/// For secp256k1, BLOCK_SIZE = 32, BLOCKS = 2. +/// For example, for bls12_381, BLOCK_SIZE = 16, each element has 3 blocks and with two elements per +/// input AffinePoint, BLOCKS = 6. For secp256k1, BLOCK_SIZE = 32, BLOCKS = 2. #[derive(Chip, ChipUsageGetter, InstructionExecutor)] pub struct EcAddNeChip( pub VmChipWrapper< diff --git a/extensions/ecc/circuit/src/weierstrass_chip/tests.rs b/extensions/ecc/circuit/src/weierstrass_chip/tests.rs index 751d351200..213918ec2e 100644 --- a/extensions/ecc/circuit/src/weierstrass_chip/tests.rs +++ b/extensions/ecc/circuit/src/weierstrass_chip/tests.rs @@ -192,7 +192,8 @@ fn test_double() { let a_limbs = [BabyBear::ZERO; NUM_LIMBS]; let setup_instruction = rv32_write_heap_default( &mut tester, - vec![prime_limbs, a_limbs], // inputs[0] = prime, inputs[1] = a coeff of weierstrass equation + vec![prime_limbs, a_limbs], /* inputs[0] = prime, inputs[1] = a coeff of weierstrass + * equation */ vec![], chip.0.core.air.offset + Rv32WeierstrassOpcode::SETUP_EC_DOUBLE as usize, ); @@ -280,7 +281,8 @@ fn test_p256_double() { biguint_to_limbs::(a.clone(), LIMB_BITS).map(BabyBear::from_canonical_u32); let setup_instruction = rv32_write_heap_default( &mut tester, - vec![prime_limbs, a_limbs], // inputs[0] = prime, inputs[1] = a coeff of weierstrass equation + vec![prime_limbs, a_limbs], /* inputs[0] = prime, inputs[1] = a coeff of weierstrass + * equation */ vec![], chip.0.core.air.offset + Rv32WeierstrassOpcode::SETUP_EC_DOUBLE as usize, ); diff --git a/extensions/ecc/guest/src/weierstrass.rs b/extensions/ecc/guest/src/weierstrass.rs index 81672fbfb4..e1783e429d 100644 --- a/extensions/ecc/guest/src/weierstrass.rs +++ b/extensions/ecc/guest/src/weierstrass.rs @@ -82,7 +82,8 @@ pub trait FromCompressed { /// Decompresses a point from its x-coordinate and a recovery identifier which indicates /// the parity of the y-coordinate. Given the x-coordinate, this function attempts to find the /// corresponding y-coordinate that satisfies the elliptic curve equation. If successful, it - /// returns the point as an instance of Self. If the point cannot be decompressed, it returns None. + /// returns the point as an instance of Self. If the point cannot be decompressed, it returns + /// None. fn decompress(x: Coordinate, rec_id: &u8) -> Option where Self: core::marker::Sized; @@ -100,8 +101,9 @@ pub trait FromCompressed { fn hint_decompress(x: &Coordinate, rec_id: &u8) -> Option>; } -/// A trait for elliptic curves that bridges the openvm types and external types with CurveArithmetic etc. -/// Implement this for external curves with corresponding openvm point and scalar types. +/// A trait for elliptic curves that bridges the openvm types and external types with +/// CurveArithmetic etc. Implement this for external curves with corresponding openvm point and +/// scalar types. pub trait IntrinsicCurve { type Scalar: Clone; type Point: Clone; @@ -115,7 +117,8 @@ pub trait IntrinsicCurve { // MSM using preprocessed table (windowed method) // Reference: modified from https://github.com/arkworks-rs/algebra/blob/master/ec/src/scalar_mul/mod.rs // -// We specialize to Weierstrass curves and further make optimizations for when the curve order is prime. +// We specialize to Weierstrass curves and further make optimizations for when the curve order is +// prime. /// Cached precomputations of scalar multiples of several base points. /// - `window_bits` is the window size used for the precomputation @@ -232,19 +235,20 @@ where } /// Macro to generate a newtype wrapper for [AffinePoint](crate::AffinePoint) -/// that implements elliptic curve operations by using the underlying field operations according to the -/// [formulas](https://www.hyperelliptic.org/EFD/g1p/auto-shortw.html) for short Weierstrass curves. +/// that implements elliptic curve operations by using the underlying field operations according to +/// the [formulas](https://www.hyperelliptic.org/EFD/g1p/auto-shortw.html) for short Weierstrass curves. /// /// The following imports are required: /// ```rust /// use core::ops::AddAssign; /// /// use openvm_algebra_guest::{DivUnsafe, Field}; -/// use openvm_ecc_guest::{AffinePoint, Group, weierstrass::WeierstrassPoint}; +/// use openvm_ecc_guest::{weierstrass::WeierstrassPoint, AffinePoint, Group}; /// ``` #[macro_export] macro_rules! impl_sw_affine { - // Assumes `a = 0` in curve equation. `$three` should be a constant expression for `3` of type `$field`. + // Assumes `a = 0` in curve equation. `$three` should be a constant expression for `3` of type + // `$field`. ($struct_name:ident, $field:ty, $three:expr, $b:expr) => { /// A newtype wrapper for [AffinePoint] that implements elliptic curve operations /// by using the underlying field operations according to the [formulas](https://www.hyperelliptic.org/EFD/g1p/auto-shortw.html) for short Weierstrass curves. diff --git a/extensions/ecc/sw-macros/src/lib.rs b/extensions/ecc/sw-macros/src/lib.rs index dbf8117bac..c739b1965c 100644 --- a/extensions/ecc/sw-macros/src/lib.rs +++ b/extensions/ecc/sw-macros/src/lib.rs @@ -8,15 +8,17 @@ use syn::{ parse_macro_input, Expr, ExprPath, Path, Token, }; -/// This macro generates the code to setup the elliptic curve for a given modular type. Also it places the curve parameters into a special static variable to be later extracted from the ELF and used by the VM. -/// Usage: +/// This macro generates the code to setup the elliptic curve for a given modular type. Also it +/// places the curve parameters into a special static variable to be later extracted from the ELF +/// and used by the VM. Usage: /// ``` /// sw_declare! { /// [TODO] /// } /// ``` /// -/// For this macro to work, you must import the `elliptic_curve` crate and the `openvm_ecc_guest` crate. +/// For this macro to work, you must import the `elliptic_curve` crate and the `openvm_ecc_guest` +/// crate. #[proc_macro] pub fn sw_declare(input: TokenStream) -> TokenStream { let MacroArgs { items } = parse_macro_input!(input as MacroArgs); @@ -45,11 +47,13 @@ pub fn sw_declare(input: TokenStream) -> TokenStream { } } "a" => { - // We currently leave it to the compiler to check if the expression is actually a constant + // We currently leave it to the compiler to check if the expression is actually + // a constant const_a = Some(param.value); } "b" => { - // We currently leave it to the compiler to check if the expression is actually a constant + // We currently leave it to the compiler to check if the expression is actually + // a constant const_b = Some(param.value); } _ => { diff --git a/extensions/ecc/tests/programs/examples/decompress.rs b/extensions/ecc/tests/programs/examples/decompress.rs index f47b7a05e0..6f549d311c 100644 --- a/extensions/ecc/tests/programs/examples/decompress.rs +++ b/extensions/ecc/tests/programs/examples/decompress.rs @@ -138,8 +138,9 @@ fn test_possible_decompression { /// dst <- \[dst_ptr:4\]_1 pub dst: [T; RV32_REGISTER_NUM_LIMBS], /// src <- \[src_ptr:4\]_1 - /// We store src_limbs\[i\] = \[src_ptr + i + 1\]_1 and src = u32(\[src_ptr:4\]_1) from which \[src_ptr\]_1 - /// can be recovered by linear combination. + /// We store src_limbs\[i\] = \[src_ptr + i + 1\]_1 and src = u32(\[src_ptr:4\]_1) from which + /// \[src_ptr\]_1 can be recovered by linear combination. /// We do this because `src` needs to be incremented between keccak-f permutations. pub src_limbs: [T; RV32_REGISTER_NUM_LIMBS - 1], pub src: T, @@ -97,8 +97,8 @@ pub struct KeccakMemoryCols { pub register_aux: [MemoryReadAuxCols; KECCAK_REGISTER_READS], pub absorb_reads: [MemoryReadAuxCols; KECCAK_ABSORB_READS], pub digest_writes: [MemoryWriteAuxCols; KECCAK_DIGEST_WRITES], - /// The input bytes are batch read in blocks of private constant KECCAK_WORD_SIZE bytes. However - /// if the input length is not a multiple of KECCAK_WORD_SIZE, we read into + /// The input bytes are batch read in blocks of private constant KECCAK_WORD_SIZE bytes. + /// However if the input length is not a multiple of KECCAK_WORD_SIZE, we read into /// `partial_block` more bytes than we need. On the other hand `block_bytes` expects /// only the partial block of bytes and then the correctly padded bytes. /// We will select between `partial_block` and `block_bytes` for what to read from memory. diff --git a/extensions/keccak256/circuit/src/lib.rs b/extensions/keccak256/circuit/src/lib.rs index a0640054ab..c9fd1c9f5a 100644 --- a/extensions/keccak256/circuit/src/lib.rs +++ b/extensions/keccak256/circuit/src/lib.rs @@ -92,7 +92,8 @@ pub struct KeccakRecord { #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct KeccakInputBlock { - /// Memory reads for non-padding bytes in this block. Length is at most [KECCAK_RATE_BYTES / KECCAK_WORD_SIZE]. + /// Memory reads for non-padding bytes in this block. Length is at most [KECCAK_RATE_BYTES / + /// KECCAK_WORD_SIZE]. pub reads: Vec, /// Index in `reads` of the memory read for < KECCAK_WORD_SIZE bytes, if any. pub partial_read_idx: Option, @@ -250,8 +251,8 @@ impl InstructionExecutor for KeccakVmChip { // Add the events to chip state for later trace generation usage self.records.push(record); - // NOTE: Check this is consistent with KeccakVmAir::timestamp_change (we don't use it to avoid - // unnecessary conversions here) + // NOTE: Check this is consistent with KeccakVmAir::timestamp_change (we don't use it to + // avoid unnecessary conversions here) let total_timestamp_delta = len + (KECCAK_REGISTER_READS + KECCAK_ABSORB_READS + KECCAK_DIGEST_WRITES) as u32; memory.increment_timestamp_by(total_timestamp_delta - timestamp_delta); diff --git a/extensions/keccak256/circuit/src/trace.rs b/extensions/keccak256/circuit/src/trace.rs index 2f37db6a0d..c314c38eac 100644 --- a/extensions/keccak256/circuit/src/trace.rs +++ b/extensions/keccak256/circuit/src/trace.rs @@ -205,7 +205,8 @@ where first_row.sponge.is_new_start = Val::::from_bool(block.is_new_start); first_row.sponge.state_hi = diff.pre_hi.map(Val::::from_canonical_u8); first_row.instruction.is_enabled_first_round = first_row.instruction.is_enabled; - // Make memory access aux columns. Any aux column not explicitly defined defaults to all 0s + // Make memory access aux columns. Any aux column not explicitly defined defaults to + // all 0s if let Some(register_reads) = diff.register_reads { let need_range_check = [ ®ister_reads[0], // dst diff --git a/extensions/native/circuit/src/castf/core.rs b/extensions/native/circuit/src/castf/core.rs index 0d775f1c94..664767e35e 100644 --- a/extensions/native/circuit/src/castf/core.rs +++ b/extensions/native/circuit/src/castf/core.rs @@ -34,7 +34,8 @@ pub struct CastFCoreCols { #[derive(Copy, Clone, Debug)] pub struct CastFCoreAir { - pub bus: VariableRangeCheckerBus, // to communicate with the range checker that checks that all limbs are < 2^LIMB_BITS + pub bus: VariableRangeCheckerBus, /* to communicate with the range checker that checks that + * all limbs are < 2^LIMB_BITS */ } impl BaseAir for CastFCoreAir { diff --git a/extensions/native/circuit/src/field_arithmetic/core.rs b/extensions/native/circuit/src/field_arithmetic/core.rs index 18b2a02612..c813f6a066 100644 --- a/extensions/native/circuit/src/field_arithmetic/core.rs +++ b/extensions/native/circuit/src/field_arithmetic/core.rs @@ -71,7 +71,8 @@ where // - Exactly one flag in `flags` is true. // - The inner product of the `flags` and `opcodes` equals `io.opcode`. // - The inner product of the `flags` and `results` equals `io.z`. - // - If `is_div` is true, then `aux.divisor_inv` correctly represents the multiplicative inverse of `io.y`. + // - If `is_div` is true, then `aux.divisor_inv` correctly represents the multiplicative + // inverse of `io.y`. let mut is_valid = AB::Expr::ZERO; let mut expected_opcode = AB::Expr::ZERO; diff --git a/extensions/native/circuit/src/fri/mod.rs b/extensions/native/circuit/src/fri/mod.rs index 054607a34a..7dbc3fd851 100644 --- a/extensions/native/circuit/src/fri/mod.rs +++ b/extensions/native/circuit/src/fri/mod.rs @@ -133,8 +133,8 @@ struct GeneralCols { /// Whether the row is an instruction row. is_ins_row: T, /// For Instruction1 rows, the initial timestamp of the FRI_REDUCED_OPENING instruction. - /// For Workload rows, the final timestamp after processing the next elements minus `INSTRUCTION_READS`. - /// For Instruction2 rows, unused. + /// For Workload rows, the final timestamp after processing the next elements minus + /// `INSTRUCTION_READS`. For Instruction2 rows, unused. timestamp: T, } const GENERAL_WIDTH: usize = GeneralCols::::width(); @@ -159,8 +159,8 @@ struct DataCols { /// b-values. (Note: idx increases within a workload/instruction block, while timestamp, a_ptr, /// and b_ptr decrease.) idx: T, - /// For both Instruction1 and Workload rows, equal to sum_{k=0}^{idx} alpha^{len-i} (b_i - a_i). - /// Instruction1 rows constrain this to be the result written to `mem[result_ptr]`. + /// For both Instruction1 and Workload rows, equal to sum_{k=0}^{idx} alpha^{len-i} (b_i - + /// a_i). Instruction1 rows constrain this to be the result written to `mem[result_ptr]`. result: [T; EXT_DEG], /// The alpha to use in this instruction. Fixed across workload rows; Instruction1 rows read /// this from `mem[alpha_ptr]`. @@ -175,8 +175,8 @@ const_assert_eq!(DATA_WIDTH, 12); #[derive(Debug, AlignedBorrow)] struct PrefixCols { general: GeneralCols, - /// WorkloadCols uses this column as the value of `a` read. Instruction1Cols uses this column as - /// the `is_first` flag must be set to one. Shared with Instruction2Cols `is_first`. + /// WorkloadCols uses this column as the value of `a` read. Instruction1Cols uses this column + /// as the `is_first` flag must be set to one. Shared with Instruction2Cols `is_first`. a_or_is_first: T, data: DataCols, } @@ -285,8 +285,9 @@ impl FriReducedOpeningAir { // a_ptr/b_ptr/length/result let ptr_reads = AB::F::from_canonical_usize(INSTRUCTION_READS); let native_as = AB::Expr::from_canonical_u32(AS::Native as u32); - // write_a itself could be anything on non-workload row, but on workload row, it must be boolean. - // write_a on last workflow row will be constrained to equal write_a on instruction1 row, implying the latter is boolean. + // write_a itself could be anything on non-workload row, but on workload row, it must be + // boolean. write_a on last workflow row will be constrained to equal write_a on + // instruction1 row, implying the latter is boolean. builder.when(multiplicity).assert_bool(local_data.write_a); // read a when write_a is 0 self.memory_bridge diff --git a/extensions/native/circuit/src/poseidon2/columns.rs b/extensions/native/circuit/src/poseidon2/columns.rs index dc67a3363f..6c47c23245 100644 --- a/extensions/native/circuit/src/poseidon2/columns.rs +++ b/extensions/native/circuit/src/poseidon2/columns.rs @@ -10,8 +10,8 @@ use crate::{poseidon2::CHUNK, utils::const_max}; /// 2. **Simple Block:** A single row handling permutation/compression operations. /// 3. **Inside-Row Block:** A sequence of rows that compute the row-hash for all input matrix /// columns corresponding to an `MmcsVerifyBatch` input of the same height. -/// 4. **Top-Level Block:** A sequence of rows that perform Merkle tree compression on the row hashes -/// produced from an `MmcsVerifyBatch` input. +/// 4. **Top-Level Block:** A sequence of rows that perform Merkle tree compression on the row +/// hashes produced from an `MmcsVerifyBatch` input. #[repr(C)] #[derive(AlignedBorrow)] pub struct NativePoseidon2Cols { @@ -47,9 +47,10 @@ pub struct NativePoseidon2Cols { /// associated with the same instruction. pub opened_element_size_inv: T, - /// On an `incorporate_row` row, this is the first matrix index `i` for which `log_heights[i]` equals `log_height`. - /// On an `incorporate_sibling` row, this holds the initial index corresponding to the `log_height` for the next - /// `incorporate_row` row, or `opened_length` if none exists. + /// On an `incorporate_row` row, this is the first matrix index `i` for which `log_heights[i]` + /// equals `log_height`. On an `incorporate_sibling` row, this holds the initial index + /// corresponding to the `log_height` for the next `incorporate_row` row, or + /// `opened_length` if none exists. pub initial_opened_index: T, /// Pointer to the beginning of the `opened_values` array. @@ -75,9 +76,10 @@ pub struct TopLevelSpecificCols { /// The program counter for the VERIFY_BATCH instruction being processed. pub pc: T, - /// The timestamp marking the end of processing this top-level row. For an `incorporate_sibling` row, - /// it increases by a fixed amount. For an `incorporate_row` row, its increase depends on the row's length - /// and the number of matrices involved, with additional constraints imposed by the internal bus. + /// The timestamp marking the end of processing this top-level row. For an + /// `incorporate_sibling` row, it increases by a fixed amount. For an `incorporate_row` + /// row, its increase depends on the row's length and the number of matrices involved, with + /// additional constraints imposed by the internal bus. pub end_timestamp: T, /// Operand `a` from the instruction. Pointer to the `dimensions` array. @@ -86,7 +88,8 @@ pub struct TopLevelSpecificCols { pub opened_register: T, /// Operand `c` from the instruction. Pointer to the length of the `opened_values` array. pub opened_length_register: T, - /// Operand `d` from the instruction. Provided as a hint to the run-time and (otherwise unconstrained). + /// Operand `d` from the instruction. Provided as a hint to the run-time and (otherwise + /// unconstrained). pub proof_id: T, /// Operand `e` from the instruction. Pointer to the pointer of the `index_bits` array, which /// indicates the direction (left/right) of Merkle tree siblings. @@ -94,8 +97,9 @@ pub struct TopLevelSpecificCols { /// Operand `f` from the instruction. Pointer to the pointer of the expected Merkle root. pub commit_register: T, - /// For an `incorporate_row` row, the largest matrix index `i` such that `log_heights[i]` equals `log_height`. - /// For an `incorporate_sibling` row, this is set to `initial_opened_index - 1` for bookkeeping. + /// For an `incorporate_row` row, the largest matrix index `i` such that `log_heights[i]` + /// equals `log_height`. For an `incorporate_sibling` row, this is set to + /// `initial_opened_index - 1` for bookkeeping. pub final_opened_index: T, /// The log height of the matrices currently being incorporated. Remains fixed on @@ -124,7 +128,8 @@ pub struct TopLevelSpecificCols { pub commit_pointer_read: MemoryReadAuxCols, /// Index into the Merkle proof for the next sibling to incorporate. - /// Starts at zero in a top-level block and increments by one after each `incorporate_sibling` row. + /// Starts at zero in a top-level block and increments by one after each `incorporate_sibling` + /// row. pub proof_index: T, /// Memory aux columns for reading either `initial_height` or `sibling_is_on_right`. On an @@ -135,7 +140,8 @@ pub struct TopLevelSpecificCols { pub read_final_height: MemoryReadAuxCols, /// Indicator for whether the sibling being incorporated (if any) is on the right. Constrained - /// to equal `index_bits[proof_index]` on `incorporate_sibling` rows. Unconstrained on other rows. + /// to equal `index_bits[proof_index]` on `incorporate_sibling` rows. Unconstrained on other + /// rows. pub sibling_is_on_right: T, /// Pointer to the Merkle root. pub commit_pointer: T, diff --git a/extensions/native/compiler/src/asm/instruction.rs b/extensions/native/compiler/src/asm/instruction.rs index bc5ce3d021..1aa5ea8527 100644 --- a/extensions/native/compiler/src/asm/instruction.rs +++ b/extensions/native/compiler/src/asm/instruction.rs @@ -14,7 +14,8 @@ pub enum AsmInstruction { /// Load extension word (dst, src, var_index, size, offset). /// - /// Load an extension from the address stored at src(fp) into dst(fp) with given index and offset. + /// Load an extension from the address stored at src(fp) into dst(fp) with given index and + /// offset. LoadEI(i32, i32, F, F, F), /// Store word (val, addr, var_index, size, offset) @@ -24,7 +25,8 @@ pub enum AsmInstruction { /// Store extension word (val, addr, var_index, size, offset) /// - /// Store an extension from val(fp) into the address stored at addr(fp) with given index and offset. + /// Store an extension from val(fp) into the address stored at addr(fp) with given index and + /// offset. StoreEI(i32, i32, F, F, F), /// Set dst = imm. @@ -147,7 +149,8 @@ pub enum AsmInstruction { /// HintBits(src, len). /// - /// Bit decompose the field element at pointer `src` to the first `len` little endian bits and add to hint stream. + /// Bit decompose the field element at pointer `src` to the first `len` little endian bits and + /// add to hint stream. HintBits(i32, u32), HintLoad(), diff --git a/extensions/native/compiler/src/constraints/halo2/baby_bear.rs b/extensions/native/compiler/src/constraints/halo2/baby_bear.rs index 3c8de4748c..55c1a25deb 100644 --- a/extensions/native/compiler/src/constraints/halo2/baby_bear.rs +++ b/extensions/native/compiler/src/constraints/halo2/baby_bear.rs @@ -87,7 +87,8 @@ impl BabyBearChip { r } - /// Reduce max_bits if possible. This function doesn't guarantee that the actual value is within BabyBear. + /// Reduce max_bits if possible. This function doesn't guarantee that the actual value is within + /// BabyBear. pub fn reduce_max_bits(&self, ctx: &mut Context, a: AssignedBabyBear) -> AssignedBabyBear { if a.max_bits > BABYBEAR_MAX_BITS { self.reduce(ctx, a) @@ -242,7 +243,8 @@ impl BabyBearChip { c } - // This inner product function will be used exclusively for optimizing extension element multiplication. + // This inner product function will be used exclusively for optimizing extension element + // multiplication. fn special_inner_product( &self, ctx: &mut Context, diff --git a/extensions/native/compiler/src/constraints/halo2/compiler.rs b/extensions/native/compiler/src/constraints/halo2/compiler.rs index 404dc4cecd..ce108addaa 100644 --- a/extensions/native/compiler/src/constraints/halo2/compiler.rs +++ b/extensions/native/compiler/src/constraints/halo2/compiler.rs @@ -434,8 +434,9 @@ impl Halo2ConstraintCompiler { ext_chip.assert_equal(ctx, exts[&a.0], exts[&b.0]); } DslIr::AssertEqEI(a, b) => { - // Note: we could check if each coordinate of `b` is zero separately for a little more efficiency, - // but omitting to simplify the code + // Note: we could check if each coordinate of `b` is zero separately for a + // little more efficiency, but omitting to simplify + // the code if b.is_zero() { ext_chip.assert_zero(ctx, exts[&a.0]); } else { @@ -541,8 +542,8 @@ pub fn convert_efr>(a: &EF) -> Vec { fn stats_snapshot(ctx: &Context, range_chip: Arc>) -> Halo2Stats { Halo2Stats { total_gate_cell: ctx.advice.len(), - // Note[Xinding]: this is inaccurate because of duplicated constants. But it's too slow if we always - // check for duplicates. + // Note[Xinding]: this is inaccurate because of duplicated constants. But it's too slow if + // we always check for duplicates. total_fixed: ctx.copy_manager.lock().unwrap().constant_equalities.len(), total_lookup_cell: range_chip.lookup_manager()[0].total_rows(), } diff --git a/extensions/native/compiler/src/constraints/halo2/poseidon2_perm.rs b/extensions/native/compiler/src/constraints/halo2/poseidon2_perm.rs index 6c7294f41c..f39c9b98a7 100644 --- a/extensions/native/compiler/src/constraints/halo2/poseidon2_perm.rs +++ b/extensions/native/compiler/src/constraints/halo2/poseidon2_perm.rs @@ -114,7 +114,8 @@ impl Poseidon2State { // Matrix is circ(2, 1, 1) let sum = gate.sum(ctx, self.s.iter().copied()); for (i, x) in self.s.iter_mut().enumerate() { - // This is the same as `*x = gate.add(ctx, *x, sum)` but we save a cell by reusing `sum`: + // This is the same as `*x = gate.add(ctx, *x, sum)` but we save a cell by reusing + // `sum`: if i % 2 == 0 { ctx.assign_region( [ @@ -160,7 +161,8 @@ impl Poseidon2State { assert_eq!(T, 3); let sum = gate.sum(ctx, self.s.iter().copied()); for i in 0..T { - // This is the same as `self.s[i] = gate.mul_add(ctx, self.s[i], Constant(mat_internal_diag_m_1[i]), sum)` but we save a cell by reusing `sum`. + // This is the same as `self.s[i] = gate.mul_add(ctx, self.s[i], + // Constant(mat_internal_diag_m_1[i]), sum)` but we save a cell by reusing `sum`. if i % 2 == 0 { ctx.assign_region( [ diff --git a/extensions/native/compiler/src/conversion/mod.rs b/extensions/native/compiler/src/conversion/mod.rs index 0a202b69fa..edf10467cf 100644 --- a/extensions/native/compiler/src/conversion/mod.rs +++ b/extensions/native/compiler/src/conversion/mod.rs @@ -103,7 +103,8 @@ fn i32_f(x: i32) -> F { } } -/// Warning: for extension field branch instructions, the `pc, labels` **must** be using `DEFAULT_PC_STEP`. +/// Warning: for extension field branch instructions, the `pc, labels` **must** be using +/// `DEFAULT_PC_STEP`. fn convert_instruction>( instruction: AsmInstruction, debug_info: Option, diff --git a/extensions/native/compiler/src/ir/bits.rs b/extensions/native/compiler/src/ir/bits.rs index 7cb5167be5..2fd7d5a97b 100644 --- a/extensions/native/compiler/src/ir/bits.rs +++ b/extensions/native/compiler/src/ir/bits.rs @@ -6,8 +6,8 @@ use openvm_stark_sdk::p3_baby_bear::BabyBear; use super::{Array, Builder, Config, DslIr, Felt, MemIndex, Var}; impl Builder { - /// Converts a felt to bits. Will result in a failed assertion if `num` has more than `num_bits` bits. - /// Only works for C::F = BabyBear + /// Converts a felt to bits. Will result in a failed assertion if `num` has more than `num_bits` + /// bits. Only works for C::F = BabyBear pub fn num2bits_f(&mut self, num: Felt, num_bits: u32) -> Array> { assert_eq!(TypeId::of::(), TypeId::of::()); @@ -46,12 +46,12 @@ impl Builder { // * 2^30 + ... + 2^x + y for y in [0, 2^(x - 1)) and 27 < x <= 30 // * 2^30 + ... + 2^27 // * y for y in [0, 2^27) - // To check that bits `b[0], ..., b[30]` represent `num = b[0] + ... + b[30] * 2^30` without overflow, - // we may check that: - // * if `num_bits < 27`, then `b[30] = 0`, so overflow is impossible. - // In this case, `suffix_bit_sum = 0`, so the check below passes. - // * if `num_bits >= 27`, then we must check: - // if `suffix_bit_sum = b[27] + ... + b[30] = 4`, then `prefix_sum = b[0] + ... + b[26] * 2^26 = 0` + // To check that bits `b[0], ..., b[30]` represent `num = b[0] + ... + b[30] * 2^30` without + // overflow, we may check that: + // * if `num_bits < 27`, then `b[30] = 0`, so overflow is impossible. In this case, + // `suffix_bit_sum = 0`, so the check below passes. + // * if `num_bits >= 27`, then we must check: if `suffix_bit_sum = b[27] + ... + b[30] = + // 4`, then `prefix_sum = b[0] + ... + b[26] * 2^26 = 0` let suffix_bit_sum_var = self.cast_felt_to_var(suffix_bit_sum); self.if_eq(suffix_bit_sum_var, C::N::from_canonical_u32(4)) .then(|builder| { diff --git a/extensions/native/compiler/src/ir/builder.rs b/extensions/native/compiler/src/ir/builder.rs index 82b43ab53d..966c0db21c 100644 --- a/extensions/native/compiler/src/ir/builder.rs +++ b/extensions/native/compiler/src/ir/builder.rs @@ -645,7 +645,8 @@ impl Builder { self.assign(&nb_public_values, nb_public_values + C::N::ONE); } - /// Commits a Var as public value. This value will be constrained when verified. This method should only be used in static mode. + /// Commits a Var as public value. This value will be constrained when verified. This method + /// should only be used in static mode. pub fn static_commit_public_value(&mut self, index: usize, val: Var) { assert!( self.flags.static_only, diff --git a/extensions/native/compiler/src/ir/instructions.rs b/extensions/native/compiler/src/ir/instructions.rs index 24ea9d0830..9159c5775b 100644 --- a/extensions/native/compiler/src/ir/instructions.rs +++ b/extensions/native/compiler/src/ir/instructions.rs @@ -51,9 +51,11 @@ pub enum DslIr { SubFIN(Felt, C::F, Felt), /// Subtracts two extension field elements (ext = ext - ext). SubE(Ext, Ext, Ext), - /// Subtracts an extension field element and an extension field immediate (ext = ext - ext field imm). + /// Subtracts an extension field element and an extension field immediate (ext = ext - ext + /// field imm). SubEI(Ext, Ext, C::EF), - /// Subtracts an extension field immediate and an extension field element (ext = ext field imm - ext). + /// Subtracts an extension field immediate and an extension field element (ext = ext field imm + /// - ext). SubEIN(Ext, C::EF, Ext), /// Subtracts an extension field element and a field immediate (ext = ext - field imm). SubEFI(Ext, Ext, C::F), @@ -71,7 +73,8 @@ pub enum DslIr { MulFI(Felt, Felt, C::F), /// Multiplies two extension field elements (ext = ext * ext). MulE(Ext, Ext, Ext), - /// Multiplies an extension field element and an extension field immediate (ext = ext * ext field imm). + /// Multiplies an extension field element and an extension field immediate (ext = ext * ext + /// field imm). MulEI(Ext, Ext, C::EF), /// Multiplies an extension field element and a field immediate (ext = ext * field imm). MulEFI(Ext, Ext, C::F), @@ -87,9 +90,11 @@ pub enum DslIr { DivFIN(Felt, C::F, Felt), /// Divides two extension field elements (ext = ext / ext). DivE(Ext, Ext, Ext), - /// Divides an extension field element and an extension field immediate (ext = ext / ext field imm). + /// Divides an extension field element and an extension field immediate (ext = ext / ext field + /// imm). DivEI(Ext, Ext, C::EF), - /// Divides and extension field immediate and an extension field element (ext = ext field imm / ext). + /// Divides and extension field immediate and an extension field element (ext = ext field imm / + /// ext). DivEIN(Ext, C::EF, Ext), /// Divides an extension field element and a field immediate (ext = ext / field imm). DivEFI(Ext, Ext, C::F), @@ -122,23 +127,27 @@ pub enum DslIr { TracedVec>, ), - /// Executes an equal conditional branch with the parameters (lhs var, rhs var, then body, else body). + /// Executes an equal conditional branch with the parameters (lhs var, rhs var, then body, else + /// body). IfEq( Var, Var, TracedVec>, TracedVec>, ), - /// Executes a not equal conditional branch with the parameters (lhs var, rhs var, then body, else body). + /// Executes a not equal conditional branch with the parameters (lhs var, rhs var, then body, + /// else body). IfNe( Var, Var, TracedVec>, TracedVec>, ), - /// Executes an equal conditional branch with the parameters (lhs var, rhs imm, then body, else body). + /// Executes an equal conditional branch with the parameters (lhs var, rhs imm, then body, else + /// body). IfEqI(Var, C::N, TracedVec>, TracedVec>), - /// Executes a not equal conditional branch with the parameters (lhs var, rhs imm, then body, else body). + /// Executes a not equal conditional branch with the parameters (lhs var, rhs imm, then body, + /// else body). IfNeI(Var, C::N, TracedVec>, TracedVec>), // Assertions. @@ -152,7 +161,8 @@ pub enum DslIr { AssertEqVI(Var, C::N), /// Assert that a field element is equal to a field immediate (felt == field imm). AssertEqFI(Felt, C::F), - /// Assert that an extension field element is equal to an extension field immediate (ext == ext field imm). + /// Assert that an extension field element is equal to an extension field immediate (ext == ext + /// field imm). AssertEqEI(Ext, C::EF), /// Assert that a usize is not zero (usize != 0). @@ -179,7 +189,8 @@ pub enum DslIr { StoreHeapPtr(Ptr), // Bits. - /// Decompose a field element into bits (bits = num2bits(felt)). Should only be used when target is a circuit. + /// Decompose a field element into bits (bits = num2bits(felt)). Should only be used when + /// target is a circuit. CircuitNum2BitsF(Felt, Vec>), /// Decompose a Var into 16-bit limbs. CircuitVarTo64BitsF(Var, [Felt; 4]), @@ -187,14 +198,15 @@ pub enum DslIr { // Hashing. /// Permutes an array of baby bear elements using Poseidon2 (output = p2_permute(array)). Poseidon2PermuteBabyBear(Array>, Array>), - /// Compresses two baby bear element arrays using Poseidon2 (output = p2_compress(array1, array2)). + /// Compresses two baby bear element arrays using Poseidon2 (output = p2_compress(array1, + /// array2)). Poseidon2CompressBabyBear( Array>, Array>, Array>, ), - /// Permutes an array of Bn254 elements using Poseidon2 (output = p2_permute(array)). Should only - /// be used when target is a circuit. + /// Permutes an array of Bn254 elements using Poseidon2 (output = p2_permute(array)). Should + /// only be used when target is a circuit. CircuitPoseidon2Permute([Var; 3]), // Miscellaneous instructions. @@ -230,18 +242,19 @@ pub enum DslIr { Halt, // Public inputs for circuits. - /// Publish a field element as the ith public value. Should only be used when target is a circuit. + /// Publish a field element as the ith public value. Should only be used when target is a + /// circuit. CircuitPublish(Var, usize), // FRI specific instructions. /// Select's a variable based on a condition. (select(cond, true_val, false_val) => output). /// Should only be used when target is a circuit. CircuitSelectV(Var, Var, Var, Var), - /// Select's a field element based on a condition. (select(cond, true_val, false_val) => output). - /// Should only be used when target is a circuit. + /// Select's a field element based on a condition. (select(cond, true_val, false_val) => + /// output). Should only be used when target is a circuit. CircuitSelectF(Var, Felt, Felt, Felt), - /// Select's an extension field element based on a condition. (select(cond, true_val, false_val) => output). - /// Should only be used when target is a circuit. + /// Select's an extension field element based on a condition. (select(cond, true_val, + /// false_val) => output). Should only be used when target is a circuit. CircuitSelectE( Var, Ext, @@ -290,8 +303,9 @@ pub enum DslIr { /// Assert that v < 2^bit. RangeCheckV(Var, usize), - /// Start the cycle tracker used by a block of code annotated by the string input. Calling this with the same - /// string will end the open cycle tracker instance and start a new one with an increasing numeric postfix. + /// Start the cycle tracker used by a block of code annotated by the string input. Calling this + /// with the same string will end the open cycle tracker instance and start a new one with + /// an increasing numeric postfix. CycleTrackerStart(String), /// End the cycle tracker used by a block of code annotated by the string input. CycleTrackerEnd(String), diff --git a/extensions/native/compiler/src/ir/symbolic.rs b/extensions/native/compiler/src/ir/symbolic.rs index 838577fa18..d5dfa9abdd 100644 --- a/extensions/native/compiler/src/ir/symbolic.rs +++ b/extensions/native/compiler/src/ir/symbolic.rs @@ -792,7 +792,8 @@ impl> Neg for SymbolicExt { } } -// Implement all operations between N, F, EF, and SymbolicVar, SymbolicFelt, SymbolicExt +// Implement all operations between N, F, EF, and SymbolicVar, SymbolicFelt, SymbolicExt impl Add for SymbolicFelt { type Output = Self; diff --git a/extensions/native/recursion/src/fri/domain.rs b/extensions/native/recursion/src/fri/domain.rs index 5c7cd3fa02..cdc8fc242c 100644 --- a/extensions/native/recursion/src/fri/domain.rs +++ b/extensions/native/recursion/src/fri/domain.rs @@ -108,8 +108,8 @@ where shift: builder.eval(self.shift * domain_power), g, }; - // ATTENTION: here must use `builder.set_value`. `builder.set` will convert `Usize::Const` - // to `Usize::Var` because it calls `builder.eval`. + // ATTENTION: here must use `builder.set_value`. `builder.set` will convert + // `Usize::Const` to `Usize::Var` because it calls `builder.eval`. builder.set_value(&domains, i_vec[0], domain); builder.assign(&domain_power, domain_power * g_dom); }); diff --git a/extensions/native/recursion/src/fri/mod.rs b/extensions/native/recursion/src/fri/mod.rs index e60e64b589..c8b3454a19 100644 --- a/extensions/native/recursion/src/fri/mod.rs +++ b/extensions/native/recursion/src/fri/mod.rs @@ -70,7 +70,8 @@ where let step = builder.get(&proof.commit_phase_openings, i); let beta = builder.get(betas, i); - // reduced_openings.len() == MAX_TWO_ADICITY >= log_max_lde_height >= log_folded_height_plus_one + // reduced_openings.len() == MAX_TWO_ADICITY >= log_max_lde_height >= + // log_folded_height_plus_one let reduced_opening = builder.get(reduced_openings, log_folded_height_plus_one); builder.assign(&folded_eval, folded_eval + reduced_opening); @@ -285,7 +286,8 @@ where let nested_opened_values_buffer = if builder.flags.static_only { builder.array(REDUCER_BUFFER_SIZE) } else { - // This points to the same memory. Only the length of this object will change when truncating. + // This points to the same memory. Only the length of this object will change when + // truncating. let ret = builder.uninit(); builder.assign(&ret, nested_opened_values_buffer.clone()); ret diff --git a/extensions/native/recursion/src/fri/two_adic_pcs.rs b/extensions/native/recursion/src/fri/two_adic_pcs.rs index ed61bb4c9d..a6527482f1 100644 --- a/extensions/native/recursion/src/fri/two_adic_pcs.rs +++ b/extensions/native/recursion/src/fri/two_adic_pcs.rs @@ -23,15 +23,16 @@ pub const MAX_TWO_ADICITY: usize = 27; /// Notes: /// 1. FieldMerkleTreeMMCS sorts traces by height in descending order when committing data. -/// 2. **Required** that `C::F` has two-adicity <= [MAX_TWO_ADICITY]. In particular this implies that all LDE matrices have -/// `log2(lde_height) <= MAX_TWO_ADICITY`. +/// 2. **Required** that `C::F` has two-adicity <= [MAX_TWO_ADICITY]. In particular this implies +/// that all LDE matrices have `log2(lde_height) <= MAX_TWO_ADICITY`. /// 3. **Required** that the maximum trace height is `2^log_max_height - 1`. /// /// Reference: /// /// So traces are sorted in `opening_proof`. /// -/// 2. FieldMerkleTreeMMCS::poseidon2 keeps the raw values in the original order. So traces are not sorted in `opened_values`. +/// 2. FieldMerkleTreeMMCS::poseidon2 keeps the raw values in the original order. So traces are not +/// sorted in `opened_values`. /// /// Reference: /// @@ -149,7 +150,8 @@ pub fn verify_two_adic_pcs( }; builder.cycle_tracker_end("pre-compute-rounds-context"); - // Accumulators of the reduced opening sums, reset per query. The array `ro` is indexed by log_height. + // Accumulators of the reduced opening sums, reset per query. The array `ro` is indexed by + // log_height. let ro: Array> = builder.array(MAX_TWO_ADICITY + 1); let alpha_pow: Array> = builder.array(MAX_TWO_ADICITY + 1); @@ -158,21 +160,23 @@ pub fn verify_two_adic_pcs( let index_bits = challenger.sample_bits(builder, log_max_lde_height); // We reset the reduced opening accumulators at the start of each query. - // We describe what `ro[log_height]` computes per query in pseduo-code, where `log_height` is log2 of the size of the LDE domain: - // ro[log_height] = 0 + // We describe what `ro[log_height]` computes per query in pseduo-code, where `log_height` + // is log2 of the size of the LDE domain: ro[log_height] = 0 // alpha_pow[log_height] = 1 // for round in rounds: - // for mat in round.mats where (mat.domain.log_n + log_blowup == log_height): // preserving order of round.mats - // // g is generator of F + // for mat in round.mats where (mat.domain.log_n + log_blowup == log_height): // + // preserving order of round.mats // g is generator of F // // w_{log_height} is generator of subgroup of F of order 2^log_height - // x = g * w_{log_height}^{reverse_bits(index >> (log_max_height - log_height), log_height)} - // // reverse_bits(x, bits) takes an unsigned integer x with `bits` bits and returns the unsigned integer with the bits of x reversed. - // // x is a rotated evaluation point in a coset of the LDE domain. - // ps_at_x = [claimed evaluation of p at x for each polynomial p corresponding to column of mat] + // x = g * w_{log_height}^{reverse_bits(index >> (log_max_height - log_height), + // log_height)} // reverse_bits(x, bits) takes an unsigned integer x with + // `bits` bits and returns the unsigned integer with the bits of x reversed. // + // x is a rotated evaluation point in a coset of the LDE domain. ps_at_x = + // [claimed evaluation of p at x for each polynomial p corresponding to column of mat] // // ps_at_x is array of Felt // for (z, ps_at_z) in zip(mat.points, mat.values): - // // z is an out of domain point in Ext. There may be multiple per round to account for rotations in AIR constraints. - // // ps_at_z is array of Ext for [claimed evaluation of p at z for each polyomial p corresponding to column of mat] + // // z is an out of domain point in Ext. There may be multiple per round to account + // for rotations in AIR constraints. // ps_at_z is array of Ext for [claimed + // evaluation of p at z for each polyomial p corresponding to column of mat] // for (p_at_x, p_at_z) in zip(ps_at_x, ps_at_z): // ro[log_height] += alpha_pow[log_height] * (p_at_x - p_at_z) / (x - z) // alpha_pow[log_height] *= alpha @@ -204,11 +208,13 @@ pub fn verify_two_adic_pcs( // b = index_bits // w = generator of order 2^log_max_height - // we first compute `w ** (b[0] * 2^(log_max_height - 1) + ... + b[log_max_height - 1])` using a square-and-multiply algorithm. + // we first compute `w ** (b[0] * 2^(log_max_height - 1) + ... + b[log_max_height - 1])` + // using a square-and-multiply algorithm. let res = builder.exp_bits_big_endian(w, &index_bits_truncated); // we now compute: - // tag_exp[log_max_height - i] = g * w ** (b[log_max_height - i] * 2^(log_max_height - 1) + ... + b[log_max_height - 1] * 2^(log_max_height - i)) + // tag_exp[log_max_height - i] = g * w ** (b[log_max_height - i] * 2^(log_max_height - + // 1) + ... + b[log_max_height - 1] * 2^(log_max_height - i)) // using a square-and-divide algorithm. // g * res is tag_exp[0] // `tag_exp` is used below as a rotated evaluation point in a coset of the LDE domain. @@ -306,7 +312,8 @@ pub fn verify_two_adic_pcs( builder.assign(&cur_ro, cur_ro + (mat_ro * cur_alpha_pow / (z - x))); builder.assign(&cur_alpha_pow, cur_alpha_pow * mat_alpha_pow); } - // The buffer `mat_opening` has now been written to, so we set `is_init` to 1. + // The buffer `mat_opening` has now been written to, so we set `is_init` to + // 1. builder.assign(&is_init, C::N::ONE); builder.cycle_tracker_end("single-reduced-opening-eval"); }); @@ -537,8 +544,9 @@ fn compute_rounds_context( iter_zip!(builder, round.mats, ov_ptrs, mat_alpha_pows).for_each(|ptr_vec, builder| { let mat = builder.iter_ptr_get(&round.mats, ptr_vec[0]); let local = builder.get(&mat.values, 0); - // We allocate the underlying buffer for the current `ov_ptr` here. On allocation, it is uninit, and - // will be written to on the first call of `fri_single_reduced_opening_eval` for this `ov_ptr`. + // We allocate the underlying buffer for the current `ov_ptr` here. On allocation, it is + // uninit, and will be written to on the first call of + // `fri_single_reduced_opening_eval` for this `ov_ptr`. let buf = builder.array(local.len()); let width = buf.len(); builder.iter_ptr_set(&ov_ptrs, ptr_vec[1], buf); diff --git a/extensions/native/recursion/src/halo2/mod.rs b/extensions/native/recursion/src/halo2/mod.rs index cca9000214..743f3680bb 100644 --- a/extensions/native/recursion/src/halo2/mod.rs +++ b/extensions/native/recursion/src/halo2/mod.rs @@ -57,7 +57,8 @@ pub struct DslOperations { } /// Necessary metadata to prove a Halo2 circuit -/// Attention: Deserializer of this struct is not generic. It only works for verifier/wrapper circuit. +/// Attention: Deserializer of this struct is not generic. It only works for verifier/wrapper +/// circuit. #[derive(Debug, Clone)] pub struct Halo2ProvingPinning { pub pk: ProvingKey, diff --git a/extensions/native/recursion/src/stark/mod.rs b/extensions/native/recursion/src/stark/mod.rs index 9ee94d55d8..f3f4a8106f 100644 --- a/extensions/native/recursion/src/stark/mod.rs +++ b/extensions/native/recursion/src/stark/mod.rs @@ -48,7 +48,8 @@ pub struct VerifierProgram { } impl VerifierProgram { - /// Create a new instance of the program for the [`openvm_stark_sdk::config::baby_bear_poseidon2`] + /// Create a new instance of the program for the + /// [`openvm_stark_sdk::config::baby_bear_poseidon2`] pub fn build( constants: MultiStarkVerificationAdvice, fri_params: &FriParameters, @@ -60,7 +61,8 @@ impl VerifierProgram { Self::build_with_options(constants, fri_params, options) } - /// Create a new instance of the program for the [`openvm_stark_sdk::config::baby_bear_poseidon2`] + /// Create a new instance of the program for the + /// [`openvm_stark_sdk::config::baby_bear_poseidon2`] pub fn build_with_options( constants: MultiStarkVerificationAdvice, fri_params: &FriParameters, @@ -166,7 +168,8 @@ where // (T01b): `num_challenges_to_sample.len() < 2`. let num_phases = RVar::from(num_challenges_to_sample.len()); - // Here the shape of `exposed_values_after_challenge` is not verified. But it's verified later (T01c). + // Here the shape of `exposed_values_after_challenge` is not verified. But it's verified + // later (T01c). assert_cumulative_sums(builder, air_proofs, &num_challenges_to_sample); let air_perm_by_height = if builder.flags.static_only { @@ -184,8 +187,8 @@ where builder.assert_less_than_slow_small_rhs(perm_i.clone(), num_airs); builder.set_value(&mask, perm_i.clone(), one.clone()); }); - // Check that each index of mask was set, i.e., that `air_perm_by_height` is a permutation. - // Also check that permutation is decreasing by height. + // Check that each index of mask was set, i.e., that `air_perm_by_height` is a + // permutation. Also check that permutation is decreasing by height. let prev_log_height_plus_one: Usize<_> = builder.eval(RVar::from(MAX_TWO_ADICITY - pcs.config.log_blowup + 1)); iter_zip!(builder, air_perm_by_height).for_each(|ptr_vec, builder| { @@ -207,7 +210,8 @@ where }; // (T02a): `air_perm_by_height` is a valid permutation of `0..num_airs`. // (T02b): For all `i`, `air_proofs[i].log_degree <= MAX_TWO_ADICITY - log_blowup`. - // (T02c): For all `0<=i= air_proofs[air_perm_by_height[i+1]].log_degree`. + // (T02c): For all `0<=i= + // air_proofs[air_perm_by_height[i+1]].log_degree`. let log_max_height = { let index = builder.get(air_perm_by_height, RVar::zero()); let air_proof = builder.get(air_proofs, index); @@ -449,7 +453,8 @@ where builder.assert_usize_eq(prep_width, prep.local.len()); builder.assert_usize_eq(prep_width, prep.next.len()); - // Assumption: each AIR with preprocessed trace has its own commitment and opening values + // Assumption: each AIR with preprocessed trace has its own commitment and + // opening values let values = builder.array::>(2); builder.set_value(&values, 0, prep.local); builder.set_value(&values, 1, prep.next); diff --git a/extensions/native/recursion/src/types.rs b/extensions/native/recursion/src/types.rs index 2a34b31d7a..36de6416e9 100644 --- a/extensions/native/recursion/src/types.rs +++ b/extensions/native/recursion/src/types.rs @@ -22,8 +22,9 @@ pub struct StarkVerificationAdvice { pub preprocessed_data: Option>, /// Trace sub-matrix widths pub width: TraceWidth, - /// The factor to multiply the trace degree by to get the degree of the quotient polynomial. Determined from the max constraint degree of the AIR constraints. - /// This is equivalently the number of chunks the quotient polynomial is split into. + /// The factor to multiply the trace degree by to get the degree of the quotient polynomial. + /// Determined from the max constraint degree of the AIR constraints. This is equivalently + /// the number of chunks the quotient polynomial is split into. pub quotient_degree: usize, /// Number of public values for this STARK only pub num_public_values: usize, diff --git a/extensions/native/recursion/src/utils.rs b/extensions/native/recursion/src/utils.rs index 0cc9c4697e..3c018cc0c2 100644 --- a/extensions/native/recursion/src/utils.rs +++ b/extensions/native/recursion/src/utils.rs @@ -57,8 +57,8 @@ pub fn split_32(builder: &mut Builder, val: Var, n: usize) - felts[0..n].to_vec() } -/// Eval two expressions, return in the reversed order if cond == 1. Otherwise, return in the original order. -/// This is a helper function for optimal performance. +/// Eval two expressions, return in the reversed order if cond == 1. Otherwise, return in the +/// original order. This is a helper function for optimal performance. pub fn cond_eval + CanSelect>( builder: &mut Builder, cond: Var, diff --git a/extensions/native/recursion/src/vars.rs b/extensions/native/recursion/src/vars.rs index 287d915f17..b295fd6714 100644 --- a/extensions/native/recursion/src/vars.rs +++ b/extensions/native/recursion/src/vars.rs @@ -74,8 +74,9 @@ pub struct StarkVerificationAdviceVariable { pub preprocessed_data: Array>, /// Trace sub-matrix widths pub width: TraceWidthVariable, - /// The factor to multiply the trace degree by to get the degree of the quotient polynomial. Determined from the max constraint degree of the AIR constraints. - /// This is equivalently the number of chunks the quotient polynomial is split into. + /// The factor to multiply the trace degree by to get the degree of the quotient polynomial. + /// Determined from the max constraint degree of the AIR constraints. This is equivalently + /// the number of chunks the quotient polynomial is split into. pub log_quotient_degree: Usize, /// Number of public values for this STARK only pub num_public_values: Usize, diff --git a/extensions/native/recursion/src/view.rs b/extensions/native/recursion/src/view.rs index 7b48187617..4df191268c 100644 --- a/extensions/native/recursion/src/view.rs +++ b/extensions/native/recursion/src/view.rs @@ -87,7 +87,8 @@ pub fn get_advice_per_air( } else { OptionalVar { is_some: Usize::from(1), - // Because `C::F::ORDER_U32` is prime and `max_coefficient > 1`, `floor(C::F::ORDER_U32 / max_coefficient) * max_coefficient < C::F::ORDER_U32`, + // Because `C::F::ORDER_U32` is prime and `max_coefficient > 1`, + // `floor(C::F::ORDER_U32 / max_coefficient) * max_coefficient < C::F::ORDER_U32`, // `height * max_coefficient` cannot overflow `C::F`. value: builder.constant(C::N::from_canonical_u32( C::F::ORDER_U32 / max_coefficient + 1, diff --git a/extensions/pairing/circuit/src/fp12_chip/tests.rs b/extensions/pairing/circuit/src/fp12_chip/tests.rs index 8d1dbc2293..a9f6b235d5 100644 --- a/extensions/pairing/circuit/src/fp12_chip/tests.rs +++ b/extensions/pairing/circuit/src/fp12_chip/tests.rs @@ -237,7 +237,8 @@ fn test_fp12_sub_bls12381() { ); } -// NOTE[yj]: This test requires RUST_MIN_STACK=8388608 to run without overflowing the stack, so it is ignored by the test runner for now +// NOTE[yj]: This test requires RUST_MIN_STACK=8388608 to run without overflowing the stack, so it +// is ignored by the test runner for now #[test] #[ignore] fn test_fp12_mul_bls12381() { diff --git a/extensions/pairing/circuit/src/pairing_chip/miller_double_and_add_step.rs b/extensions/pairing/circuit/src/pairing_chip/miller_double_and_add_step.rs index de98b4e18f..77084428c9 100644 --- a/extensions/pairing/circuit/src/pairing_chip/miller_double_and_add_step.rs +++ b/extensions/pairing/circuit/src/pairing_chip/miller_double_and_add_step.rs @@ -19,7 +19,8 @@ use openvm_rv32_adapters::Rv32VecHeapAdapterChip; use openvm_stark_backend::p3_field::PrimeField32; // Input: two AffinePoint: 4 field elements each -// Output: (AffinePoint, UnevaluatedLine, UnevaluatedLine) -> 2*2 + 2*2 + 2*2 = 12 field elements +// Output: (AffinePoint, UnevaluatedLine, UnevaluatedLine) -> 2*2 + 2*2 + 2*2 = 12 +// field elements #[derive(Chip, ChipUsageGetter, InstructionExecutor)] pub struct MillerDoubleAndAddStepChip< F: PrimeField32, diff --git a/extensions/pairing/guest/src/bls12_381/mod.rs b/extensions/pairing/guest/src/bls12_381/mod.rs index 707d3ba73a..a23d35d507 100644 --- a/extensions/pairing/guest/src/bls12_381/mod.rs +++ b/extensions/pairing/guest/src/bls12_381/mod.rs @@ -158,8 +158,8 @@ impl PairingIntrinsics for Bls12_381 { const FP2_TWO: Fp2 = Fp2::new(Fp::from_const_u8(2), Fp::from_const_u8(0)); const FP2_THREE: Fp2 = Fp2::new(Fp::from_const_u8(3), Fp::from_const_u8(0)); - // Multiplication constants for the Frobenius map for coefficients in Fp2 c1..=c5 for powers 0..12 - // FROBENIUS_COEFFS\[i\]\[j\] = \xi^{(j + 1) * (p^i - 1)/6} when p = 1 (mod 6) + // Multiplication constants for the Frobenius map for coefficients in Fp2 c1..=c5 for powers + // 0..12 FROBENIUS_COEFFS\[i\]\[j\] = \xi^{(j + 1) * (p^i - 1)/6} when p = 1 (mod 6) // These are validated against `halo2curves::bls12_381::FROBENIUS_COEFF_FQ12_C1` in tests.rs const FROBENIUS_COEFFS: [[Self::Fp2; 5]; 12] = [ [ diff --git a/extensions/pairing/guest/src/bls12_381/pairing.rs b/extensions/pairing/guest/src/bls12_381/pairing.rs index f9a022d0cf..9cd7ade4a5 100644 --- a/extensions/pairing/guest/src/bls12_381/pairing.rs +++ b/extensions/pairing/guest/src/bls12_381/pairing.rs @@ -74,8 +74,8 @@ impl LineMulMType for Bls12_381 { /// Multiplies a line in 02345-form with a Fp12 element to get an Fp12 element fn mul_by_023(f: &Fp12, l: &EvaluatedLine) -> Fp12 { - // this is only used if the number of lines is odd, which doesn't happen for our applications - // right now, so we can use this suboptimal implementation + // this is only used if the number of lines is odd, which doesn't happen for our + // applications right now, so we can use this suboptimal implementation Fp12::from_evaluated_line_m_type(l.clone()) * f } @@ -110,9 +110,9 @@ impl LineMulMType for Bls12_381 { let s4 = &self_coeffs[3]; let s5 = &self_coeffs[5]; - // NOTE[yj]: Hand-calculated multiplication for Fp12 * 02345 ∈ Fp2; this is likely not the most efficient implementation - // c00 = cs0co0 + xi(cs1co2 + cs2co1 + cs3co5 + cs4co4) - // c01 = cs0co1 + cs1co0 + xi(cs2co2 + cs4co5 + cs5co4) + // NOTE[yj]: Hand-calculated multiplication for Fp12 * 02345 ∈ Fp2; this is likely not the + // most efficient implementation c00 = cs0co0 + xi(cs1co2 + cs2co1 + cs3co5 + + // cs4co4) c01 = cs0co1 + cs1co0 + xi(cs2co2 + cs4co5 + cs5co4) // c02 = cs0co2 + cs1co1 + cs2co0 + cs3co4 + xi(cs5co5) // c10 = cs3co0 + xi(cs1co5 + cs2co4 + cs4co2 + cs5co1) // c11 = cs0co4 + cs3co1 + cs4co0 + xi(cs2co5 + cs5co2) @@ -154,7 +154,8 @@ impl MultiMillerLoop for Bls12_381 { f } - /// The expected output of this function when running the Miller loop with embedded exponent is c^3 * l_{3Q} + /// The expected output of this function when running the Miller loop with embedded exponent is + /// c^3 * l_{3Q} fn pre_loop( Q_acc: Vec>, Q: &[AffinePoint], @@ -162,8 +163,9 @@ impl MultiMillerLoop for Bls12_381 { xy_fracs: &[(Self::Fp, Self::Fp)], ) -> (Self::Fp12, Vec>) { let mut f = if let Some(mut c) = c { - // for the miller loop with embedded exponent, f will be set to c at the beginning of the function, and we - // will multiply by c again due to the last two values of the pseudo-binary encoding (BLS12_381_PSEUDO_BINARY_ENCODING) being 1. + // for the miller loop with embedded exponent, f will be set to c at the beginning of + // the function, and we will multiply by c again due to the last two values + // of the pseudo-binary encoding (BLS12_381_PSEUDO_BINARY_ENCODING) being 1. // Therefore, the final value of f at the end of this block is c^3. let mut c3 = c.clone(); c.square_assign(); @@ -176,8 +178,9 @@ impl MultiMillerLoop for Bls12_381 { let mut Q_acc = Q_acc; // Special case the first iteration of the Miller loop with pseudo_binary_encoding = 1: - // this means that the first step is a double and add, but we need to separate the two steps since the optimized - // `miller_double_and_add_step` will fail because Q_acc is equal to Q_signed on the first iteration + // this means that the first step is a double and add, but we need to separate the two steps + // since the optimized `miller_double_and_add_step` will fail because Q_acc is equal + // to Q_signed on the first iteration let (Q_out_double, lines_2S) = Q_acc .into_iter() .map(|Q| Self::miller_double_step(&Q)) @@ -210,7 +213,8 @@ impl MultiMillerLoop for Bls12_381 { (f, Q_acc) } - /// After running the main body of the Miller loop, we conjugate f due to the curve seed x being negative. + /// After running the main body of the Miller loop, we conjugate f due to the curve seed x being + /// negative. fn post_loop( f: &Self::Fp12, Q_acc: Vec>, @@ -272,7 +276,8 @@ impl PairingCheck for Bls12_381 { #[cfg(target_os = "zkvm")] { let hint = MaybeUninit::<(Fp12, Fp12)>::uninit(); - // We do not rely on the slice P's memory layout since rust does not guarantee it across compiler versions. + // We do not rely on the slice P's memory layout since rust does not guarantee it across + // compiler versions. let p_fat_ptr = (P.as_ptr() as u32, P.len() as u32); let q_fat_ptr = (Q.as_ptr() as u32, Q.len() as u32); unsafe { @@ -304,8 +309,8 @@ impl PairingCheck for Bls12_381 { #[allow(non_snake_case)] impl Bls12_381 { - // The paper only describes the implementation for Bn254, so we use the gnark implementation for Bls12_381. - // Adapted from the gnark implementation: + // The paper only describes the implementation for Bn254, so we use the gnark implementation for + // Bls12_381. Adapted from the gnark implementation: // https://github.com/Consensys/gnark/blob/af754dd1c47a92be375930ae1abfbd134c5310d8/std/algebra/emulated/fields_bls12381/e12_pairing.go#L394C1-L395C1 fn try_honest_pairing_check( P: &[AffinePoint<::Fp>], @@ -315,13 +320,14 @@ impl Bls12_381 { // The gnark implementation checks that f * s = c^{q - x} where x is the curve seed. // We check an equivalent condition: f * c^x * s = c^q. - // This is because we can compute f * c^x by embedding the c^x computation in the miller loop. + // This is because we can compute f * c^x by embedding the c^x computation in the miller + // loop. // We compute c^q before c is consumed by conjugate() below let c_q = FieldExtension::frobenius_map(&c, 1); - // Since the Bls12_381 curve has a negative seed, the miller loop for Bls12_381 is computed as - // f_{Miller,x,Q}(P) = conjugate( f_{Miller,-x,Q}(P) * c^{-x} ). + // Since the Bls12_381 curve has a negative seed, the miller loop for Bls12_381 is computed + // as f_{Miller,x,Q}(P) = conjugate( f_{Miller,-x,Q}(P) * c^{-x} ). // We will pass in the conjugate inverse of c into the miller loop so that we compute // fc = conjugate( f_{Miller,-x,Q}(P) * c'^{-x} ) (where c' is the conjugate inverse of c) // = f_{Miller,x,Q}(P) * c^x diff --git a/extensions/pairing/guest/src/bn254/mod.rs b/extensions/pairing/guest/src/bn254/mod.rs index 1c7bfaa2cd..7a620e74e9 100644 --- a/extensions/pairing/guest/src/bn254/mod.rs +++ b/extensions/pairing/guest/src/bn254/mod.rs @@ -227,8 +227,8 @@ impl PairingIntrinsics for Bn254 { const XI: Fp2 = Fp2::new(Fp::from_const_u8(9), Fp::from_const_u8(1)); const FP2_TWO: Fp2 = Fp2::new(Fp::from_const_u8(2), Fp::from_const_u8(0)); const FP2_THREE: Fp2 = Fp2::new(Fp::from_const_u8(3), Fp::from_const_u8(0)); - // Multiplication constants for the Frobenius map for coefficients in Fp2 c1..=c5 for powers 0..12 - // FROBENIUS_COEFFS\[i\]\[j\] = \xi^{(j + 1) * (p^i - 1)/6} when p = 1 (mod 6) + // Multiplication constants for the Frobenius map for coefficients in Fp2 c1..=c5 for powers + // 0..12 FROBENIUS_COEFFS\[i\]\[j\] = \xi^{(j + 1) * (p^i - 1)/6} when p = 1 (mod 6) // These are validated against `halo2curves::bn256::FROBENIUS_COEFF_FQ12_C1` in tests.rs // (Note that bn256 here is another name for bn254) const FROBENIUS_COEFFS: [[Self::Fp2; 5]; 12] = [ diff --git a/extensions/pairing/guest/src/bn254/pairing.rs b/extensions/pairing/guest/src/bn254/pairing.rs index 34abd8da7b..25a0d6b7fe 100644 --- a/extensions/pairing/guest/src/bn254/pairing.rs +++ b/extensions/pairing/guest/src/bn254/pairing.rs @@ -107,9 +107,9 @@ impl LineMulDType for Bn254 { let s4 = &self_coeffs[3]; let s5 = &self_coeffs[5]; - // NOTE[yj]: Hand-calculated multiplication for Fp12 * 01234 ∈ Fp2; this is likely not the most efficient implementation - // c00 = cs0co0 + xi(cs1co2 + cs2co1 + cs4co4 + cs5co3) - // c01 = cs0co1 + cs1co0 + cs3co3 + xi(cs2co2 + cs5co4) + // NOTE[yj]: Hand-calculated multiplication for Fp12 * 01234 ∈ Fp2; this is likely not the + // most efficient implementation c00 = cs0co0 + xi(cs1co2 + cs2co1 + cs4co4 + + // cs5co3) c01 = cs0co1 + cs1co0 + cs3co3 + xi(cs2co2 + cs5co4) // c02 = cs0co2 + cs1co1 + cs2co0 + cs3co4 + cs4co3 // c10 = cs0co3 + cs3co0 + xi(cs2co4 + cs4co2 + cs5co1) // c11 = cs0co4 + cs1co3 + cs3co1 + cs4co0 + xi(cs5co2) @@ -150,7 +150,8 @@ impl MultiMillerLoop for Bn254 { f } - /// The expected output of this function when running the Miller loop with embedded exponent is c^2 * l_{2Q} + /// The expected output of this function when running the Miller loop with embedded exponent is + /// c^2 * l_{2Q} fn pre_loop( Q_acc: Vec>, _Q: &[AffinePoint], @@ -158,8 +159,9 @@ impl MultiMillerLoop for Bn254 { xy_fracs: &[(Self::Fp, Self::Fp)], ) -> (Self::Fp12, Vec>) { let mut f = if let Some(mut c) = c { - // for the miller loop with embedded exponent, f will be set to c at the beginning of the function, and we - // will square c due to the last two values of the pseudo-binary encoding (BN254_PSEUDO_BINARY_ENCODING) being 0 and 1. + // for the miller loop with embedded exponent, f will be set to c at the beginning of + // the function, and we will square c due to the last two values of the + // pseudo-binary encoding (BN254_PSEUDO_BINARY_ENCODING) being 0 and 1. // Therefore, the final value of f at the end of this block is c^2. c.square_assign(); c @@ -170,8 +172,9 @@ impl MultiMillerLoop for Bn254 { let mut Q_acc = Q_acc; let mut initial_lines = Vec::>::new(); - // We don't need to special case the first iteration for Bn254, but since we are using the same Miller loop implementation - // for both Bn254 and Bls12_381, we need to do the first iteration separately here. + // We don't need to special case the first iteration for Bn254, but since we are using the + // same Miller loop implementation for both Bn254 and Bls12_381, we need to do the + // first iteration separately here. let (Q_out_double, lines_2S) = Q_acc .into_iter() .map(|Q| Self::miller_double_step(&Q)) @@ -233,13 +236,15 @@ impl MultiMillerLoop for Bn254 { let q2_vec = Q .iter() .map(|Q| { - // There is a frobenius mapping π²(Q) that we skip here since it is equivalent to the identity mapping + // There is a frobenius mapping π²(Q) that we skip here since it is equivalent to + // the identity mapping let x = &Q.x * x_to_q_sq_minus_1_over_3; AffinePoint { x, y: Q.y.clone() } }) .collect::>(); - // compute l_{(6x+2)\Psi(Q) + \phi_p(\Psi(Q)), -(\phi_p)^2(\Psi(Q))} where \phi_p is the Frobenius map + // compute l_{(6x+2)\Psi(Q) + \phi_p(\Psi(Q)), -(\phi_p)^2(\Psi(Q))} where \phi_p is the + // Frobenius map let (Q_out_add, lines_S_plus_Q) = Q_acc .iter() .zip(q2_vec.iter()) @@ -306,7 +311,8 @@ impl PairingCheck for Bn254 { #[cfg(target_os = "zkvm")] { let hint = MaybeUninit::<(Fp12, Fp12)>::uninit(); - // We do not rely on the slice P's memory layout since rust does not guarantee it across compiler versions. + // We do not rely on the slice P's memory layout since rust does not guarantee it across + // compiler versions. let p_fat_ptr = (P.as_ptr() as u32, P.len() as u32); let q_fat_ptr = (Q.as_ptr() as u32, Q.len() as u32); unsafe { @@ -352,7 +358,8 @@ impl Bn254 { // By the theorem, it suffices to provide c and u such that f * u == c^λ. // Since λ = 6x + 2 + q^3 - q^2 + q, we will check the equivalent condition: // f * c^-{6x + 2} * u * c^-{q^3 - q^2 + q} == 1 - // This is because we can compute f * c^-{6x+2} by embedding the c^-{6x+2} computation in the miller loop. + // This is because we can compute f * c^-{6x+2} by embedding the c^-{6x+2} computation in + // the miller loop. // c_mul = c^-{q^3 - q^2 + q} let c_q3_inv = FieldExtension::frobenius_map(&c_inv, 3); diff --git a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/final_exp.rs b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/final_exp.rs index d89cc1f58c..b6bdf1221c 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/final_exp.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/final_exp.rs @@ -8,7 +8,8 @@ use openvm_ecc_guest::{ use super::{Bls12_381, FINAL_EXP_FACTOR, LAMBDA, POLY_FACTOR}; use crate::pairing::{FinalExp, MultiMillerLoop}; -// The paper only describes the implementation for Bn254, so we use the gnark implementation for Bls12_381. +// The paper only describes the implementation for Bn254, so we use the gnark implementation for +// Bls12_381. #[allow(non_snake_case)] impl FinalExp for Bls12_381 { type Fp = Fq; @@ -26,10 +27,11 @@ impl FinalExp for Bls12_381 { // The gnark implementation checks that f * s = c^{q - x} where x is the curve seed. // We check an equivalent condition: f * c^x * c^-q * s = 1. - // This is because we can compute f * c^x by embedding the c^x computation in the miller loop. + // This is because we can compute f * c^x by embedding the c^x computation in the miller + // loop. - // Since the Bls12_381 curve has a negative seed, the miller loop for Bls12_381 is computed as - // f_{Miller,x,Q}(P) = conjugate( f_{Miller,-x,Q}(P) * c^{-x} ). + // Since the Bls12_381 curve has a negative seed, the miller loop for Bls12_381 is computed + // as f_{Miller,x,Q}(P) = conjugate( f_{Miller,-x,Q}(P) * c^{-x} ). // We will pass in the conjugate inverse of c into the miller loop so that we compute // fc = f_{Miller,x,Q}(P) // = conjugate( f_{Miller,-x,Q}(P) * c'^{-x} ) (where c' is the conjugate inverse of c) @@ -66,7 +68,8 @@ impl FinalExp for Bls12_381 { root = f.exp_bytes(true, &exp.to_bytes_be()); let three_be = three.to_bytes_be(); - // NOTE[yj]: we can probably remove this first check as an optimization since we initizlize order_3rd_power to 0 + // NOTE[yj]: we can probably remove this first check as an optimization since we initizlize + // order_3rd_power to 0 if root == Fq12::ONE { order_3rd_power = 0; } diff --git a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/miller_loop.rs b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/miller_loop.rs index fa8d0bf767..add12a4b23 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/miller_loop.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/miller_loop.rs @@ -148,7 +148,8 @@ impl MultiMillerLoop for Bls12_381 { f } - /// The expected output of this function when running the Miller loop with embedded exponent is c^3 * l_{3Q} + /// The expected output of this function when running the Miller loop with embedded exponent is + /// c^3 * l_{3Q} fn pre_loop( Q_acc: Vec>, Q: &[AffinePoint], @@ -156,9 +157,10 @@ impl MultiMillerLoop for Bls12_381 { xy_fracs: &[(Fq, Fq)], ) -> (Fq12, Vec>) { let mut f = if let Some(mut c) = c { - // for the miller loop with embedded exponent, f will be set to c at the beginning of the function, and we - // will multiply by c again due to the last two values of the pseudo-binary encoding (BN12_381_PBE) being 1. - // Therefore, the final value of f at the end of this block is c^3. + // for the miller loop with embedded exponent, f will be set to c at the beginning of + // the function, and we will multiply by c again due to the last two values + // of the pseudo-binary encoding (BN12_381_PBE) being 1. Therefore, the + // final value of f at the end of this block is c^3. let mut c3 = c; c.square_assign(); c3 *= &c; @@ -170,8 +172,9 @@ impl MultiMillerLoop for Bls12_381 { let mut Q_acc = Q_acc; // Special case the first iteration of the Miller loop with pseudo_binary_encoding = 1: - // this means that the first step is a double and add, but we need to separate the two steps since the optimized - // `miller_double_and_add_step` will fail because Q_acc is equal to Q_signed on the first iteration + // this means that the first step is a double and add, but we need to separate the two steps + // since the optimized `miller_double_and_add_step` will fail because Q_acc is equal + // to Q_signed on the first iteration let (Q_out_double, lines_2S) = Q_acc .into_iter() .map(|Q| Self::miller_double_step(&Q)) @@ -204,7 +207,8 @@ impl MultiMillerLoop for Bls12_381 { (f, Q_acc) } - /// After running the main body of the Miller loop, we conjugate f due to the curve seed x being negative. + /// After running the main body of the Miller loop, we conjugate f due to the curve seed x being + /// negative. fn post_loop( f: &Fq12, Q_acc: Vec>, @@ -214,10 +218,11 @@ impl MultiMillerLoop for Bls12_381 { ) -> (Fq12, Vec>) { // Conjugate for negative component of the seed // Explanation: - // The general Miller loop formula implies that f_{-x} = 1/f_x. To avoid an inversion, we use the fact that - // for the final exponentiation, we only need the Miller loop result up to multiplication by some proper subfield - // of Fp12. Using the fact that Fp12 is a quadratic extension of Fp6, we have that f_x * conjugate(f_x) * 1/f_x lies in Fp6. - // Therefore we conjugate f_x instead of taking the inverse. + // The general Miller loop formula implies that f_{-x} = 1/f_x. To avoid an inversion, we + // use the fact that for the final exponentiation, we only need the Miller loop + // result up to multiplication by some proper subfield of Fp12. Using the fact that + // Fp12 is a quadratic extension of Fp6, we have that f_x * conjugate(f_x) * 1/f_x lies in + // Fp6. Therefore we conjugate f_x instead of taking the inverse. let f = f.conjugate(); (f, Q_acc) } diff --git a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_miller_loop.rs b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_miller_loop.rs index cd1f1db363..28e31e5878 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_miller_loop.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bls12_381/tests/test_miller_loop.rs @@ -81,7 +81,8 @@ fn test_f_mul() { Q_acc = Q_acc_init; - // Now Q_acc is in a state where we can do a left vs right side test of double-and-add vs double then add: + // Now Q_acc is in a state where we can do a left vs right side test of double-and-add vs double + // then add: // Left side test: Double and add let (Q_acc_daa, l_S_plus_Q, l_S_plus_Q_plus_S) = diff --git a/extensions/pairing/guest/src/halo2curves_shims/bn254/final_exp.rs b/extensions/pairing/guest/src/halo2curves_shims/bn254/final_exp.rs index ae7d581063..f4808e08b6 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bn254/final_exp.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bn254/final_exp.rs @@ -25,7 +25,8 @@ impl FinalExp for Bn254 { // By the theorem, it suffices to provide c and u such that f * u == c^λ. // Since λ = 6x + 2 + q^3 - q^2 + q, we will check the equivalent condition: // f * c^-{6x + 2} * u * c^-{q^3 - q^2 + q} == 1 - // This is because we can compute f * c^-{6x+2} by embedding the c^-{6x+2} computation in the miller loop. + // This is because we can compute f * c^-{6x+2} by embedding the c^-{6x+2} computation in + // the miller loop. // c_mul = c^-{q^3 - q^2 + q} let c_q3_inv = FieldExtension::frobenius_map(&c_inv, 3); diff --git a/extensions/pairing/guest/src/halo2curves_shims/bn254/miller_loop.rs b/extensions/pairing/guest/src/halo2curves_shims/bn254/miller_loop.rs index 7e9386731f..9d4ff02557 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bn254/miller_loop.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bn254/miller_loop.rs @@ -220,7 +220,8 @@ impl MultiMillerLoop for Bn254 { let q2_vec = Q .iter() .map(|Q| { - // There is a frobenius mapping π²(Q) that we skip here since it is equivalent to the identity mapping + // There is a frobenius mapping π²(Q) that we skip here since it is equivalent to + // the identity mapping let x = Q.x * x_to_q_sq_minus_1_over_3; AffinePoint { x, y: Q.y } }) diff --git a/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/test_final_exp.rs b/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/test_final_exp.rs index f56ebc11fb..e00535b5bf 100644 --- a/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/test_final_exp.rs +++ b/extensions/pairing/guest/src/halo2curves_shims/bn254/tests/test_final_exp.rs @@ -54,10 +54,10 @@ fn assert_final_exp_one(a: &[i32; N], b: &[i32; N]) { Bn254::assert_final_exp_is_one(&f, &P_ecpoints, &Q_ecpoints); } -/// Generates test points for N number of points for an elliptic curve pairing, where the inputs `a` and `b` are -/// scalars of generators in G1 and G2, respectively. Importantly, for every even index, the generator P point is -/// negated (reflected an the x-axis). Outputs the vectors of P and Q points as well as the corresponding P and Q -/// EcPoint structs. +/// Generates test points for N number of points for an elliptic curve pairing, where the inputs `a` +/// and `b` are scalars of generators in G1 and G2, respectively. Importantly, for every even index, +/// the generator P point is negated (reflected an the x-axis). Outputs the vectors of P and Q +/// points as well as the corresponding P and Q EcPoint structs. #[allow(non_snake_case)] #[allow(clippy::type_complexity)] pub fn generate_test_points_generator_scalar( diff --git a/extensions/pairing/guest/src/pairing/miller_loop.rs b/extensions/pairing/guest/src/pairing/miller_loop.rs index 5a93ab25a9..c1ddf747e2 100644 --- a/extensions/pairing/guest/src/pairing/miller_loop.rs +++ b/extensions/pairing/guest/src/pairing/miller_loop.rs @@ -14,8 +14,8 @@ use super::{Evaluatable, EvaluatedLine, MillerStep, UnevaluatedLine}; pub trait MultiMillerLoop: MillerStep where ::Fp2: Field + FieldExtension, - // these trait bounds are needed for `multi_miller_loop_embedded_exp`. It would be better to move into - // a macro so the trait stays clean + // these trait bounds are needed for `multi_miller_loop_embedded_exp`. It would be better to + // move into a macro so the trait stays clean UnevaluatedLine: Evaluatable, for<'a> &'a Self::Fp: DivUnsafe<&'a Self::Fp, Output = Self::Fp>, for<'a> &'a Self::Fp2: Neg, @@ -56,8 +56,8 @@ where Self::multi_miller_loop_embedded_exp(P, Q, None) } - /// Runs the multi-Miller loop with an embedded exponent, removing the need to calculate the residue witness - /// in the final exponentiation step + /// Runs the multi-Miller loop with an embedded exponent, removing the need to calculate the + /// residue witness in the final exponentiation step /// /// `c` is assumed nonzero. fn multi_miller_loop_embedded_exp( diff --git a/extensions/pairing/guest/src/pairing/miller_step.rs b/extensions/pairing/guest/src/pairing/miller_step.rs index 53105bb01f..52f48630f7 100644 --- a/extensions/pairing/guest/src/pairing/miller_step.rs +++ b/extensions/pairing/guest/src/pairing/miller_step.rs @@ -47,8 +47,9 @@ where /// Assumptions: /// - s is not point at infinity. /// - a in the curve equation is 0. - /// The case y = 0 does not happen as long as the curve satisfies that 0 = X^3 + b has no solutions in Fp2. - /// The curve G1Affine and twist G2Affine are both chosen for bn254, bls12_381 so that this never happens. + /// The case y = 0 does not happen as long as the curve satisfies that 0 = X^3 + b has no + /// solutions in Fp2. The curve G1Affine and twist G2Affine are both chosen for bn254, + /// bls12_381 so that this never happens. fn miller_double_step( s: &AffinePoint, ) -> (AffinePoint, UnevaluatedLine) { @@ -102,8 +103,8 @@ where } /// Miller double and add step (2S + Q implemented as S + Q + S for efficiency). - /// Returns 2S+Q, a line in Fp12 passing through S and Q, and a line in Fp12 passing through S+Q and S - /// Assumption: Q != +- S && (S+Q) != +-S, so that there is no division by zero. + /// Returns 2S+Q, a line in Fp12 passing through S and Q, and a line in Fp12 passing through S+Q + /// and S Assumption: Q != +- S && (S+Q) != +-S, so that there is no division by zero. /// The way this is used in miller loop, this is always satisfied. fn miller_double_and_add_step( s: &AffinePoint, diff --git a/extensions/pairing/guest/src/pairing/mod.rs b/extensions/pairing/guest/src/pairing/mod.rs index 52e27dd825..3a751025e4 100644 --- a/extensions/pairing/guest/src/pairing/mod.rs +++ b/extensions/pairing/guest/src/pairing/mod.rs @@ -29,8 +29,8 @@ pub trait PairingIntrinsics { const PAIRING_IDX: usize; /// The sextic extension `Fp12` is `Fp2[X] / (X^6 - \xi)`, where `\xi` is a non-residue. const XI: Self::Fp2; - /// Multiplication constants for the Frobenius map for coefficients in Fp2 c1..=c5 for powers 0..12 - /// FROBENIUS_COEFFS\[i\]\[j\] = \xi^{(j + 1) * (p^i - 1)/6} when p = 1 (mod 6) + /// Multiplication constants for the Frobenius map for coefficients in Fp2 c1..=c5 for powers + /// 0..12 FROBENIUS_COEFFS\[i\]\[j\] = \xi^{(j + 1) * (p^i - 1)/6} when p = 1 (mod 6) const FROBENIUS_COEFFS: [[Self::Fp2; 5]; 12]; const FP2_TWO: Self::Fp2; diff --git a/extensions/pairing/guest/src/pairing/sextic_ext_field.rs b/extensions/pairing/guest/src/pairing/sextic_ext_field.rs index 8924fe1378..7f75815e05 100644 --- a/extensions/pairing/guest/src/pairing/sextic_ext_field.rs +++ b/extensions/pairing/guest/src/pairing/sextic_ext_field.rs @@ -67,8 +67,8 @@ pub(crate) fn sextic_tower_mul( where for<'a> &'a F: core::ops::Mul<&'a F, Output = F>, { - // The following multiplication is hand-derived with respect to the basis where degree 6 extension - // is composed of degree 3 extension followed by degree 2 extension. + // The following multiplication is hand-derived with respect to the basis where degree 6 + // extension is composed of degree 3 extension followed by degree 2 extension. // c0 = cs0co0 + xi(cs1co2 + cs2co1 + cs3co5 + cs4co4 + cs5co3) // c1 = cs0co1 + cs1co0 + cs3co3 + xi(cs2co2 + cs4co5 + cs5co4) diff --git a/extensions/pairing/tests/programs/examples/pairing_check_fallback.rs b/extensions/pairing/tests/programs/examples/pairing_check_fallback.rs index db9a8ce87b..7f47709097 100644 --- a/extensions/pairing/tests/programs/examples/pairing_check_fallback.rs +++ b/extensions/pairing/tests/programs/examples/pairing_check_fallback.rs @@ -76,10 +76,10 @@ mod bn254 { // f * c^x * c^-q * s = 1, // where fc = f * c'^x (embedded Miller loop with c conjugate inverse), // and the curve seed x = -0xd201000000010000 - // the miller loop computation includes a conjugation at the end because the value of the - // seed is negative, so we need to conjugate the miller loop input c as c'. We then substitute - // y = -x to get c^-y and finally compute c'^-y as input to the miller loop: - // f * c'^-y * c^-q * s = 1 + // the miller loop computation includes a conjugation at the end because the value of + // the seed is negative, so we need to conjugate the miller loop input c + // as c'. We then substitute y = -x to get c^-y and finally compute c'^-y + // as input to the miller loop: f * c'^-y * c^-q * s = 1 let c_q = FieldExtension::frobenius_map(&c, 1); let c_conj = c.conjugate(); if c_conj == Fp12::ZERO { @@ -191,10 +191,10 @@ mod bls12_381 { // f * c^x * c^-q * s = 1, // where fc = f * c'^x (embedded Miller loop with c conjugate inverse), // and the curve seed x = -0xd201000000010000 - // the miller loop computation includes a conjugation at the end because the value of the - // seed is negative, so we need to conjugate the miller loop input c as c'. We then substitute - // y = -x to get c^-y and finally compute c'^-y as input to the miller loop: - // f * c'^-y * c^-q * s = 1 + // the miller loop computation includes a conjugation at the end because the value of + // the seed is negative, so we need to conjugate the miller loop input c + // as c'. We then substitute y = -x to get c^-y and finally compute c'^-y + // as input to the miller loop: f * c'^-y * c^-q * s = 1 let c_q = FieldExtension::frobenius_map(&c, 1); let c_conj = c.conjugate(); if c_conj == Fp12::ZERO { diff --git a/extensions/pairing/tests/programs/examples/pairing_miller_step.rs b/extensions/pairing/tests/programs/examples/pairing_miller_step.rs index 7901e263e4..c32aefc7c1 100644 --- a/extensions/pairing/tests/programs/examples/pairing_miller_step.rs +++ b/extensions/pairing/tests/programs/examples/pairing_miller_step.rs @@ -37,8 +37,8 @@ mod bn254 { let mut pt_bytes = [0u8; 32 * 4]; let mut l_bytes = [0u8; 32 * 4]; - // TODO: if we ever need to change this, we should switch to using `StdIn::write` to serialize - // for us and use `read()` instead of `read_vec()` + // TODO: if we ever need to change this, we should switch to using `StdIn::write` to + // serialize for us and use `read()` instead of `read_vec()` pt_bytes[0..32].copy_from_slice(pt_cmp.x.c0.as_le_bytes()); pt_bytes[32..2 * 32].copy_from_slice(pt_cmp.x.c1.as_le_bytes()); pt_bytes[2 * 32..3 * 32].copy_from_slice(pt_cmp.y.c0.as_le_bytes()); @@ -67,8 +67,8 @@ mod bn254 { let mut l0_bytes = [0u8; 32 * 4]; let mut l1_bytes = [0u8; 32 * 4]; - // TODO: if we ever need to change this, we should switch to using `StdIn::write` to serialize - // for us and use `read()` instead of `read_vec()` + // TODO: if we ever need to change this, we should switch to using `StdIn::write` to + // serialize for us and use `read()` instead of `read_vec()` pt_bytes[0..32].copy_from_slice(pt_cmp.x.c0.as_le_bytes()); pt_bytes[32..2 * 32].copy_from_slice(pt_cmp.x.c1.as_le_bytes()); pt_bytes[2 * 32..3 * 32].copy_from_slice(pt_cmp.y.c0.as_le_bytes()); diff --git a/extensions/pairing/transpiler/src/lib.rs b/extensions/pairing/transpiler/src/lib.rs index 628a779fb0..7777c37c91 100644 --- a/extensions/pairing/transpiler/src/lib.rs +++ b/extensions/pairing/transpiler/src/lib.rs @@ -71,7 +71,9 @@ impl LocalOpcode for Bls12381Fp12Opcode { #[repr(u16)] pub enum PairingPhantom { /// Uses `b` to determine the curve: `b` is the discriminant of `PairingCurve` kind. - /// Peeks at `[r32{0}(a)..r32{0}(a) + Fp::NUM_LIMBS * 12]_2` to get `f: Fp12` and then resets the hint stream to equal `final_exp_hint(f) = (residue_witness, scaling_factor): (Fp12, Fp12)` as `Fp::NUM_LIMBS * 12 * 2` bytes. + /// Peeks at `[r32{0}(a)..r32{0}(a) + Fp::NUM_LIMBS * 12]_2` to get `f: Fp12` and then resets + /// the hint stream to equal `final_exp_hint(f) = (residue_witness, scaling_factor): (Fp12, + /// Fp12)` as `Fp::NUM_LIMBS * 12 * 2` bytes. HintFinalExp = 0x30, } diff --git a/extensions/rv32-adapters/src/eq_mod.rs b/extensions/rv32-adapters/src/eq_mod.rs index 508d7eb80a..ab80481f19 100644 --- a/extensions/rv32-adapters/src/eq_mod.rs +++ b/extensions/rv32-adapters/src/eq_mod.rs @@ -41,11 +41,10 @@ use serde_big_array::BigArray; use serde_with::serde_as; /// This adapter reads from NUM_READS <= 2 pointers and writes to a register. -/// * The data is read from the heap (address space 2), and the pointers -/// are read from registers (address space 1). -/// * Reads take the form of `BLOCKS_PER_READ` consecutive reads of size -/// `BLOCK_SIZE` from the heap, starting from the addresses in `rs[0]` -/// (and `rs[1]` if `R = 2`). +/// * The data is read from the heap (address space 2), and the pointers are read from registers +/// (address space 1). +/// * Reads take the form of `BLOCKS_PER_READ` consecutive reads of size `BLOCK_SIZE` from the heap, +/// starting from the addresses in `rs[0]` (and `rs[1]` if `R = 2`). /// * Writes are to 32-bit register rd. #[repr(C)] #[derive(AlignedBorrow)] diff --git a/extensions/rv32-adapters/src/heap.rs b/extensions/rv32-adapters/src/heap.rs index 839d69bd07..cd9f93abbc 100644 --- a/extensions/rv32-adapters/src/heap.rs +++ b/extensions/rv32-adapters/src/heap.rs @@ -36,8 +36,8 @@ use super::{ }; /// This adapter reads from NUM_READS <= 2 pointers and writes to 1 pointer. -/// * The data is read from the heap (address space 2), and the pointers -/// are read from registers (address space 1). +/// * The data is read from the heap (address space 2), and the pointers are read from registers +/// (address space 1). /// * Reads are from the addresses in `rs[0]` (and `rs[1]` if `R = 2`). /// * Writes are to the address in `rd`. diff --git a/extensions/rv32-adapters/src/heap_branch.rs b/extensions/rv32-adapters/src/heap_branch.rs index 9148b2d90c..29c9a151c9 100644 --- a/extensions/rv32-adapters/src/heap_branch.rs +++ b/extensions/rv32-adapters/src/heap_branch.rs @@ -41,8 +41,8 @@ use serde::{Deserialize, Serialize}; use serde_big_array::BigArray; /// This adapter reads from NUM_READS <= 2 pointers. -/// * The data is read from the heap (address space 2), and the pointers -/// are read from registers (address space 1). +/// * The data is read from the heap (address space 2), and the pointers are read from registers +/// (address space 1). /// * Reads are from the addresses in `rs[0]` (and `rs[1]` if `R = 2`). #[repr(C)] #[derive(AlignedBorrow)] @@ -101,16 +101,19 @@ impl VmA .eval(builder, ctx.instruction.is_valid.clone()); } - // We constrain the highest limbs of heap pointers to be less than 2^(addr_bits - (RV32_CELL_BITS * (RV32_REGISTER_NUM_LIMBS - 1))). - // This ensures that no overflow occurs when computing memory pointers. Since the number of cells accessed with each address - // will be small enough, and combined with the memory argument, it ensures that all the cells accessed in the memory are less than 2^addr_bits. + // We constrain the highest limbs of heap pointers to be less than 2^(addr_bits - + // (RV32_CELL_BITS * (RV32_REGISTER_NUM_LIMBS - 1))). This ensures that no overflow + // occurs when computing memory pointers. Since the number of cells accessed with each + // address will be small enough, and combined with the memory argument, it ensures + // that all the cells accessed in the memory are less than 2^addr_bits. let need_range_check: Vec = cols .rs_val .iter() .map(|val| val[RV32_REGISTER_NUM_LIMBS - 1]) .collect(); - // range checks constrain to RV32_CELL_BITS bits, so we need to shift the limbs to constrain the correct amount of bits + // range checks constrain to RV32_CELL_BITS bits, so we need to shift the limbs to constrain + // the correct amount of bits let limb_shift = AB::F::from_canonical_usize( 1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.address_bits), ); diff --git a/extensions/rv32-adapters/src/vec_heap.rs b/extensions/rv32-adapters/src/vec_heap.rs index a7fc3294ee..39d9ea2941 100644 --- a/extensions/rv32-adapters/src/vec_heap.rs +++ b/extensions/rv32-adapters/src/vec_heap.rs @@ -40,13 +40,12 @@ use serde::{Deserialize, Serialize}; use serde_with::serde_as; /// This adapter reads from R (R <= 2) pointers and writes to 1 pointer. -/// * The data is read from the heap (address space 2), and the pointers -/// are read from registers (address space 1). -/// * Reads take the form of `BLOCKS_PER_READ` consecutive reads of size -/// `READ_SIZE` from the heap, starting from the addresses in `rs[0]` -/// (and `rs[1]` if `R = 2`). -/// * Writes take the form of `BLOCKS_PER_WRITE` consecutive writes of -/// size `WRITE_SIZE` to the heap, starting from the address in `rd`. +/// * The data is read from the heap (address space 2), and the pointers are read from registers +/// (address space 1). +/// * Reads take the form of `BLOCKS_PER_READ` consecutive reads of size `READ_SIZE` from the heap, +/// starting from the addresses in `rs[0]` (and `rs[1]` if `R = 2`). +/// * Writes take the form of `BLOCKS_PER_WRITE` consecutive writes of size `WRITE_SIZE` to the +/// heap, starting from the address in `rd`. #[derive(Clone)] pub struct Rv32VecHeapAdapterChip< F: Field, @@ -247,9 +246,11 @@ impl< .eval(builder, ctx.instruction.is_valid.clone()); } - // We constrain the highest limbs of heap pointers to be less than 2^(addr_bits - (RV32_CELL_BITS * (RV32_REGISTER_NUM_LIMBS - 1))). - // This ensures that no overflow occurs when computing memory pointers. Since the number of cells accessed with each address - // will be small enough, and combined with the memory argument, it ensures that all the cells accessed in the memory are less than 2^addr_bits. + // We constrain the highest limbs of heap pointers to be less than 2^(addr_bits - + // (RV32_CELL_BITS * (RV32_REGISTER_NUM_LIMBS - 1))). This ensures that no overflow + // occurs when computing memory pointers. Since the number of cells accessed with each + // address will be small enough, and combined with the memory argument, it ensures + // that all the cells accessed in the memory are less than 2^addr_bits. let need_range_check: Vec = cols .rs_val .iter() @@ -257,7 +258,8 @@ impl< .map(|val| val[RV32_REGISTER_NUM_LIMBS - 1]) .collect(); - // range checks constrain to RV32_CELL_BITS bits, so we need to shift the limbs to constrain the correct amount of bits + // range checks constrain to RV32_CELL_BITS bits, so we need to shift the limbs to constrain + // the correct amount of bits let limb_shift = AB::F::from_canonical_usize( 1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.address_bits), ); diff --git a/extensions/rv32-adapters/src/vec_heap_two_reads.rs b/extensions/rv32-adapters/src/vec_heap_two_reads.rs index 0483df38ba..f829db8bbc 100644 --- a/extensions/rv32-adapters/src/vec_heap_two_reads.rs +++ b/extensions/rv32-adapters/src/vec_heap_two_reads.rs @@ -40,13 +40,13 @@ use serde::{Deserialize, Serialize}; use serde_with::serde_as; /// This adapter reads from 2 pointers and writes to 1 pointer. -/// * The data is read from the heap (address space 2), and the pointers -/// are read from registers (address space 1). -/// * Reads take the form of `BLOCKS_PER_READX` consecutive reads of size -/// `READ_SIZE` from the heap, starting from the addresses in `rs[X]` +/// * The data is read from the heap (address space 2), and the pointers are read from registers +/// (address space 1). +/// * Reads take the form of `BLOCKS_PER_READX` consecutive reads of size `READ_SIZE` from the heap, +/// starting from the addresses in `rs[X]` /// * NOTE that the two reads can read different numbers of blocks. -/// * Writes take the form of `BLOCKS_PER_WRITE` consecutive writes of -/// size `WRITE_SIZE` to the heap, starting from the address in `rd`. +/// * Writes take the form of `BLOCKS_PER_WRITE` consecutive writes of size `WRITE_SIZE` to the +/// heap, starting from the address in `rd`. pub struct Rv32VecHeapTwoReadsAdapterChip< F: Field, const BLOCKS_PER_READ1: usize, @@ -279,7 +279,8 @@ impl< let need_range_check = [&cols.rs1_val, &cols.rs2_val, &cols.rd_val, &cols.rd_val] .map(|val| val[RV32_REGISTER_NUM_LIMBS - 1]); - // range checks constrain to RV32_CELL_BITS bits, so we need to shift the limbs to constrain the correct amount of bits + // range checks constrain to RV32_CELL_BITS bits, so we need to shift the limbs to constrain + // the correct amount of bits let limb_shift = AB::F::from_canonical_usize( 1 << (RV32_CELL_BITS * RV32_REGISTER_NUM_LIMBS - self.address_bits), ); diff --git a/extensions/rv32im/circuit/src/adapters/loadstore.rs b/extensions/rv32im/circuit/src/adapters/loadstore.rs index e4af5527e0..b92680a0c7 100644 --- a/extensions/rv32im/circuit/src/adapters/loadstore.rs +++ b/extensions/rv32im/circuit/src/adapters/loadstore.rs @@ -47,7 +47,8 @@ use crate::adapters::RV32_CELL_BITS; /// 2 byte aligned lh, lhu, sh instructions and /// 1 byte aligned lb, lbu, sb instructions /// This adapter always batch reads/writes 4 bytes, -/// thus it needs to shift left the memory pointer by some amount in case of not 4 byte aligned intermediate pointers +/// thus it needs to shift left the memory pointer by some amount in case of not 4 byte aligned +/// intermediate pointers pub struct LoadStoreInstruction { /// is_valid is constrained to be bool pub is_valid: T, @@ -56,8 +57,8 @@ pub struct LoadStoreInstruction { /// is_load is constrained to be bool, and can only be 1 if is_valid is 1 pub is_load: T, - /// Keeping two separate shift amounts is needed for getting the read_ptr/write_ptr with degree 2 - /// load_shift_amount will be the shift amount if load and 0 if store + /// Keeping two separate shift amounts is needed for getting the read_ptr/write_ptr with degree + /// 2 load_shift_amount will be the shift amount if load and 0 if store pub load_shift_amount: T, /// store_shift_amount will be 0 if load and the shift amount if store pub store_shift_amount: T, @@ -70,8 +71,9 @@ pub struct LoadStoreInstruction { /// This method ensures that there are no modifications to the global interfaces. /// /// Here 2 reads represent read_data and prev_data, -/// The second element of the tuple in Reads is the shift amount needed to be passed to the core chip -/// Getting the intermediate pointer is completely internal to the adapter and shouldn't be a part of the AdapterInterface +/// The second element of the tuple in Reads is the shift amount needed to be passed to the core +/// chip Getting the intermediate pointer is completely internal to the adapter and shouldn't be a +/// part of the AdapterInterface pub struct Rv32LoadStoreAdapterRuntimeInterface(PhantomData); impl VmAdapterInterface for Rv32LoadStoreAdapterRuntimeInterface { type Reads = ([[T; RV32_REGISTER_NUM_LIMBS]; 2], T); @@ -126,7 +128,8 @@ impl Rv32LoadStoreAdapterChip { #[serde(bound = "F: Field")] pub struct Rv32LoadStoreReadRecord { pub rs1_record: RecordId, - /// This will be a read from a register in case of Stores and a read from RISC-V memory in case of Loads. + /// This will be a read from a register in case of Stores and a read from RISC-V memory in case + /// of Loads. pub read: RecordId, pub rs1_ptr: F, pub imm: F, @@ -140,8 +143,9 @@ pub struct Rv32LoadStoreReadRecord { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(bound = "F: Field")] pub struct Rv32LoadStoreWriteRecord { - /// This will be a write to a register in case of Load and a write to RISC-V memory in case of Stores. - /// For better struct packing, `RecordId(usize::MAX)` is used to indicate that there is no write. + /// This will be a write to a register in case of Load and a write to RISC-V memory in case of + /// Stores. For better struct packing, `RecordId(usize::MAX)` is used to indicate that + /// there is no write. pub write_id: RecordId, pub from_state: ExecutionState, pub rd_rs2_ptr: F, @@ -218,7 +222,8 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { builder.assert_bool(write_count); builder.when(write_count).assert_one(is_valid.clone()); - // Constrain that if `is_valid == 1` and `write_count == 0`, then `is_load == 1` and `rd_rs2_ptr == x0` + // Constrain that if `is_valid == 1` and `write_count == 0`, then `is_load == 1` and + // `rd_rs2_ptr == x0` builder .when(is_valid.clone() - write_count) .assert_one(is_load.clone()); @@ -293,9 +298,10 @@ impl VmAdapterAir for Rv32LoadStoreAdapterAir { ); // read_ptr is mem_ptr for loads and rd_rs2_ptr for stores - // Note: shift_amount is expected to have degree 2, thus we can't put it in the select clause - // since the resulting read_ptr/write_ptr's degree will be 3 which is too high. - // Instead, the solution without using additional columns is to get two different shift amounts from core chip + // Note: shift_amount is expected to have degree 2, thus we can't put it in the select + // clause since the resulting read_ptr/write_ptr's degree will be 3 which is + // too high. Instead, the solution without using additional columns is to get + // two different shift amounts from core chip let read_ptr = select::(is_load.clone(), mem_ptr.clone(), local_cols.rd_rs2_ptr) - load_shift_amount; diff --git a/extensions/rv32im/circuit/src/adapters/mod.rs b/extensions/rv32im/circuit/src/adapters/mod.rs index 8f2dbb73b7..ab15671b74 100644 --- a/extensions/rv32im/circuit/src/adapters/mod.rs +++ b/extensions/rv32im/circuit/src/adapters/mod.rs @@ -29,8 +29,8 @@ pub const RV_B_TYPE_IMM_BITS: usize = 13; pub const RV_J_TYPE_IMM_BITS: usize = 21; -/// Convert the RISC-V register data (32 bits represented as 4 bytes, where each byte is represented as a field element) -/// back into its value as u32. +/// Convert the RISC-V register data (32 bits represented as 4 bytes, where each byte is represented +/// as a field element) back into its value as u32. pub fn compose(ptr_data: [F; RV32_REGISTER_NUM_LIMBS]) -> u32 { let mut val = 0; for (i, limb) in ptr_data.map(|x| x.as_canonical_u32()).iter().enumerate() { @@ -60,7 +60,8 @@ pub fn read_rv32_register( (record.0, val) } -/// Peeks at the value of a register without updating the memory state or incrementing the timestamp. +/// Peeks at the value of a register without updating the memory state or incrementing the +/// timestamp. pub fn unsafe_read_rv32_register(memory: &MemoryController, pointer: F) -> u32 { let data = memory.unsafe_read::(F::ONE, pointer); compose(data) diff --git a/extensions/rv32im/circuit/src/auipc/core.rs b/extensions/rv32im/circuit/src/auipc/core.rs index 4eb6da3c3e..0426e7a205 100644 --- a/extensions/rv32im/circuit/src/auipc/core.rs +++ b/extensions/rv32im/circuit/src/auipc/core.rs @@ -105,8 +105,9 @@ where let carry_divide = AB::F::from_canonical_usize(1 << RV32_CELL_BITS).inverse(); // Don't need to constrain the least significant limb of the addition - // since we already know that rd_data[0] = pc_limbs[0] and the least significant limb of imm is 0 - // Note: imm_limbs doesn't include the least significant limb so imm_limbs[i - 1] means the i-th limb of imm + // since we already know that rd_data[0] = pc_limbs[0] and the least significant limb of imm + // is 0 Note: imm_limbs doesn't include the least significant limb so imm_limbs[i - + // 1] means the i-th limb of imm for i in 1..RV32_REGISTER_NUM_LIMBS { carry[i] = AB::Expr::from(carry_divide) * (pc_limbs[i].clone() + imm_limbs[i - 1] - rd_data[i] + carry[i - 1].clone()); @@ -120,10 +121,11 @@ where .eval(builder, is_valid); } - // The immediate and PC limbs need range checking to ensure they're within [0, 2^RV32_CELL_BITS) - // Since we range check two items at a time, doing this way helps efficiently divide the limbs into groups of 2 - // Note: range checking the limbs of immediate and PC separately would result in additional range checks - // since they both have odd number of limbs that need to be range checked + // The immediate and PC limbs need range checking to ensure they're within [0, + // 2^RV32_CELL_BITS) Since we range check two items at a time, doing this way helps + // efficiently divide the limbs into groups of 2 Note: range checking the limbs of + // immediate and PC separately would result in additional range checks since + // they both have odd number of limbs that need to be range checked let mut need_range_check: Vec = Vec::new(); for limb in imm_limbs { need_range_check.push(limb.into()); @@ -132,7 +134,8 @@ where // pc_limbs[0] is already range checked through rd_data[0] for (i, limb) in pc_limbs.iter().skip(1).enumerate() { if i == pc_limbs.len() - 1 { - // Range check the most significant limb of pc to be in [0, 2^{PC_BITS-(RV32_REGISTER_NUM_LIMBS-1)*RV32_CELL_BITS}) + // Range check the most significant limb of pc to be in [0, + // 2^{PC_BITS-(RV32_REGISTER_NUM_LIMBS-1)*RV32_CELL_BITS}) need_range_check.push( (*limb).clone() * AB::Expr::from_canonical_usize( diff --git a/extensions/rv32im/circuit/src/branch_eq/core.rs b/extensions/rv32im/circuit/src/branch_eq/core.rs index 3feac9acde..bb04d86ee5 100644 --- a/extensions/rv32im/circuit/src/branch_eq/core.rs +++ b/extensions/rv32im/circuit/src/branch_eq/core.rs @@ -88,7 +88,8 @@ where // For BEQ, inv_marker is used to check equality of a and b: // - If a == b, all inv_marker values must be 0 (sum = 0) - // - If a != b, inv_marker contains 0s for all positions except ONE position i where a[i] != b[i] + // - If a != b, inv_marker contains 0s for all positions except ONE position i where a[i] != + // b[i] // - At this position, inv_marker[i] contains the multiplicative inverse of (a[i] - b[i]) // - This ensures inv_marker[i] * (a[i] - b[i]) = 1, making the sum = 1 // Note: There might be multiple valid inv_marker if a != b. diff --git a/extensions/rv32im/circuit/src/branch_lt/core.rs b/extensions/rv32im/circuit/src/branch_lt/core.rs index 20445a5669..3eebb02146 100644 --- a/extensions/rv32im/circuit/src/branch_lt/core.rs +++ b/extensions/rv32im/circuit/src/branch_lt/core.rs @@ -114,7 +114,8 @@ where let marker = &cols.diff_marker; let mut prefix_sum = AB::Expr::ZERO; - // Check if a_msb_f and b_msb_f are signed values of a[NUM_LIMBS - 1] and b[NUM_LIMBS - 1] in prime field F. + // Check if a_msb_f and b_msb_f are signed values of a[NUM_LIMBS - 1] and b[NUM_LIMBS - 1] + // in prime field F. let a_diff = a[NUM_LIMBS - 1] - cols.a_msb_f; let b_diff = b[NUM_LIMBS - 1] - cols.b_msb_f; builder @@ -133,10 +134,10 @@ where builder.assert_zero(not::(prefix_sum.clone()) * diff.clone()); builder.when(marker[i]).assert_eq(cols.diff_val, diff); } - // - If x != y, then prefix_sum = 1 so marker[i] must be 1 iff i is the first index where diff != 0. - // Constrains that diff == diff_val where diff_val is non-zero. - // - If x == y, then prefix_sum = 0 and cmp_lt = 0. - // Here, prefix_sum cannot be 1 because all diff are zero, making diff == diff_val fails. + // - If x != y, then prefix_sum = 1 so marker[i] must be 1 iff i is the first index where + // diff != 0. Constrains that diff == diff_val where diff_val is non-zero. + // - If x == y, then prefix_sum = 0 and cmp_lt = 0. Here, prefix_sum cannot be 1 because all + // diff are zero, making diff == diff_val fails. builder.assert_bool(prefix_sum.clone()); builder diff --git a/extensions/rv32im/circuit/src/divrem/core.rs b/extensions/rv32im/circuit/src/divrem/core.rs index 1e65a84385..bad043d582 100644 --- a/extensions/rv32im/circuit/src/divrem/core.rs +++ b/extensions/rv32im/circuit/src/divrem/core.rs @@ -120,7 +120,8 @@ where let q = &cols.q; let r = &cols.r; - // Constrain that b = (c * q + r) % 2^{NUM_LIMBS * LIMB_BITS} and range checkeach element in q. + // Constrain that b = (c * q + r) % 2^{NUM_LIMBS * LIMB_BITS} and range checkeach element in + // q. let b_ext = cols.b_sign * AB::F::from_canonical_u32((1 << LIMB_BITS) - 1); let c_ext = cols.c_sign * AB::F::from_canonical_u32((1 << LIMB_BITS) - 1); let carry_divide = AB::F::from_canonical_u32(1 << LIMB_BITS).inverse(); @@ -302,10 +303,10 @@ where builder.assert_zero(not::(prefix_sum.clone()) * diff.clone()); builder.when(marker[i]).assert_eq(cols.lt_diff, diff); } - // - If r_prime != c, then prefix_sum = 1 so marker[i] must be 1 iff i is the first index where diff != 0. - // Constrains that diff == lt_diff where lt_diff is non-zero. - // - If r_prime == c, then prefix_sum = 0. - // Here, prefix_sum cannot be 1 because all diff are zero, making diff == lt_diff fails. + // - If r_prime != c, then prefix_sum = 1 so marker[i] must be 1 iff i is the first index + // where diff != 0. Constrains that diff == lt_diff where lt_diff is non-zero. + // - If r_prime == c, then prefix_sum = 0. Here, prefix_sum cannot be 1 because all diff are + // zero, making diff == lt_diff fails. builder.when(is_valid.clone()).assert_one(prefix_sum); // Range check to ensure lt_diff is non-zero. diff --git a/extensions/rv32im/circuit/src/hintstore/mod.rs b/extensions/rv32im/circuit/src/hintstore/mod.rs index 56879869c0..6f70a584d0 100644 --- a/extensions/rv32im/circuit/src/hintstore/mod.rs +++ b/extensions/rv32im/circuit/src/hintstore/mod.rs @@ -204,9 +204,9 @@ impl Air for Rv32HintStoreAir { .eval(builder, is_start.clone()); // Preventing mem_ptr and rem_words overflow - // Constraining mem_ptr_limbs[RV32_REGISTER_NUM_LIMBS - 1] < 2^(pointer_max_bits - (RV32_REGISTER_NUM_LIMBS - 1)*RV32_CELL_BITS) - // which implies mem_ptr <= 2^pointer_max_bits - // Similarly for rem_words <= 2^pointer_max_bits + // Constraining mem_ptr_limbs[RV32_REGISTER_NUM_LIMBS - 1] < 2^(pointer_max_bits - + // (RV32_REGISTER_NUM_LIMBS - 1)*RV32_CELL_BITS) which implies mem_ptr <= + // 2^pointer_max_bits Similarly for rem_words <= 2^pointer_max_bits self.bitwise_operation_lookup_bus .send_range( local_cols.mem_ptr_limbs[RV32_REGISTER_NUM_LIMBS - 1] @@ -230,25 +230,29 @@ impl Air for Rv32HintStoreAir { // buffer transition // `is_end` implies that the next row belongs to a new instruction, // which could be one of empty, hint_single, or hint_buffer - // Constrains that when the current row is not empty and `is_end == 1`, then `rem_words` is 1 + // Constrains that when the current row is not empty and `is_end == 1`, then `rem_words` is + // 1 builder .when(is_valid) .when(is_end.clone()) .assert_one(rem_words.clone()); let mut when_buffer_transition = builder.when(not::(is_end.clone())); - // Notes on `rem_words`: we constrain that `rem_words` doesn't overflow when we first read it and - // that on each row it decreases by one (below). We also constrain that when the current instruction ends then `rem_words` is 1. - // However, we don't constrain that when `rem_words` is 1 then we have to end the current instruction. - // The only way to exploit this if we to do some multiple of `p` number of additional illegal `buffer` rows where `p` is the modulus of `F`. - // However, when doing `p` additional `buffer` rows we will always increment `mem_ptr` to an illegal memory address at some point, - // which prevents this exploit. + // Notes on `rem_words`: we constrain that `rem_words` doesn't overflow when we first read + // it and that on each row it decreases by one (below). We also constrain that when + // the current instruction ends then `rem_words` is 1. However, we don't constrain + // that when `rem_words` is 1 then we have to end the current instruction. + // The only way to exploit this if we to do some multiple of `p` number of additional + // illegal `buffer` rows where `p` is the modulus of `F`. However, when doing `p` + // additional `buffer` rows we will always increment `mem_ptr` to an illegal memory address + // at some point, which prevents this exploit. when_buffer_transition.assert_one(rem_words.clone() - next_rem_words.clone()); - // Note: we only care about the `next_mem_ptr = compose(next_mem_ptr_limb)` and not the individual limbs: - // the limbs do not need to be in the range, they can be anything to make `next_mem_ptr` correct -- - // this is just a way to not have to have another column for `mem_ptr`. - // The constraint we care about is `next.mem_ptr == local.mem_ptr + 4`. - // Finally, since we increment by `4` each time, any out of bounds memory access will be rejected by the memory bus before we overflow the field. + // Note: we only care about the `next_mem_ptr = compose(next_mem_ptr_limb)` and not the + // individual limbs: the limbs do not need to be in the range, they can be anything + // to make `next_mem_ptr` correct -- this is just a way to not have to have another + // column for `mem_ptr`. The constraint we care about is `next.mem_ptr == + // local.mem_ptr + 4`. Finally, since we increment by `4` each time, any out of + // bounds memory access will be rejected by the memory bus before we overflow the field. when_buffer_transition.assert_eq( next_mem_ptr.clone() - mem_ptr.clone(), AB::F::from_canonical_usize(RV32_REGISTER_NUM_LIMBS), diff --git a/extensions/rv32im/circuit/src/jal_lui/core.rs b/extensions/rv32im/circuit/src/jal_lui/core.rs index 48863ff926..2ba10e615e 100644 --- a/extensions/rv32im/circuit/src/jal_lui/core.rs +++ b/extensions/rv32im/circuit/src/jal_lui/core.rs @@ -107,7 +107,8 @@ where ); let intermed_val = rd[0] + intermed_val * AB::Expr::from_canonical_u32(1 << RV32_CELL_BITS); - // Constrain that from_pc + DEFAULT_PC_STEP is the correct composition of intermed_val in case of JAL + // Constrain that from_pc + DEFAULT_PC_STEP is the correct composition of intermed_val in + // case of JAL builder.when(is_jal).assert_eq( intermed_val, from_pc + AB::F::from_canonical_u32(DEFAULT_PC_STEP), diff --git a/extensions/rv32im/circuit/src/jalr/core.rs b/extensions/rv32im/circuit/src/jalr/core.rs index ea933b90eb..fd89c1e317 100644 --- a/extensions/rv32im/circuit/src/jalr/core.rs +++ b/extensions/rv32im/circuit/src/jalr/core.rs @@ -109,10 +109,11 @@ where let least_sig_limb = from_pc + AB::F::from_canonical_u32(DEFAULT_PC_STEP) - composed; // rd_data is the final decomposition of `from_pc + DEFAULT_PC_STEP` we need. - // The range check on `least_sig_limb` also ensures that `rd_data` correctly represents `from_pc + DEFAULT_PC_STEP`. - // Specifically, if `rd_data` does not match the expected limb, then `least_sig_limb` becomes - // the real `least_sig_limb` plus the difference between `composed` and the three most significant limbs of `from_pc + DEFAULT_PC_STEP`. - // In that case, `least_sig_limb` >= 2^RV32_CELL_BITS. + // The range check on `least_sig_limb` also ensures that `rd_data` correctly represents + // `from_pc + DEFAULT_PC_STEP`. Specifically, if `rd_data` does not match the + // expected limb, then `least_sig_limb` becomes the real `least_sig_limb` plus the + // difference between `composed` and the three most significant limbs of `from_pc + + // DEFAULT_PC_STEP`. In that case, `least_sig_limb` >= 2^RV32_CELL_BITS. let rd_data = array::from_fn(|i| { if i == 0 { least_sig_limb.clone() @@ -135,8 +136,8 @@ where builder.assert_bool(imm_sign); - // Constrain to_pc_least_sig_bit + 2 * to_pc_limbs = rs1 + imm as a i32 addition with 2 limbs - // RISC-V spec explicitly sets the least significant bit of `to_pc` to 0 + // Constrain to_pc_least_sig_bit + 2 * to_pc_limbs = rs1 + imm as a i32 addition with 2 + // limbs RISC-V spec explicitly sets the least significant bit of `to_pc` to 0 let rs1_limbs_01 = rs1[0] + rs1[1] * AB::F::from_canonical_u32(1 << RV32_CELL_BITS); let rs1_limbs_23 = rs1[2] + rs1[3] * AB::F::from_canonical_u32(1 << RV32_CELL_BITS); let inv = AB::F::from_canonical_u32(1 << 16).inverse(); diff --git a/extensions/rv32im/circuit/src/less_than/core.rs b/extensions/rv32im/circuit/src/less_than/core.rs index 2e6e5cdcd0..a605dc43de 100644 --- a/extensions/rv32im/circuit/src/less_than/core.rs +++ b/extensions/rv32im/circuit/src/less_than/core.rs @@ -111,10 +111,10 @@ where builder.assert_zero(not::(prefix_sum.clone()) * diff.clone()); builder.when(marker[i]).assert_eq(cols.diff_val, diff); } - // - If x != y, then prefix_sum = 1 so marker[i] must be 1 iff i is the first index where diff != 0. - // Constrains that diff == diff_val where diff_val is non-zero. - // - If x == y, then prefix_sum = 0 and cmp_result = 0. - // Here, prefix_sum cannot be 1 because all diff are zero, making diff == diff_val fails. + // - If x != y, then prefix_sum = 1 so marker[i] must be 1 iff i is the first index where + // diff != 0. Constrains that diff == diff_val where diff_val is non-zero. + // - If x == y, then prefix_sum = 0 and cmp_result = 0. Here, prefix_sum cannot be 1 because + // all diff are zero, making diff == diff_val fails. builder.assert_bool(prefix_sum.clone()); builder diff --git a/extensions/rv32im/circuit/src/load_sign_extend/core.rs b/extensions/rv32im/circuit/src/load_sign_extend/core.rs index ff8b391590..2284d6815c 100644 --- a/extensions/rv32im/circuit/src/load_sign_extend/core.rs +++ b/extensions/rv32im/circuit/src/load_sign_extend/core.rs @@ -26,9 +26,10 @@ use crate::adapters::LoadStoreInstruction; /// LoadSignExtend Core Chip handles byte/halfword into word conversions through sign extend /// This chip uses read_data to construct write_data -/// prev_data columns are not used in constraints defined in the CoreAir, but are used in constraints by the Adapter -/// shifted_read_data is the read_data shifted by (shift_amount & 2), this reduces the number of opcode flags needed -/// using this shifted data we can generate the write_data as if the shift_amount was 0 for loadh and 0 or 1 for loadb +/// prev_data columns are not used in constraints defined in the CoreAir, but are used in +/// constraints by the Adapter shifted_read_data is the read_data shifted by (shift_amount & 2), +/// this reduces the number of opcode flags needed using this shifted data we can generate the +/// write_data as if the shift_amount was 0 for loadh and 0 or 1 for loadb #[repr(C)] #[derive(Debug, Clone, AlignedBorrow)] pub struct LoadSignExtendCoreCols { diff --git a/extensions/rv32im/circuit/src/mul/core.rs b/extensions/rv32im/circuit/src/mul/core.rs index de2711786f..fa65a6cf09 100644 --- a/extensions/rv32im/circuit/src/mul/core.rs +++ b/extensions/rv32im/circuit/src/mul/core.rs @@ -70,7 +70,8 @@ where let c = &cols.c; // Define carry[i] = (sum_{k=0}^{i} b[k] * c[i - k] + carry[i - 1] - a[i]) / 2^LIMB_BITS. - // If 0 <= a[i], carry[i] < 2^LIMB_BITS, it can be proven that a[i] = sum_{k=0}^{i} (b[k] * c[i - k]) % 2^LIMB_BITS as necessary. + // If 0 <= a[i], carry[i] < 2^LIMB_BITS, it can be proven that a[i] = sum_{k=0}^{i} (b[k] * + // c[i - k]) % 2^LIMB_BITS as necessary. let mut carry: [AB::Expr; NUM_LIMBS] = array::from_fn(|_| AB::Expr::ZERO); let carry_divide = AB::F::from_canonical_u32(1 << LIMB_BITS).inverse(); diff --git a/extensions/rv32im/transpiler/src/instructions.rs b/extensions/rv32im/transpiler/src/instructions.rs index 8d0ed0d73f..0cd013a8ba 100644 --- a/extensions/rv32im/transpiler/src/instructions.rs +++ b/extensions/rv32im/transpiler/src/instructions.rs @@ -272,7 +272,8 @@ pub enum Rv32HintStoreOpcode { #[derive(Copy, Clone, Debug, PartialEq, Eq, FromRepr)] #[repr(u16)] pub enum Rv32Phantom { - /// Prepare the next input vector for hinting, but prepend it with a 4-byte decomposition of its length instead of one field element. + /// Prepare the next input vector for hinting, but prepend it with a 4-byte decomposition of + /// its length instead of one field element. HintInput = 0x20, /// Peek string from memory and print it to stdout. PrintStr, diff --git a/extensions/rv32im/transpiler/src/lib.rs b/extensions/rv32im/transpiler/src/lib.rs index 8cf4e5d02e..445ef9f43e 100644 --- a/extensions/rv32im/transpiler/src/lib.rs +++ b/extensions/rv32im/transpiler/src/lib.rs @@ -49,7 +49,8 @@ impl TranspilerExtension for Rv32ITranspilerExtension { if dec_insn.funct3 as u8 == CSRRW_FUNCT3 { // CSRRW if dec_insn.rs1 == 0 && dec_insn.rd == 0 { - // This resets the CSR counter to zero. Since we don't have any CSR registers, this is a nop. + // This resets the CSR counter to zero. Since we don't have any CSR + // registers, this is a nop. return Some(TranspilerOutput::one_to_one(nop())); } } diff --git a/extensions/sha256/circuit/src/sha256_chip/air.rs b/extensions/sha256/circuit/src/sha256_chip/air.rs index 0487314ea0..286df07697 100644 --- a/extensions/sha256/circuit/src/sha256_chip/air.rs +++ b/extensions/sha256/circuit/src/sha256_chip/air.rs @@ -86,10 +86,10 @@ pub(super) enum PaddingFlags { FirstPadding13, FirstPadding14, FirstPadding15, - /// FIRST_PADDING_i_LastRow: it is the first row with padding and there are i cells of non-padding - /// AND it is the last reading row of the message - /// NOTE: if the Last row has padding it has to be at least 9 cells since the last 8 cells are padded with - /// the message length + /// FIRST_PADDING_i_LastRow: it is the first row with padding and there are i cells of + /// non-padding AND it is the last reading row of the message + /// NOTE: if the Last row has padding it has to be at least 9 cells since the last 8 cells are + /// padded with the message length FirstPadding0_LastRow, FirstPadding1_LastRow, FirstPadding2_LastRow, @@ -140,8 +140,9 @@ impl Sha256VmAir { ) { let next_is_last_row = next.inner.flags.is_digest_row * next.inner.flags.is_last_block; - // Constrain that `padding_occured` is 1 on a suffix of rows in each message, excluding the last - // digest row, and 0 everywhere else. Furthermore, the suffix starts in the first 4 rows of some block. + // Constrain that `padding_occured` is 1 on a suffix of rows in each message, excluding the + // last digest row, and 0 everywhere else. Furthermore, the suffix starts in the + // first 4 rows of some block. builder.assert_bool(local.control.padding_occurred); // Last round row in the last block has padding_occurred = 1 @@ -161,8 +162,9 @@ impl Sha256VmAir { .when(local.control.padding_occurred - next_is_last_row.clone()) .assert_one(next.control.padding_occurred); - // If next row is not first 4 rows of a block, then next.padding_occurred = local.padding_occurred. - // So padding_occurred only changes in the first 4 rows of a block. + // If next row is not first 4 rows of a block, then next.padding_occurred = + // local.padding_occurred. So padding_occurred only changes in the first 4 rows of a + // block. builder .when_transition() .when(not(next.inner.flags.is_first_4_rows) - next_is_last_row) @@ -252,7 +254,8 @@ impl Sha256VmAir { is_next_entire_padding, ); - // `pad_flags` is `FirstPadding*` if current row is padding and the previous row is not padding + // `pad_flags` is `FirstPadding*` if current row is padding and the previous row is not + // padding builder.when(next.inner.flags.is_first_4_rows).assert_eq( not(local.control.padding_occurred) * next.control.padding_occurred, is_next_first_padding, @@ -396,8 +399,8 @@ impl Sha256VmAir { + local.inner.message_schedule.w[3][2], ); - // We can't support messages longer than 2^30 bytes because the length has to fit in a field element. - // So, constrain that the first 4 bytes of the length are 0. + // We can't support messages longer than 2^30 bytes because the length has to fit in a field + // element. So, constrain that the first 4 bytes of the length are 0. // Thus, the bit-length is < 2^32 so the message is < 2^29 bytes. for i in 8..12 { builder @@ -421,7 +424,8 @@ impl Sha256VmAir { .when(not::(is_last_row.clone())) .assert_eq(next_cols.control.len, local_cols.control.len); - // Read ptr should increment by [SHA256_READ_SIZE] for the first 4 rows and stay the same otherwise + // Read ptr should increment by [SHA256_READ_SIZE] for the first 4 rows and stay the same + // otherwise let read_ptr_delta = local_cols.inner.flags.is_first_4_rows * AB::Expr::from_canonical_usize(SHA256_READ_SIZE); builder @@ -527,7 +531,8 @@ impl Sha256VmAir { // This only works if self.ptr_max_bits >= 24 which is typically the case self.bitwise_lookup_bus .send_range( - // It is fine to shift like this since we already know that dst_ptr and src_ptr have [RV32_CELL_BITS] bits + // It is fine to shift like this since we already know that dst_ptr and src_ptr + // have [RV32_CELL_BITS] bits local_cols.dst_ptr[RV32_REGISTER_NUM_LIMBS - 1] * shift.clone(), local_cols.src_ptr[RV32_REGISTER_NUM_LIMBS - 1] * shift.clone(), ) @@ -548,8 +553,9 @@ impl Sha256VmAir { let dst_ptr_val = compose::(&local_cols.dst_ptr.map(|x| x.into()), RV32_CELL_BITS); - // Note: revisit in the future to do 2 block writes of 16 cells instead of 1 block write of 32 cells - // This could be beneficial as the output is often an input for another hash + // Note: revisit in the future to do 2 block writes of 16 cells instead of 1 block write of + // 32 cells This could be beneficial as the output is often an input for + // another hash self.memory_bridge .write( MemoryAddress::new(AB::Expr::from_canonical_u32(RV32_MEMORY_AS), dst_ptr_val), diff --git a/extensions/sha256/circuit/src/sha256_chip/columns.rs b/extensions/sha256/circuit/src/sha256_chip/columns.rs index a24014e51c..38c13a0f73 100644 --- a/extensions/sha256/circuit/src/sha256_chip/columns.rs +++ b/extensions/sha256/circuit/src/sha256_chip/columns.rs @@ -10,7 +10,8 @@ use openvm_sha256_air::{Sha256DigestCols, Sha256RoundCols}; use super::{SHA256_REGISTER_READS, SHA256_WRITE_SIZE}; -/// the first 16 rows of every SHA256 block will be of type Sha256VmRoundCols and the last row will be of type Sha256VmDigestCols +/// the first 16 rows of every SHA256 block will be of type Sha256VmRoundCols and the last row will +/// be of type Sha256VmDigestCols #[repr(C)] #[derive(Clone, Copy, Debug, AlignedBorrow)] pub struct Sha256VmRoundCols { @@ -26,7 +27,8 @@ pub struct Sha256VmDigestCols { pub inner: Sha256DigestCols, pub from_state: ExecutionState, - /// It is counter intuitive, but we will constrain the register reads on the very last row of every message + /// It is counter intuitive, but we will constrain the register reads on the very last row of + /// every message pub rd_ptr: T, pub rs1_ptr: T, pub rs2_ptr: T, @@ -47,7 +49,8 @@ pub struct Sha256VmControlCols { /// Need to keep timestamp and read_ptr since block reads don't have the necessary information pub cur_timestamp: T, pub read_ptr: T, - /// Padding flags which will be used to encode the the number of non-padding cells in the current row + /// Padding flags which will be used to encode the the number of non-padding cells in the + /// current row pub pad_flags: [T; 6], /// A boolean flag that indicates whether a padding already occurred pub padding_occurred: T, diff --git a/extensions/sha256/circuit/src/sha256_chip/mod.rs b/extensions/sha256/circuit/src/sha256_chip/mod.rs index 5b9bf7bb46..4c40eca5d8 100644 --- a/extensions/sha256/circuit/src/sha256_chip/mod.rs +++ b/extensions/sha256/circuit/src/sha256_chip/mod.rs @@ -132,7 +132,8 @@ impl InstructionExecutor for Sha256VmChip { assert!(len < (1 << self.air.ptr_max_bits)); } - // need to pad with one 1 bit, 64 bits for the message length and then pad until the length is divisible by [SHA256_BLOCK_BITS] + // need to pad with one 1 bit, 64 bits for the message length and then pad until the length + // is divisible by [SHA256_BLOCK_BITS] let num_blocks = ((len << 3) as usize + 1 + 64).div_ceil(SHA256_BLOCK_BITS); // we will read [num_blocks] * [SHA256_BLOCK_CELLS] cells but only [len] cells will be used diff --git a/extensions/sha256/circuit/src/sha256_chip/trace.rs b/extensions/sha256/circuit/src/sha256_chip/trace.rs index 0d51a21368..71468f4b1c 100644 --- a/extensions/sha256/circuit/src/sha256_chip/trace.rs +++ b/extensions/sha256/circuit/src/sha256_chip/trace.rs @@ -94,7 +94,8 @@ where ); // During the first pass we will fill out most of the matrix - // But there are some cells that can't be generated by the first pass so we will do a second pass over the matrix + // But there are some cells that can't be generated by the first pass so we will do a second + // pass over the matrix values .par_chunks_mut(width * SHA256_ROWS_PER_BLOCK) .zip(states.into_par_iter().enumerate()) diff --git a/rustfmt.toml b/rustfmt.toml index 7f1b494d59..7d773d6025 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -2,3 +2,8 @@ style_edition = "2021" imports_granularity = "Crate" # unstable features: use cargo +nightly fmt group_imports = "StdExternalCrate" +comment_width = 100 +wrap_comments = true +format_code_in_doc_comments = true +doc_comment_code_block_width = 100 +use_field_init_shorthand = true From c6207ba70f9623d8a7c43a7f5f3edb6823e6d53b Mon Sep 17 00:00:00 2001 From: Jonathan Wang <31040440+jonathanpwang@users.noreply.github.com> Date: Mon, 14 Apr 2025 14:52:34 -0400 Subject: [PATCH 22/25] chore: feature gate `revm` and `alloy` imports (#1572) Previously we were very sloppy with enabling of features: `openvm-native-recursion` was always enabling the `snark-verifier` feature "revm" which imports a fixed version of revm only used for testing purposes. Since revm version changes rather frequently, this can cause Cargo dependency conflicts if someone wants to use the SDK with another version of revm. I've added new features "evm-prove" and "evm-verify" to `openvm-native-recursion`, `openvm-sdk`, `cargo-openvm` so that - "evm-prove" allows for generation of EVM halo2 proofs, which just enables some additional features in `snark-verifier` but no additional other dependencies. - "evm-verify" allows for revm simulation of EVM contract calls to verify halo2 proofs. This includes imports of `revm` and some `alloy` crates, with fixed versions. If you enable this feature (on by default), the revm and alloy versions will be fixed in the cargo tree. Also added some re-exported features to SDK and CLI, and switched default memory allocator to `jemalloc` since that's what we mostly use. --- .github/workflows/lints.yml | 4 +- benchmarks/execute/Cargo.toml | 3 +- benchmarks/prove/Cargo.toml | 5 +- benchmarks/prove/src/bin/fib_e2e.rs | 4 +- benchmarks/prove/src/bin/kitchen_sink.rs | 4 +- crates/cli/Cargo.toml | 15 ++- crates/cli/src/bin/cargo-openvm.rs | 7 +- crates/cli/src/commands/mod.rs | 2 + crates/cli/src/commands/prove.rs | 25 ++-- crates/cli/src/commands/verify.rs | 16 +-- crates/sdk/Cargo.toml | 23 +++- crates/sdk/src/lib.rs | 70 ++++++----- crates/sdk/src/prover/mod.rs | 117 ++++++++++-------- crates/sdk/src/types.rs | 1 + crates/sdk/tests/integration_test.rs | 2 + crates/vm/Cargo.toml | 2 +- extensions/bigint/circuit/Cargo.toml | 2 +- extensions/keccak256/circuit/Cargo.toml | 2 +- extensions/native/recursion/Cargo.toml | 16 +-- extensions/native/recursion/src/halo2/mod.rs | 4 +- .../native/recursion/src/halo2/wrapper.rs | 59 +++++---- extensions/rv32im/circuit/Cargo.toml | 2 +- extensions/sha256/circuit/Cargo.toml | 2 +- 23 files changed, 226 insertions(+), 161 deletions(-) diff --git a/.github/workflows/lints.yml b/.github/workflows/lints.yml index 6d75c6b1b5..bb99d4ff4e 100644 --- a/.github/workflows/lints.yml +++ b/.github/workflows/lints.yml @@ -45,8 +45,8 @@ jobs: run: | # list of features generated using: # echo -e "\033[1;32mAll unique features across workspace:\033[0m" && cargo metadata --format-version=1 --no-deps | jq -r '.packages[].features | to_entries[] | .key' | sort -u | sed 's/^/• /' - cargo clippy --all-targets --all --tests --features "aggregation bench-metrics bls12_381 bn254 default entrypoint export-getrandom export-libm function-span getrandom halo2-compiler halo2curves heap-embedded-alloc k256 mimalloc nightly-features panic-handler parallel rust-runtime static-verifier std test-utils unstable" -- -D warnings - cargo clippy --all-targets --all --tests --no-default-features --features "jemalloc jemalloc-prof" -- -D warnings + cargo clippy --all-targets --all --tests --features "aggregation bench-metrics bls12_381 bn254 default entrypoint evm-prove evm-verify export-getrandom export-libm function-span getrandom halo2-compiler halo2curves heap-embedded-alloc k256 jemalloc jemalloc-prof nightly-features panic-handler parallel rust-runtime static-verifier std test-utils unstable" -- -D warnings + cargo clippy --all-targets --all --tests --no-default-features --features "mimalloc" -- -D warnings - name: Run fmt, clippy for guest run: | diff --git a/benchmarks/execute/Cargo.toml b/benchmarks/execute/Cargo.toml index 64e76e9aa3..319490220a 100644 --- a/benchmarks/execute/Cargo.toml +++ b/benchmarks/execute/Cargo.toml @@ -30,9 +30,8 @@ tracing-subscriber = { version = "0.3.17", features = ["std", "env-filter"] } criterion = { version = "0.5", features = ["html_reports"] } [features] -default = ["mimalloc"] +default = ["jemalloc"] profiling = ["openvm-sdk/profiling"] -aggregation = [] mimalloc = ["openvm-circuit/mimalloc"] jemalloc = ["openvm-circuit/jemalloc"] jemalloc-prof = ["openvm-circuit/jemalloc-prof"] diff --git a/benchmarks/prove/Cargo.toml b/benchmarks/prove/Cargo.toml index b71e0f3fec..7809fda948 100644 --- a/benchmarks/prove/Cargo.toml +++ b/benchmarks/prove/Cargo.toml @@ -10,7 +10,7 @@ license.workspace = true [dependencies] openvm-benchmarks-utils.workspace = true openvm-circuit.workspace = true -openvm-sdk.workspace = true +openvm-sdk = { workspace = true, features = ["evm-verify"] } openvm-stark-backend.workspace = true openvm-stark-sdk.workspace = true openvm-transpiler.workspace = true @@ -43,11 +43,10 @@ tracing.workspace = true [dev-dependencies] [features] -default = ["parallel", "mimalloc", "bench-metrics"] +default = ["parallel", "jemalloc", "bench-metrics"] bench-metrics = ["openvm-native-recursion/bench-metrics"] profiling = ["openvm-sdk/profiling"] aggregation = [] -static-verifier = ["openvm-native-recursion/static-verifier"] parallel = ["openvm-native-recursion/parallel"] mimalloc = ["openvm-circuit/mimalloc"] jemalloc = ["openvm-circuit/jemalloc"] diff --git a/benchmarks/prove/src/bin/fib_e2e.rs b/benchmarks/prove/src/bin/fib_e2e.rs index efee46e4cc..6e1cfa7a35 100644 --- a/benchmarks/prove/src/bin/fib_e2e.rs +++ b/benchmarks/prove/src/bin/fib_e2e.rs @@ -10,7 +10,7 @@ use openvm_rv32im_transpiler::{ Rv32ITranspilerExtension, Rv32IoTranspilerExtension, Rv32MTranspilerExtension, }; use openvm_sdk::{ - commit::commit_app_exe, prover::ContinuationProver, DefaultStaticVerifierPvHandler, Sdk, StdIn, + commit::commit_app_exe, prover::EvmHalo2Prover, DefaultStaticVerifierPvHandler, Sdk, StdIn, }; use openvm_stark_sdk::{ bench::run_with_metric_collection, config::baby_bear_poseidon2::BabyBearPoseidon2Engine, @@ -58,7 +58,7 @@ async fn main() -> Result<()> { let mut stdin = StdIn::default(); stdin.write(&n); run_with_metric_collection("OUTPUT_PATH", || { - let mut e2e_prover = ContinuationProver::<_, BabyBearPoseidon2Engine>::new( + let mut e2e_prover = EvmHalo2Prover::<_, BabyBearPoseidon2Engine>::new( &halo2_params_reader, app_pk, app_committed_exe, diff --git a/benchmarks/prove/src/bin/kitchen_sink.rs b/benchmarks/prove/src/bin/kitchen_sink.rs index dfdaa25887..c4b7791330 100644 --- a/benchmarks/prove/src/bin/kitchen_sink.rs +++ b/benchmarks/prove/src/bin/kitchen_sink.rs @@ -10,7 +10,7 @@ use openvm_ecc_circuit::{WeierstrassExtension, P256_CONFIG, SECP256K1_CONFIG}; use openvm_native_recursion::halo2::utils::{CacheHalo2ParamsReader, DEFAULT_PARAMS_DIR}; use openvm_pairing_circuit::{PairingCurve, PairingExtension}; use openvm_sdk::{ - commit::commit_app_exe, config::SdkVmConfig, prover::ContinuationProver, + commit::commit_app_exe, config::SdkVmConfig, prover::EvmHalo2Prover, DefaultStaticVerifierPvHandler, Sdk, StdIn, }; use openvm_stark_sdk::{ @@ -80,7 +80,7 @@ fn main() -> Result<()> { )?; run_with_metric_collection("OUTPUT_PATH", || -> Result<()> { - let mut prover = ContinuationProver::<_, BabyBearPoseidon2Engine>::new( + let mut prover = EvmHalo2Prover::<_, BabyBearPoseidon2Engine>::new( &halo2_params_reader, app_pk, app_committed_exe, diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 687dad46fd..a5d96e07a4 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -19,7 +19,7 @@ vergen = { version = "8", default-features = false, features = [ [dependencies] openvm-build = { workspace = true } openvm-transpiler = { workspace = true } -openvm-native-recursion = { workspace = true, features = ["static-verifier"] } +openvm-native-recursion = { workspace = true } openvm-sdk = { workspace = true } openvm-stark-sdk.workspace = true openvm-stark-backend.workspace = true @@ -39,5 +39,16 @@ toml = { workspace = true } bitcode.workspace = true [features] -default = [] +default = ["parallel", "jemalloc", "evm-verify", "bench-metrics"] +evm-prove = ["openvm-sdk/evm-prove"] +evm-verify = ["evm-prove", "openvm-sdk/evm-verify"] bench-metrics = ["openvm-sdk/bench-metrics"] +# for guest profiling: +profiling = ["openvm-sdk/profiling"] +# performance features: +# (rayon is always imported because of halo2, so "parallel" feature is redundant) +parallel = ["openvm-sdk/parallel"] +mimalloc = ["openvm-sdk/mimalloc"] +jemalloc = ["openvm-sdk/jemalloc"] +jemalloc-prof = ["openvm-sdk/jemalloc-prof"] +nightly-features = ["openvm-sdk/nightly-features"] diff --git a/crates/cli/src/bin/cargo-openvm.rs b/crates/cli/src/bin/cargo-openvm.rs index d61ea71607..d3002fdfdf 100644 --- a/crates/cli/src/bin/cargo-openvm.rs +++ b/crates/cli/src/bin/cargo-openvm.rs @@ -1,7 +1,4 @@ -use cargo_openvm::{ - commands::{BuildCmd, EvmProvingSetupCmd, KeygenCmd, ProveCmd, RunCmd, VerifyCmd}, - OPENVM_VERSION_MESSAGE, -}; +use cargo_openvm::{commands::*, OPENVM_VERSION_MESSAGE}; use clap::{Parser, Subcommand}; use eyre::Result; use openvm_stark_sdk::config::setup_tracing_with_log_level; @@ -27,6 +24,7 @@ pub enum VmCliCommands { Keygen(KeygenCmd), Prove(ProveCmd), Run(RunCmd), + #[cfg(feature = "evm-verify")] Setup(EvmProvingSetupCmd), Verify(VerifyCmd), } @@ -41,6 +39,7 @@ async fn main() -> Result<()> { VmCliCommands::Run(cmd) => cmd.run(), VmCliCommands::Keygen(cmd) => cmd.run(), VmCliCommands::Prove(cmd) => cmd.run(), + #[cfg(feature = "evm-verify")] VmCliCommands::Setup(cmd) => cmd.run().await, VmCliCommands::Verify(cmd) => cmd.run(), } diff --git a/crates/cli/src/commands/mod.rs b/crates/cli/src/commands/mod.rs index 949084d8f0..d34a45fd29 100644 --- a/crates/cli/src/commands/mod.rs +++ b/crates/cli/src/commands/mod.rs @@ -10,7 +10,9 @@ pub use prove::*; mod run; pub use run::*; +#[cfg(feature = "evm-verify")] mod setup; +#[cfg(feature = "evm-verify")] pub use setup::*; mod verify; diff --git a/crates/cli/src/commands/prove.rs b/crates/cli/src/commands/prove.rs index 3474f96ea7..2dbc07add8 100644 --- a/crates/cli/src/commands/prove.rs +++ b/crates/cli/src/commands/prove.rs @@ -2,23 +2,21 @@ use std::{path::PathBuf, sync::Arc}; use clap::Parser; use eyre::Result; -use openvm_native_recursion::halo2::utils::CacheHalo2ParamsReader; use openvm_sdk::{ commit::AppExecutionCommit, - config::{AggregationTreeConfig, SdkVmConfig}, - fs::{ - read_agg_pk_from_file, read_app_pk_from_file, read_exe_from_file, write_app_proof_to_file, - write_evm_proof_to_file, - }, + config::SdkVmConfig, + fs::{read_app_pk_from_file, read_exe_from_file, write_app_proof_to_file}, keygen::AppProvingKey, NonRootCommittedExe, Sdk, StdIn, }; +#[cfg(feature = "evm-prove")] +use openvm_sdk::{ + config::AggregationTreeConfig, + fs::{read_agg_pk_from_file, write_evm_proof_to_file}, +}; use crate::{ - default::{ - DEFAULT_AGG_PK_PATH, DEFAULT_APP_EXE_PATH, DEFAULT_APP_PK_PATH, DEFAULT_APP_PROOF_PATH, - DEFAULT_EVM_PROOF_PATH, DEFAULT_PARAMS_DIR, - }, + default::*, input::{read_to_stdin, Input}, }; @@ -44,6 +42,7 @@ enum ProveSubCommand { #[arg(long, action, help = "Path to output proof", default_value = DEFAULT_APP_PROOF_PATH)] output: PathBuf, }, + #[cfg(feature = "evm-prove")] Evm { #[arg(long, action, help = "Path to app proving key", default_value = DEFAULT_APP_PK_PATH)] app_pk: PathBuf, @@ -64,7 +63,7 @@ enum ProveSubCommand { impl ProveCmd { pub fn run(&self) -> Result<()> { - let mut sdk = Sdk::new(); + let sdk = Sdk::new(); match &self.command { ProveSubCommand::App { app_pk, @@ -77,6 +76,7 @@ impl ProveCmd { let app_proof = sdk.generate_app_proof(app_pk, committed_exe, input)?; write_app_proof_to_file(app_proof, output)?; } + #[cfg(feature = "evm-prove")] ProveSubCommand::Evm { app_pk, exe, @@ -84,6 +84,9 @@ impl ProveCmd { output, agg_tree_config, } => { + use openvm_native_recursion::halo2::utils::CacheHalo2ParamsReader; + + let mut sdk = sdk; sdk.set_agg_tree_config(*agg_tree_config); let params_reader = CacheHalo2ParamsReader::new(DEFAULT_PARAMS_DIR); let (app_pk, committed_exe, input) = diff --git a/crates/cli/src/commands/verify.rs b/crates/cli/src/commands/verify.rs index 4185880b16..6651f3a7f4 100644 --- a/crates/cli/src/commands/verify.rs +++ b/crates/cli/src/commands/verify.rs @@ -3,17 +3,11 @@ use std::path::PathBuf; use clap::Parser; use eyre::Result; use openvm_sdk::{ - fs::{ - read_app_proof_from_file, read_app_vk_from_file, read_evm_halo2_verifier_from_folder, - read_evm_proof_from_file, - }, + fs::{read_app_proof_from_file, read_app_vk_from_file}, Sdk, }; -use crate::default::{ - DEFAULT_APP_PROOF_PATH, DEFAULT_APP_VK_PATH, DEFAULT_EVM_HALO2_VERIFIER_PATH, - DEFAULT_EVM_PROOF_PATH, -}; +use crate::default::*; #[derive(Parser)] #[command(name = "verify", about = "Verify a proof")] @@ -31,6 +25,7 @@ enum VerifySubCommand { #[arg(long, action, help = "Path to app proof", default_value = DEFAULT_APP_PROOF_PATH)] proof: PathBuf, }, + #[cfg(feature = "evm-verify")] Evm { #[arg(long, action, help = "Path to EVM proof", default_value = DEFAULT_EVM_PROOF_PATH)] proof: PathBuf, @@ -46,7 +41,12 @@ impl VerifyCmd { let app_proof = read_app_proof_from_file(proof)?; sdk.verify_app_proof(&app_vk, &app_proof)?; } + #[cfg(feature = "evm-verify")] VerifySubCommand::Evm { proof } => { + use openvm_sdk::fs::{ + read_evm_halo2_verifier_from_folder, read_evm_proof_from_file, + }; + let evm_verifier = read_evm_halo2_verifier_from_folder(DEFAULT_EVM_HALO2_VERIFIER_PATH).map_err(|e| { eyre::eyre!("Failed to read EVM verifier: {}\nPlease run 'cargo openvm evm-proving-setup' first", e) })?; diff --git a/crates/sdk/Cargo.toml b/crates/sdk/Cargo.toml index 32b74f48d0..ea687ca7c7 100644 --- a/crates/sdk/Cargo.toml +++ b/crates/sdk/Cargo.toml @@ -8,7 +8,6 @@ repository.workspace = true license.workspace = true [dependencies] - p3-fri = { workspace = true } openvm-algebra-circuit = { workspace = true } openvm-algebra-transpiler = { workspace = true } @@ -35,8 +34,8 @@ openvm-circuit = { workspace = true } openvm-continuations = { workspace = true } openvm = { workspace = true } -alloy-primitives = { workspace = true } -alloy-sol-types = { workspace = true, features = ["json"] } +alloy-primitives = { workspace = true, optional = true } +alloy-sol-types = { workspace = true, optional = true, features = ["json"] } bitcode = { workspace = true } bon = { workspace = true } derivative = { workspace = true } @@ -58,12 +57,26 @@ tempfile.workspace = true hex.workspace = true [features] -default = ["parallel"] +default = ["parallel", "jemalloc", "evm-verify"] +evm-prove = ["openvm-native-recursion/evm-prove"] +evm-verify = [ + "evm-prove", + "openvm-native-recursion/evm-verify", + "dep:alloy-primitives", + "dep:alloy-sol-types", +] bench-metrics = [ "openvm-circuit/bench-metrics", "openvm-native-recursion/bench-metrics", "openvm-native-compiler/bench-metrics", ] +# for guest profiling: profiling = ["openvm-circuit/function-span", "openvm-transpiler/function-span"] -parallel = ["openvm-circuit/parallel"] test-utils = ["openvm-circuit/test-utils"] +# performance features: +# (rayon is always imported because of halo2, so "parallel" feature is redundant) +parallel = ["openvm-circuit/parallel"] +mimalloc = ["openvm-circuit/mimalloc"] +jemalloc = ["openvm-circuit/jemalloc"] +jemalloc-prof = ["openvm-circuit/jemalloc-prof"] +nightly-features = ["openvm-circuit/nightly-features"] diff --git a/crates/sdk/src/lib.rs b/crates/sdk/src/lib.rs index a57561e7f4..1af33d86fc 100644 --- a/crates/sdk/src/lib.rs +++ b/crates/sdk/src/lib.rs @@ -1,18 +1,10 @@ -use std::{ - env, - fs::{create_dir_all, read, write}, - marker::PhantomData, - path::Path, - process::Command, - sync::Arc, -}; +use std::{fs::read, marker::PhantomData, path::Path, sync::Arc}; +#[cfg(feature = "evm-verify")] use alloy_primitives::{Bytes, FixedBytes}; +#[cfg(feature = "evm-verify")] use alloy_sol_types::{sol, SolCall, SolValue}; -use commit::commit_app_exe; -use config::{AggregationTreeConfig, AppConfig}; -use eyre::{Context, Result}; -use keygen::{AppProvingKey, AppVerifyingKey}; +use eyre::Result; use openvm_build::{ build_guest_package, find_unique_executable, get_package, GuestOptions, TargetFilter, }; @@ -32,7 +24,7 @@ pub use openvm_continuations::{ static_verifier::{DefaultStaticVerifierPvHandler, StaticVerifierPvHandler}, RootSC, C, F, SC, }; -use openvm_native_recursion::halo2::{utils::Halo2ParamsReader, wrapper::EvmVerifierByteCode}; +use openvm_native_recursion::halo2::utils::Halo2ParamsReader; use openvm_stark_backend::proof::Proof; use openvm_stark_sdk::{ config::{baby_bear_poseidon2::BabyBearPoseidon2Engine, FriParameters}, @@ -45,22 +37,17 @@ use openvm_transpiler::{ transpiler::{Transpiler, TranspilerError}, FromElf, }; -use snark_verifier_sdk::{ - evm::gen_evm_verifier_sol_code, halo2::aggregation::AggregationCircuit, - snark_verifier::halo2_base::halo2_proofs::poly::commitment::Params, SHPLONK, -}; -use tempfile::tempdir; +#[cfg(feature = "evm-verify")] +use snark_verifier_sdk::{evm::gen_evm_verifier_sol_code, halo2::aggregation::AggregationCircuit}; use crate::{ - config::AggConfig, - fs::{ - EVM_HALO2_VERIFIER_BASE_NAME, EVM_HALO2_VERIFIER_INTERFACE_NAME, - EVM_HALO2_VERIFIER_PARENT_NAME, - }, - keygen::{AggProvingKey, AggStarkProvingKey}, - prover::{AppProver, ContinuationProver, StarkProver}, - types::{EvmHalo2Verifier, EvmProof, NUM_BN254_ACCUMULATORS}, + commit::commit_app_exe, + config::{AggConfig, AggregationTreeConfig, AppConfig}, + keygen::{AggProvingKey, AggStarkProvingKey, AppProvingKey, AppVerifyingKey}, + prover::{AppProver, StarkProver}, }; +#[cfg(feature = "evm-prove")] +use crate::{prover::EvmHalo2Prover, types::EvmProof}; pub mod codec; pub mod commit; @@ -81,6 +68,7 @@ pub const EVM_HALO2_VERIFIER_INTERFACE: &str = pub const EVM_HALO2_VERIFIER_TEMPLATE: &str = include_str!("../contracts/template/OpenVmHalo2Verifier.sol"); +#[cfg(feature = "evm-verify")] sol! { IOpenVmHalo2Verifier, concat!(env!("CARGO_MANIFEST_DIR"), "/contracts/abi/IOpenVmHalo2Verifier.json"), @@ -280,6 +268,7 @@ impl> GenericSdk { Ok(proof) } + #[cfg(feature = "evm-prove")] pub fn generate_evm_proof>( &self, reader: &impl Halo2ParamsReader, @@ -293,16 +282,34 @@ impl> GenericSdk { VC::Periphery: Chip, { let e2e_prover = - ContinuationProver::::new(reader, app_pk, app_exe, agg_pk, self.agg_tree_config); + EvmHalo2Prover::::new(reader, app_pk, app_exe, agg_pk, self.agg_tree_config); let proof = e2e_prover.generate_proof_for_evm(inputs); Ok(proof) } + #[cfg(feature = "evm-verify")] pub fn generate_halo2_verifier_solidity( &self, reader: &impl Halo2ParamsReader, agg_pk: &AggProvingKey, - ) -> Result { + ) -> Result { + use std::{ + fs::{create_dir_all, write}, + process::Command, + }; + + use eyre::Context; + use openvm_native_recursion::halo2::wrapper::EvmVerifierByteCode; + use snark_verifier::halo2_base::halo2_proofs::poly::commitment::Params; + use snark_verifier_sdk::SHPLONK; + use tempfile::tempdir; + use types::EvmHalo2Verifier; + + use crate::fs::{ + EVM_HALO2_VERIFIER_BASE_NAME, EVM_HALO2_VERIFIER_INTERFACE_NAME, + EVM_HALO2_VERIFIER_PARENT_NAME, + }; + let params = reader.read_params(agg_pk.halo2_pk.wrapper.pinning.metadata.config_params.k); let pinning = &agg_pk.halo2_pk.wrapper.pinning; @@ -399,12 +406,15 @@ impl> GenericSdk { Ok(evm_verifier) } + #[cfg(feature = "evm-verify")] /// Uses the `verify(..)` interface of the `OpenVmHalo2Verifier` contract. pub fn verify_evm_halo2_proof( &self, - openvm_verifier: &EvmHalo2Verifier, + openvm_verifier: &types::EvmHalo2Verifier, evm_proof: &EvmProof, ) -> Result { + use crate::types::NUM_BN254_ACCUMULATORS; + let EvmProof { accumulators, proof, @@ -473,6 +483,7 @@ impl> GenericSdk { /// /// Once we find "OpenVmHalo2Verifier.sol:OpenVmHalo2Verifier," we can skip /// to the appropriate offset to get the compiled bytecode. +#[cfg(feature = "evm-verify")] fn extract_binary(output: &[u8], contract_name: &str) -> Vec { let split = split_by_ascii_whitespace(output); let contract_name_bytes = contract_name.as_bytes(); @@ -486,6 +497,7 @@ fn extract_binary(output: &[u8], contract_name: &str) -> Vec { panic!("Contract '{}' not found", contract_name); } +#[cfg(feature = "evm-verify")] fn split_by_ascii_whitespace(bytes: &[u8]) -> Vec<&[u8]> { let mut split = Vec::new(); let mut start = None; diff --git a/crates/sdk/src/prover/mod.rs b/crates/sdk/src/prover/mod.rs index f565adcbab..67ccfe1eb8 100644 --- a/crates/sdk/src/prover/mod.rs +++ b/crates/sdk/src/prover/mod.rs @@ -1,71 +1,78 @@ -use std::sync::Arc; - -use openvm_circuit::arch::VmConfig; -use openvm_stark_sdk::{engine::StarkFriEngine, openvm_stark_backend::Chip}; - -use crate::{ - config::AggregationTreeConfig, keygen::AppProvingKey, stdin::StdIn, NonRootCommittedExe, F, SC, -}; - mod agg; -pub use agg::*; mod app; -pub use app::*; -use openvm_native_recursion::halo2::utils::Halo2ParamsReader; - +#[cfg(feature = "evm-prove")] mod halo2; -#[allow(unused_imports)] -pub use halo2::*; mod root; -pub use root::*; mod stark; pub mod vm; -#[allow(unused_imports)] +pub use agg::*; +pub use app::*; +#[cfg(feature = "evm-prove")] +pub use evm::*; +#[cfg(feature = "evm-prove")] +pub use halo2::*; +pub use root::*; pub use stark::*; -use crate::{keygen::AggProvingKey, prover::halo2::Halo2Prover, types::EvmProof}; +#[cfg(feature = "evm-prove")] +mod evm { + use std::sync::Arc; -pub struct ContinuationProver> { - pub stark_prover: StarkProver, - pub halo2_prover: Halo2Prover, -} + use openvm_circuit::arch::VmConfig; + use openvm_native_recursion::halo2::utils::Halo2ParamsReader; + use openvm_stark_sdk::{engine::StarkFriEngine, openvm_stark_backend::Chip}; -impl> ContinuationProver { - pub fn new( - reader: &impl Halo2ParamsReader, - app_pk: Arc>, - app_committed_exe: Arc, - agg_pk: AggProvingKey, - agg_tree_config: AggregationTreeConfig, - ) -> Self - where - VC: VmConfig, - { - let AggProvingKey { - agg_stark_pk, - halo2_pk, - } = agg_pk; - let stark_prover = - StarkProver::new(app_pk, app_committed_exe, agg_stark_pk, agg_tree_config); - Self { - stark_prover, - halo2_prover: Halo2Prover::new(reader, halo2_pk), - } - } + use super::{Halo2Prover, StarkProver}; + use crate::{ + config::AggregationTreeConfig, + keygen::{AggProvingKey, AppProvingKey}, + stdin::StdIn, + types::EvmProof, + NonRootCommittedExe, F, SC, + }; - pub fn set_program_name(&mut self, program_name: impl AsRef) -> &mut Self { - self.stark_prover.set_program_name(program_name); - self + pub struct EvmHalo2Prover> { + pub stark_prover: StarkProver, + pub halo2_prover: Halo2Prover, } - pub fn generate_proof_for_evm(&self, input: StdIn) -> EvmProof - where - VC: VmConfig, - VC::Executor: Chip, - VC::Periphery: Chip, - { - let root_proof = self.stark_prover.generate_proof_for_outer_recursion(input); - self.halo2_prover.prove_for_evm(&root_proof) + impl> EvmHalo2Prover { + pub fn new( + reader: &impl Halo2ParamsReader, + app_pk: Arc>, + app_committed_exe: Arc, + agg_pk: AggProvingKey, + agg_tree_config: AggregationTreeConfig, + ) -> Self + where + VC: VmConfig, + { + let AggProvingKey { + agg_stark_pk, + halo2_pk, + } = agg_pk; + let stark_prover = + StarkProver::new(app_pk, app_committed_exe, agg_stark_pk, agg_tree_config); + Self { + stark_prover, + halo2_prover: Halo2Prover::new(reader, halo2_pk), + } + } + + pub fn set_program_name(&mut self, program_name: impl AsRef) -> &mut Self { + self.stark_prover.set_program_name(program_name); + self + } + + pub fn generate_proof_for_evm(&self, input: StdIn) -> EvmProof + where + VC: VmConfig, + VC::Executor: Chip, + VC::Periphery: Chip, + { + let root_proof = self.stark_prover.generate_proof_for_outer_recursion(input); + self.halo2_prover.prove_for_evm(&root_proof) + } } } diff --git a/crates/sdk/src/types.rs b/crates/sdk/src/types.rs index f191f6b864..c4c6abcfbe 100644 --- a/crates/sdk/src/types.rs +++ b/crates/sdk/src/types.rs @@ -54,6 +54,7 @@ pub enum EvmProofConversionError { } impl EvmProof { + #[cfg(feature = "evm-prove")] /// Return bytes calldata to be passed to the verifier contract. pub fn verifier_calldata(&self) -> Vec { let evm_proof: RawEvmProof = self.clone().try_into().unwrap(); diff --git a/crates/sdk/tests/integration_test.rs b/crates/sdk/tests/integration_test.rs index 7525c2f906..708ba43bac 100644 --- a/crates/sdk/tests/integration_test.rs +++ b/crates/sdk/tests/integration_test.rs @@ -293,6 +293,7 @@ fn test_public_values_and_leaf_verification() { } } +#[cfg(feature = "evm-verify")] #[test] fn test_static_verifier_custom_pv_handler() { // Define custom public values handler and implement StaticVerifierPvHandler trait on it @@ -394,6 +395,7 @@ fn test_static_verifier_custom_pv_handler() { Halo2WrapperProvingKey::evm_verify(&evm_verifier, &evm_proof).unwrap(); } +#[cfg(feature = "evm-verify")] #[test] fn test_e2e_proof_generation_and_verification_with_pvs() { let mut pkg_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).to_path_buf(); diff --git a/crates/vm/Cargo.toml b/crates/vm/Cargo.toml index 7976dc5a62..80e6794b48 100644 --- a/crates/vm/Cargo.toml +++ b/crates/vm/Cargo.toml @@ -46,7 +46,7 @@ openvm-native-compiler.workspace = true openvm-rv32im-transpiler.workspace = true [features] -default = ["parallel", "mimalloc"] +default = ["parallel", "jemalloc"] parallel = ["openvm-stark-backend/parallel"] test-utils = ["dep:openvm-stark-sdk"] bench-metrics = ["dep:metrics", "openvm-stark-backend/bench-metrics"] diff --git a/extensions/bigint/circuit/Cargo.toml b/extensions/bigint/circuit/Cargo.toml index 3b96f60a3a..09d68a9d1b 100644 --- a/extensions/bigint/circuit/Cargo.toml +++ b/extensions/bigint/circuit/Cargo.toml @@ -31,7 +31,7 @@ openvm-circuit = { workspace = true, features = ["test-utils"] } openvm-rv32-adapters = { workspace = true, features = ["test-utils"] } [features] -default = ["parallel", "mimalloc"] +default = ["parallel", "jemalloc"] parallel = ["openvm-circuit/parallel"] test-utils = ["openvm-circuit/test-utils"] # performance features: diff --git a/extensions/keccak256/circuit/Cargo.toml b/extensions/keccak256/circuit/Cargo.toml index 16d6b66bb3..941303ab39 100644 --- a/extensions/keccak256/circuit/Cargo.toml +++ b/extensions/keccak256/circuit/Cargo.toml @@ -36,7 +36,7 @@ openvm-circuit = { workspace = true, features = ["test-utils"] } hex.workspace = true [features] -default = ["parallel", "mimalloc"] +default = ["parallel", "jemalloc"] parallel = ["openvm-circuit/parallel"] test-utils = ["openvm-circuit/test-utils"] # performance features: diff --git a/extensions/native/recursion/Cargo.toml b/extensions/native/recursion/Cargo.toml index 851a9f0ad7..c799671a55 100644 --- a/extensions/native/recursion/Cargo.toml +++ b/extensions/native/recursion/Cargo.toml @@ -18,10 +18,7 @@ p3-dft = { workspace = true } p3-fri = { workspace = true } p3-symmetric = { workspace = true } p3-merkle-tree = { workspace = true } -snark-verifier-sdk = { workspace = true, features = [ - "loader_evm", - "revm", -], optional = true } +snark-verifier-sdk = { workspace = true, optional = true } itertools.workspace = true rand.workspace = true serde.workspace = true @@ -39,20 +36,25 @@ tempfile = "3.14.0" bitcode = { workspace = true } [features] -default = ["parallel", "mimalloc"] -parallel = ["openvm-stark-backend/parallel"] +default = ["parallel", "jemalloc"] static-verifier = [ "openvm-native-compiler/halo2-compiler", - "dep:snark-verifier-sdk", + "snark-verifier-sdk", "dep:once_cell", "dep:serde_with", ] +evm-prove = ["static-verifier", "snark-verifier-sdk/loader_evm"] +evm-verify = [ + "evm-prove", + "snark-verifier-sdk/revm", +] # evm-verify needs REVM to simulate EVM contract verification test-utils = ["openvm-circuit/test-utils"] bench-metrics = [ "dep:metrics", "openvm-circuit/bench-metrics", "openvm-native-compiler/bench-metrics", ] +parallel = ["openvm-stark-backend/parallel"] mimalloc = ["openvm-stark-backend/mimalloc"] jemalloc = ["openvm-stark-backend/jemalloc"] nightly-features = ["openvm-circuit/nightly-features"] diff --git a/extensions/native/recursion/src/halo2/mod.rs b/extensions/native/recursion/src/halo2/mod.rs index 743f3680bb..b53a298eb4 100644 --- a/extensions/native/recursion/src/halo2/mod.rs +++ b/extensions/native/recursion/src/halo2/mod.rs @@ -17,7 +17,6 @@ use openvm_stark_backend::p3_field::extension::BinomialExtensionField; use openvm_stark_sdk::{p3_baby_bear::BabyBear, p3_bn254_fr::Bn254Fr}; use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; use snark_verifier_sdk::{ - evm::encode_calldata, halo2::{gen_dummy_snark_from_vk, gen_snark_shplonk}, snark_verifier::halo2_base::{ gates::{ @@ -75,8 +74,9 @@ pub struct Halo2ProvingMetadata { impl RawEvmProof { /// Return bytes calldata to be passed to the verifier contract. + #[cfg(feature = "evm-prove")] pub fn verifier_calldata(&self) -> Vec { - encode_calldata(&[self.instances.clone()], &self.proof) + snark_verifier_sdk::evm::encode_calldata(&[self.instances.clone()], &self.proof) } } diff --git a/extensions/native/recursion/src/halo2/wrapper.rs b/extensions/native/recursion/src/halo2/wrapper.rs index a29c154ce5..958c502a86 100644 --- a/extensions/native/recursion/src/halo2/wrapper.rs +++ b/extensions/native/recursion/src/halo2/wrapper.rs @@ -2,29 +2,25 @@ use itertools::Itertools; use openvm_stark_backend::p3_util::log2_ceil_usize; use serde::{Deserialize, Serialize}; use serde_with::serde_as; +#[cfg(feature = "evm-prove")] +use snark_verifier_sdk::snark_verifier::{ + halo2_base::halo2_proofs::{halo2curves::bn256::G1Affine, plonk::VerifyingKey}, + loader::evm::compile_solidity, +}; use snark_verifier_sdk::{ - evm::{evm_verify, gen_evm_proof_shplonk, gen_evm_verifier_sol_code}, halo2::aggregation::{AggregationCircuit, AggregationConfigParams, VerifierUniversality}, - snark_verifier::{ - halo2_base::{ - gates::circuit::{ - CircuitBuilderStage, - CircuitBuilderStage::{Keygen, Prover}, - }, - halo2_proofs::{ - halo2curves::bn256::G1Affine, - plonk::{keygen_pk2, VerifyingKey}, - poly::commitment::Params, - }, - }, - loader::evm::compile_solidity, + snark_verifier::halo2_base::{ + gates::circuit::CircuitBuilderStage, + halo2_proofs::{plonk::keygen_pk2, poly::commitment::Params}, }, CircuitExt, Snark, SHPLONK, }; +#[cfg(feature = "evm-prove")] +use crate::halo2::RawEvmProof; use crate::halo2::{ utils::{Halo2ParamsReader, KZG_PARAMS_FOR_SVK}, - Halo2Params, Halo2ProvingMetadata, Halo2ProvingPinning, RawEvmProof, + Halo2Params, Halo2ProvingMetadata, Halo2ProvingPinning, }; /// `FallbackEvmVerifier` is for the raw verifier contract outputted by @@ -63,7 +59,8 @@ impl Halo2WrapperProvingKey { let k = params.k(); #[cfg(feature = "bench-metrics")] let start = std::time::Instant::now(); - let mut circuit = generate_wrapper_circuit_object(Keygen, k as usize, dummy_snark); + let mut circuit = + generate_wrapper_circuit_object(CircuitBuilderStage::Keygen, k as usize, dummy_snark); circuit.calculate_params(Some(MIN_ROWS)); let config_params = circuit.builder.config_params.clone(); tracing::info!( @@ -87,17 +84,19 @@ impl Halo2WrapperProvingKey { }, } } + #[cfg(feature = "evm-verify")] /// A helper function for testing to verify the proof of this circuit with evm verifier. pub fn evm_verify( evm_verifier: &FallbackEvmVerifier, evm_proof: &RawEvmProof, ) -> Result { - evm_verify( + snark_verifier_sdk::evm::evm_verify( evm_verifier.artifact.bytecode.clone(), vec![evm_proof.instances.clone()], evm_proof.proof.clone(), ) } + #[cfg(feature = "evm-prove")] /// Return deployment code for EVM verifier which can verify the snark of this circuit. pub fn generate_fallback_evm_verifier(&self, params: &Halo2Params) -> FallbackEvmVerifier { assert_eq!( @@ -111,6 +110,7 @@ impl Halo2WrapperProvingKey { self.pinning.metadata.num_pvs.clone(), ) } + #[cfg(feature = "evm-prove")] pub fn prove_for_evm(&self, params: &Halo2Params, snark_to_verify: Snark) -> RawEvmProof { #[cfg(feature = "bench-metrics")] let start = std::time::Instant::now(); @@ -118,7 +118,12 @@ impl Halo2WrapperProvingKey { let prover_circuit = self.generate_circuit_object_for_proving(k, snark_to_verify); let mut pvs = prover_circuit.instances(); assert_eq!(pvs.len(), 1); - let proof = gen_evm_proof_shplonk(params, &self.pinning.pk, prover_circuit, pvs.clone()); + let proof = snark_verifier_sdk::evm::gen_evm_proof_shplonk( + params, + &self.pinning.pk, + prover_circuit, + pvs.clone(), + ); #[cfg(feature = "bench-metrics")] metrics::gauge!("total_proof_time_ms").set(start.elapsed().as_millis() as f64); @@ -127,6 +132,8 @@ impl Halo2WrapperProvingKey { proof, } } + + #[cfg(feature = "evm-prove")] fn generate_circuit_object_for_proving( &self, k: usize, @@ -141,7 +148,7 @@ impl Halo2WrapperProvingKey { self.pinning.metadata.num_pvs[0], snark_to_verify.instances[0].len() + 12, ); - generate_wrapper_circuit_object(Prover, k, snark_to_verify) + generate_wrapper_circuit_object(CircuitBuilderStage::Prover, k, snark_to_verify) .use_params( self.pinning .metadata @@ -157,7 +164,11 @@ impl Halo2WrapperProvingKey { let mut k = 20; let mut first_run = true; loop { - let mut circuit = generate_wrapper_circuit_object(Keygen, k, dummy_snark.clone()); + let mut circuit = generate_wrapper_circuit_object( + CircuitBuilderStage::Keygen, + k, + dummy_snark.clone(), + ); circuit.calculate_params(Some(MIN_ROWS)); assert_eq!( circuit.builder.config_params.num_advice_per_phase.len(), @@ -210,13 +221,17 @@ fn emit_wrapper_circuit_metrics(agg_circuit: &AggregationCircuit) { metrics::gauge!("halo2_total_cells").set(total_cell as f64); } +#[cfg(feature = "evm-prove")] fn gen_evm_verifier( params: &Halo2Params, vk: &VerifyingKey, num_instance: Vec, ) -> FallbackEvmVerifier { - let sol_code = - gen_evm_verifier_sol_code::(params, vk, num_instance); + let sol_code = snark_verifier_sdk::evm::gen_evm_verifier_sol_code::( + params, + vk, + num_instance, + ); let byte_code = compile_solidity(&sol_code); FallbackEvmVerifier { sol_code, diff --git a/extensions/rv32im/circuit/Cargo.toml b/extensions/rv32im/circuit/Cargo.toml index 9bc8ab5418..8b20385104 100644 --- a/extensions/rv32im/circuit/Cargo.toml +++ b/extensions/rv32im/circuit/Cargo.toml @@ -32,7 +32,7 @@ openvm-stark-sdk = { workspace = true } openvm-circuit = { workspace = true, features = ["test-utils"] } [features] -default = ["parallel", "mimalloc"] +default = ["parallel", "jemalloc"] parallel = ["openvm-circuit/parallel"] test-utils = ["openvm-circuit/test-utils", "dep:openvm-stark-sdk"] # performance features: diff --git a/extensions/sha256/circuit/Cargo.toml b/extensions/sha256/circuit/Cargo.toml index 0c7100e99b..95c87b0871 100644 --- a/extensions/sha256/circuit/Cargo.toml +++ b/extensions/sha256/circuit/Cargo.toml @@ -29,7 +29,7 @@ openvm-stark-sdk = { workspace = true } openvm-circuit = { workspace = true, features = ["test-utils"] } [features] -default = ["parallel", "mimalloc"] +default = ["parallel", "jemalloc"] parallel = ["openvm-circuit/parallel"] test-utils = ["openvm-circuit/test-utils"] # performance features: From 59391092804d54615790b90549b76a36e68a6f21 Mon Sep 17 00:00:00 2001 From: Avaneesh-axiom Date: Mon, 14 Apr 2025 16:26:10 -0400 Subject: [PATCH 23/25] fix: circuit flamegraphs with segmentation (#1571) (#1576) The circuit flamegraphs being generated were incorrect due to a bug in the multi-segment execution logic. In particular, each segment takes the metric data from the previous segment, but the first segment was using an empty metrics struct instead of being initialized with the correct `fn_bounds` data. --- crates/vm/src/arch/vm.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/vm/src/arch/vm.rs b/crates/vm/src/arch/vm.rs index 7e4f99a0e3..a826fb4137 100644 --- a/crates/vm/src/arch/vm.rs +++ b/crates/vm/src/arch/vm.rs @@ -178,6 +178,12 @@ where ); let pc = exe.pc_start; let mut state = VmExecutorNextSegmentState::new(memory, input, pc); + + #[cfg(feature = "bench-metrics")] + { + state.metrics.fn_bounds = exe.fn_bounds.clone(); + } + let mut segment_idx = 0; loop { From c69bdc3de9cedb99a759b3b21b163fc300bb3532 Mon Sep 17 00:00:00 2001 From: Zach Langley Date: Mon, 7 Apr 2025 14:32:51 -0400 Subject: [PATCH 24/25] wip --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- crates/sdk/src/codec.rs | 33 ++++++++++++++++++++++++++++++--- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eaa9e308bb..3d362175c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4321,7 +4321,7 @@ dependencies = [ [[package]] name = "openvm-stark-backend" version = "1.0.0" -source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.0.0#884f8e6aabf72bde00dc51f1f1121277bff73b1e" +source = "git+https://github.com/openvm-org/stark-backend.git?rev=b4ce9e23c2e5f4d2ac186093c9078a3582aac79d#b4ce9e23c2e5f4d2ac186093c9078a3582aac79d" dependencies = [ "bitcode", "cfg-if", @@ -4349,7 +4349,7 @@ dependencies = [ [[package]] name = "openvm-stark-sdk" version = "1.0.0" -source = "git+https://github.com/openvm-org/stark-backend.git?tag=v1.0.0#884f8e6aabf72bde00dc51f1f1121277bff73b1e" +source = "git+https://github.com/openvm-org/stark-backend.git?rev=b4ce9e23c2e5f4d2ac186093c9078a3582aac79d#b4ce9e23c2e5f4d2ac186093c9078a3582aac79d" dependencies = [ "derivative", "derive_more 0.99.19", diff --git a/Cargo.toml b/Cargo.toml index 46af9b21c7..2f003d9df8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -107,8 +107,8 @@ lto = "thin" [workspace.dependencies] # Stark Backend -openvm-stark-backend = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.0.0", default-features = false } -openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", tag = "v1.0.0", default-features = false } +openvm-stark-backend = { git = "https://github.com/openvm-org/stark-backend.git", rev = "b4ce9e23c2e5f4d2ac186093c9078a3582aac79d", default-features = false } +openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", rev = "b4ce9e23c2e5f4d2ac186093c9078a3582aac79d", default-features = false } # OpenVM openvm-sdk = { path = "crates/sdk", default-features = false } diff --git a/crates/sdk/src/codec.rs b/crates/sdk/src/codec.rs index c66f254625..5bc7a525f6 100644 --- a/crates/sdk/src/codec.rs +++ b/crates/sdk/src/codec.rs @@ -7,8 +7,10 @@ use openvm_continuations::verifier::root::types::RootVmVerifierInput; use openvm_native_compiler::ir::DIGEST_SIZE; use openvm_native_recursion::hints::{InnerBatchOpening, InnerFriProof, InnerQueryProof}; use openvm_stark_backend::{ - config::{Com, PcsProof}, - interaction::{fri_log_up::FriLogUpPartialProof, RapPhaseSeqKind}, + config::{Com, PcsProof, RapPhaseSeqPartialProof}, + interaction::{ + fri_log_up::FriLogUpPartialProof, gkr_log_up::GkrLogUpPartialProof, RapPhaseSeqKind, + }, p3_field::{ extension::BinomialExtensionField, FieldAlgebra, FieldExtensionAlgebra, PrimeField32, }, @@ -147,6 +149,11 @@ fn encode_opened_values( for phase in &opened_values.after_challenge { encode_slice(phase, writer)?; } + todo!(); + // opened_values.extra_after_challenge.len().encode(writer)?; + // for phase in &opened_values.extra_after_challenge { + // encode_slice(phase, writer)?; + // } opened_values.quotient.len().encode(writer)?; for per_air in &opened_values.quotient { per_air.len().encode(writer)?; @@ -260,6 +267,12 @@ impl Encode for Option> { } } +impl Encode for Option, F>> { + fn encode(&self, writer: &mut W) -> Result<()> { + todo!() + } +} + impl Encode for Challenge { fn encode(&self, writer: &mut W) -> Result<()> { let base_slice: &[F] = self.as_base_slice(); @@ -392,7 +405,7 @@ impl Decode for Proof { } // Decode logup witness - let rap_phase_seq_proof = Option::>::decode(reader)?; + let rap_phase_seq_proof = Option::>::decode(reader)?; Ok(Proof { commitments, @@ -443,6 +456,13 @@ fn decode_opened_values(reader: &mut R) -> Result(reader: &mut R) -> Result> { } } +impl Decode for Option, F>> { + fn decode(reader: &mut R) -> Result { + todo!() + } +} + impl Decode for Challenge { fn decode(reader: &mut R) -> Result { // For a BinomialExtensionField, we need to read 4 F elements From 2958db1cb85d11811647e37f62ce52fc62c01605 Mon Sep 17 00:00:00 2001 From: Zach Langley Date: Thu, 10 Apr 2025 09:59:58 -0400 Subject: [PATCH 25/25] update prof --- Cargo.lock | 4 ++-- Cargo.toml | 4 ++-- crates/prof/src/aggregate.rs | 5 +++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3d362175c2..44bf4d329b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4321,7 +4321,7 @@ dependencies = [ [[package]] name = "openvm-stark-backend" version = "1.0.0" -source = "git+https://github.com/openvm-org/stark-backend.git?rev=b4ce9e23c2e5f4d2ac186093c9078a3582aac79d#b4ce9e23c2e5f4d2ac186093c9078a3582aac79d" +source = "git+https://github.com/openvm-org/stark-backend.git?rev=93c0a91f3f17a21ee090d0578d45d6687fcdfc98#93c0a91f3f17a21ee090d0578d45d6687fcdfc98" dependencies = [ "bitcode", "cfg-if", @@ -4349,7 +4349,7 @@ dependencies = [ [[package]] name = "openvm-stark-sdk" version = "1.0.0" -source = "git+https://github.com/openvm-org/stark-backend.git?rev=b4ce9e23c2e5f4d2ac186093c9078a3582aac79d#b4ce9e23c2e5f4d2ac186093c9078a3582aac79d" +source = "git+https://github.com/openvm-org/stark-backend.git?rev=93c0a91f3f17a21ee090d0578d45d6687fcdfc98#93c0a91f3f17a21ee090d0578d45d6687fcdfc98" dependencies = [ "derivative", "derive_more 0.99.19", diff --git a/Cargo.toml b/Cargo.toml index 2f003d9df8..65010cbe8f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -107,8 +107,8 @@ lto = "thin" [workspace.dependencies] # Stark Backend -openvm-stark-backend = { git = "https://github.com/openvm-org/stark-backend.git", rev = "b4ce9e23c2e5f4d2ac186093c9078a3582aac79d", default-features = false } -openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", rev = "b4ce9e23c2e5f4d2ac186093c9078a3582aac79d", default-features = false } +openvm-stark-backend = { git = "https://github.com/openvm-org/stark-backend.git", rev = "93c0a91f3f17a21ee090d0578d45d6687fcdfc98", default-features = false } +openvm-stark-sdk = { git = "https://github.com/openvm-org/stark-backend.git", rev = "93c0a91f3f17a21ee090d0578d45d6687fcdfc98", default-features = false } # OpenVM openvm-sdk = { path = "crates/sdk", default-features = false } diff --git a/crates/prof/src/aggregate.rs b/crates/prof/src/aggregate.rs index 9d669870f2..0fac284343 100644 --- a/crates/prof/src/aggregate.rs +++ b/crates/prof/src/aggregate.rs @@ -381,4 +381,9 @@ pub const VM_METRIC_NAMES: &[&str] = &[ "quotient_poly_compute_time_ms", "quotient_poly_commit_time_ms", "pcs_opening_time_ms", + "sumcheck_prove_batch_ms", + "gkr_prove_batch_ms", + "gkr_gen_layers_ms", + "gkr_generate_aux", + "gkr_build_instances_ms", ];