From e8e590fb0b1a8fe702528edbe436d44f81860481 Mon Sep 17 00:00:00 2001 From: Kolezhniuk Date: Tue, 31 Mar 2026 21:08:59 +0700 Subject: [PATCH 1/7] feat: add threadman worker for Node.js multi-threading support - Introduced `threadman_worker.js` to handle worker tasks using workerpool. - Updated `utils.js` to remove unnecessary global BigInt comment. - Refactored algebra tests to use Vitest framework, improving test structure and readability. - Converted all test files to use Vitest for assertions and lifecycle methods. - Added Vite configuration for building both Node.js and browser-compatible versions. - Implemented clean-up plugin in Vite to remove stale build artifacts before each build. - Enhanced test cases for various fields (Zq, Rat, Scalar) to ensure correctness and consistency. --- .eslintrc.cjs | 30 - .github/workflows/ci.yml | 27 +- build/browser.esm.js | 18516 ---------------------------- build/browser/browser.esm.js | 6505 ++++++++++ build/browser/browser.iife.js | 138 + build/browser/browser.iife.js.map | 1 + build/main.cjs | 10413 +++++++--------- build/threadman_thread.cjs | 153 + build/threadman_worker.cjs | 22 + eslint.config.js | 33 + package-lock.json | 2627 ++-- package.json | 52 +- rollup.browser.esm.config.js | 42 - rollup.cjs.config.js | 16 - src/bn128.js | 4 +- src/engine_fft.js | 15 +- src/engine_multiexp.js | 79 +- src/f1field.js | 1 - src/polfield.js | 2 +- src/random.js | 21 +- src/scalar.js | 1 - src/threadman.browser.js | 30 + src/threadman.js | 309 +- src/threadman.node.js | 28 + src/threadman_thread.js | 224 +- src/threadman_worker.js | 24 + src/utils.js | 1 - test/algebra.js | 81 +- test/bn128.js | 96 +- test/pols.js | 5 +- test/ratzqfield.js | 50 +- test/scalar.js | 7 +- test/sqrt.js | 23 +- test/utils.js | 13 +- test/zqfield.js | 3 +- vite.config.js | 296 + 36 files changed, 13362 insertions(+), 26526 deletions(-) delete mode 100644 .eslintrc.cjs delete mode 100644 build/browser.esm.js create mode 100644 build/browser/browser.esm.js create mode 100644 build/browser/browser.iife.js create mode 100644 build/browser/browser.iife.js.map create mode 100644 build/threadman_thread.cjs create mode 100644 build/threadman_worker.cjs create mode 100644 eslint.config.js delete mode 100644 rollup.browser.esm.config.js delete mode 100644 rollup.cjs.config.js create mode 100644 src/threadman.browser.js create mode 100644 src/threadman.node.js create mode 100644 src/threadman_worker.js create mode 100644 vite.config.js diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index 7b1de4e..0000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - "env": { - "es6": true, - "node": true, - "mocha": true - }, - "parserOptions": { - "ecmaVersion": 2020, - "sourceType": "module" - }, - "extends": "eslint:recommended", - "rules": { - "indent": [ - "error", - 4 - ], - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "double" - ], - "semi": [ - "error", - "always" - ] - } -}; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 113cdbf..79054ce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,34 +1,27 @@ name: Continuous Integration -on: - push: - branches: - - master - pull_request: +on: [push, pull_request] jobs: test: name: Test - runs-on: ${{ matrix.os }} - - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest, windows-latest] - node-version: [lts/*, lts/-1, lts/-2] + timeout-minutes: 15 + runs-on: ubuntu-latest steps: - name: Checkout project - uses: actions/checkout@v2 + uses: actions/checkout@v6 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v6 with: - node-version: ${{ matrix.node-version }} - check-latest: true - cache: 'npm' + node-version: "lts/*" + cache: "npm" - name: Install dependencies run: npm ci + - name: Install Playwright dependencies + run: npx playwright install + - name: Run tests run: npm test diff --git a/build/browser.esm.js b/build/browser.esm.js deleted file mode 100644 index 92aa0d0..0000000 --- a/build/browser.esm.js +++ /dev/null @@ -1,18516 +0,0 @@ -/* global BigInt */ -const hexLen = [ 0, 1, 2, 2, 3, 3, 3, 3, 4 ,4 ,4 ,4 ,4 ,4 ,4 ,4]; - -function fromString(s, radix) { - if ((!radix)||(radix==10)) { - return BigInt(s); - } else if (radix==16) { - if (s.slice(0,2) == "0x") { - return BigInt(s); - } else { - return BigInt("0x"+s); - } - } -} - -const e = fromString; - -function fromArray(a, radix) { - let acc =BigInt(0); - radix = BigInt(radix); - for (let i=0; i> BigInt(n); -} - -const shl = shiftLeft; -const shr = shiftRight; - -function isOdd$5(a) { - return (BigInt(a) & BigInt(1)) == BigInt(1); -} - - -function naf(n) { - let E = BigInt(n); - const res = []; - while (E) { - if (E & BigInt(1)) { - const z = 2 - Number(E % BigInt(4)); - res.push( z ); - E = E - BigInt(z); - } else { - res.push( 0 ); - } - E = E >> BigInt(1); - } - return res; -} - - -function bits(n) { - let E = BigInt(n); - const res = []; - while (E) { - if (E & BigInt(1)) { - res.push(1); - } else { - res.push( 0 ); - } - E = E >> BigInt(1); - } - return res; -} - -function toNumber$1(s) { - if (s>BigInt(Number.MAX_SAFE_INTEGER )) { - throw new Error("Number too big"); - } - return Number(s); -} - -function toArray(s, radix) { - const res = []; - let rem = BigInt(s); - radix = BigInt(radix); - while (rem) { - res.unshift( Number(rem % radix)); - rem = rem / radix; - } - return res; -} - - -function add(a, b) { - return BigInt(a) + BigInt(b); -} - -function sub(a, b) { - return BigInt(a) - BigInt(b); -} - -function neg(a) { - return -BigInt(a); -} - -function mul(a, b) { - return BigInt(a) * BigInt(b); -} - -function square$2(a) { - return BigInt(a) * BigInt(a); -} - -function pow(a, b) { - return BigInt(a) ** BigInt(b); -} - -function exp$1(a, b) { - return BigInt(a) ** BigInt(b); -} - -function abs$1(a) { - return BigInt(a) >= 0 ? BigInt(a) : -BigInt(a); -} - -function div(a, b) { - return BigInt(a) / BigInt(b); -} - -function mod(a, b) { - return BigInt(a) % BigInt(b); -} - -function eq(a, b) { - return BigInt(a) == BigInt(b); -} - -function neq(a, b) { - return BigInt(a) != BigInt(b); -} - -function lt(a, b) { - return BigInt(a) < BigInt(b); -} - -function gt(a, b) { - return BigInt(a) > BigInt(b); -} - -function leq(a, b) { - return BigInt(a) <= BigInt(b); -} - -function geq(a, b) { - return BigInt(a) >= BigInt(b); -} - -function band(a, b) { - return BigInt(a) & BigInt(b); -} - -function bor(a, b) { - return BigInt(a) | BigInt(b); -} - -function bxor(a, b) { - return BigInt(a) ^ BigInt(b); -} - -function land(a, b) { - return BigInt(a) && BigInt(b); -} - -function lor(a, b) { - return BigInt(a) || BigInt(b); -} - -function lnot(a) { - return !BigInt(a); -} - -// Returns a buffer with Little Endian Representation -function toRprLE(buff, o, e, n8) { - const s = "0000000" + e.toString(16); - const v = new Uint32Array(buff.buffer, buff.byteOffset + o, n8/4); - const l = (((s.length-7)*4 - 1) >> 5)+1; // Number of 32bit words; - for (let i=0; i> 5)+1; // Number of 32bit words; - for (let i=0; i a[a.length-i-1] = ch.toString(16).padStart(8,"0") ); - return fromString(a.join(""), 16); -} - -// Pases a buffer with Big Endian Representation -function fromRprBE(buff, o, n8) { - n8 = n8 || buff.byteLength; - o = o || 0; - const v = new DataView(buff.buffer, buff.byteOffset + o, n8); - const a = new Array(n8/4); - for (let i=0; i. -*/ - -/* - This library does operations on polynomials with coefficients in a field F. - - A polynomial P(x) = p0 + p1 * x + p2 * x^2 + ... + pn * x^n is represented - by the array [ p0, p1, p2, ... , pn ]. - */ - -class PolField { - constructor (F) { - this.F = F; - - let rem = F.sqrt_t; - let s = F.sqrt_s; - - const five = this.F.add(this.F.add(this.F.two, this.F.two), this.F.one); - - this.w = new Array(s+1); - this.wi = new Array(s+1); - this.w[s] = this.F.pow(five, rem); - this.wi[s] = this.F.inv(this.w[s]); - - let n=s-1; - while (n>=0) { - this.w[n] = this.F.square(this.w[n+1]); - this.wi[n] = this.F.square(this.wi[n+1]); - n--; - } - - - this.roots = []; -/* for (let i=0; i<16; i++) { - let r = this.F.one; - n = 1 << i; - const rootsi = new Array(n); - for (let j=0; j this.F.sqrt_s) n = this.s; - for (let i=n; (i>=0) && (!this.roots[i]); i--) { - let r = this.F.one; - const nroots = 1 << i; - const rootsi = new Array(nroots); - for (let j=0; j a.length) { - [b, a] = [a, b]; - } - - if ((b.length <= 2) || (b.length < log2$2(a.length))) { - return this.mulNormal(a,b); - } else { - return this.mulFFT(a,b); - } - } - - mulNormal(a, b) { - let res = []; - for (let i=0; i0) { - const z = new Array(n).fill(this.F.zero); - return z.concat(p); - } else { - if (-n >= p.length) return []; - return p.slice(-n); - } - } - - eval2(p, x) { - let v = this.F.zero; - let ix = this.F.one; - for (let i=0; i> 1), - F.mul( - x, - _eval(p, newX, offset+step , step << 1, n >> 1))); - return res; - } - } - - lagrange(points) { - let roots = [this.F.one]; - for (let i=0; i> 1; - const p1 = this._fft(pall, bits-1, offset, step*2); - const p2 = this._fft(pall, bits-1, offset+step, step*2); - - const out = new Array(n); - - let m= this.F.one; - for (let i=0; i0 && this.F.eq(p[i], this.F.zero) ) i--; - return p.slice(0, i+1); - } - - eq(a, b) { - const pa = this.reduce(a); - const pb = this.reduce(b); - - if (pa.length != pb.length) return false; - for (let i=0; i=0; i--) { - res[i] = this.F.add(this.F.mul(res[i+1], r), p[i+1]); - } - return res; - } - - _next2Power(v) { - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - v++; - return v; - } - - toString(p) { - const ap = this.normalize(p); - let S = ""; - for (let i=ap.length-1; i>=0; i--) { - if (!this.F.eq(p[i], this.F.zero)) { - if (S!="") S += " + "; - S = S + p[i].toString(10); - if (i>0) { - S = S + "x"; - if (i>1) { - S = S + "^" +i; - } - } - } - } - return S; - } - - normalize(p) { - const res = new Array(p.length); - for (let i=0; i - // rec = x^(k-2-scaleV)/ v - // - // res = x^m/v = x^(m + (2*k-2 - scaleV) - (2*k-2 - scaleV)) /v => - // res = rec * x^(m - (2*k-2 - scaleV)) => - // res = rec * x^(m - 2*k + 2 + scaleV) - - const rec = this._reciprocal(this.scaleX(v, scaleV), kbits); - const res = this.scaleX(rec, m - 2*k + 2 + scaleV); - - return res; - } - - div(_u, _v) { - if (_u.length < _v.length) return []; - const kbits = log2$2(_v.length-1)+1; - const k = 1 << kbits; - - const u = this.scaleX(_u, k-_v.length); - const v = this.scaleX(_v, k-_v.length); - - const n = v.length-1; - let m = u.length-1; - - const s = this._reciprocal(v, kbits); - let t; - if (m>2*n) { - t = this.sub(this.scaleX([this.F.one], 2*n), this.mul(s, v)); - } - - let q = []; - let rem = u; - let us, ut; - let finish = false; - - while (!finish) { - us = this.mul(rem, s); - q = this.add(q, this.scaleX(us, -2*n)); - - if ( m > 2*n ) { - ut = this.mul(rem, t); - rem = this.scaleX(ut, -2*n); - m = rem.length-1; - } else { - finish = true; - } - } - - return q; - } - - - // returns the ith nth-root of one - oneRoot(n, i) { - let nbits = log2$2(n-1)+1; - let res = this.F.one; - let r = i; - - if(i>=n) { - throw new Error("Given 'i' should be lower than 'n'"); - } - else if (1<0) { - if (r & 1 == 1) { - res = this.F.mul(res, this.w[nbits]); - } - r = r >> 1; - nbits --; - } - return res; - } - - computeVanishingPolinomial(bits, t) { - const m = 1 << bits; - return this.F.sub(this.F.pow(t, m), this.F.one); - } - - evaluateLagrangePolynomials(bits, t) { - const m= 1 << bits; - const tm = this.F.pow(t, m); - const u= new Array(m).fill(this.F.zero); - this._setRoots(bits); - const omega = this.w[bits]; - - if (this.F.eq(tm, this.F.one)) { - for (let i = 0; i < m; i++) { - if (this.F.eq(this.roots[bits][0],t)) { // i.e., t equals omega^i - u[i] = this.F.one; - return u; - } - } - } - - const z = this.F.sub(tm, this.F.one); - // let l = this.F.mul(z, this.F.pow(this.F.twoinv, m)); - let l = this.F.mul(z, this.F.inv(this.F.e(m))); - for (let i = 0; i < m; i++) { - u[i] = this.F.mul(l, this.F.inv(this.F.sub(t,this.roots[bits][i]))); - l = this.F.mul(l, omega); - } - - return u; - } - - log2(V) { - return log2$2(V); - } -} - -function log2$2( V ) -{ - return( ( ( V & 0xFFFF0000 ) !== 0 ? ( V &= 0xFFFF0000, 16 ) : 0 ) | ( ( V & 0xFF00FF00 ) !== 0 ? ( V &= 0xFF00FF00, 8 ) : 0 ) | ( ( V & 0xF0F0F0F0 ) !== 0 ? ( V &= 0xF0F0F0F0, 4 ) : 0 ) | ( ( V & 0xCCCCCCCC ) !== 0 ? ( V &= 0xCCCCCCCC, 2 ) : 0 ) | ( ( V & 0xAAAAAAAA ) !== 0 ) ); -} - - -function __fft$1(PF, pall, bits, offset, step) { - - const n = 1 << bits; - if (n==1) { - return [ pall[offset] ]; - } else if (n==2) { - return [ - PF.F.add(pall[offset], pall[offset + step]), - PF.F.sub(pall[offset], pall[offset + step])]; - } - - const ndiv2 = n >> 1; - const p1 = __fft$1(PF, pall, bits-1, offset, step*2); - const p2 = __fft$1(PF, pall, bits-1, offset+step, step*2); - - const out = new Array(n); - - for (let i=0; i> 1; - const p1 = __fft2(PF, pall.slice(0, ndiv2), bits-1); - const p2 = __fft2(PF, pall.slice(ndiv2), bits-1); - - const out = new Array(n); - - for (let i=0; i>=1; - } - return res; -} - -function rev(idx, bits) { - return ( - _revTable$1[idx >>> 24] | - (_revTable$1[(idx >>> 16) & 0xFF] << 8) | - (_revTable$1[(idx >>> 8) & 0xFF] << 16) | - (_revTable$1[idx & 0xFF] << 24) - ) >>> (32-bits); -} - -function __bitReverse(p, bits) { - for (let k=0; kk) { - const tmp= p[k]; - p[k] = p[r]; - p[r] = tmp; - } - } - -} - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - - - -function mulScalar(F, base, e) { - let res; - - if (isZero$1(e)) return F.zero; - - const n = naf(e); - - if (n[n.length-1] == 1) { - res = base; - } else if (n[n.length-1] == -1) { - res = F.neg(base); - } else { - throw new Error("invlaud NAF"); - } - - for (let i=n.length-2; i>=0; i--) { - - res = F.double(res); - - if (n[i] == 1) { - res = F.add(res, base); - } else if (n[i] == -1) { - res = F.sub(res, base); - } - } - - return res; -} - - -/* -exports.mulScalar = (F, base, e) =>{ - let res = F.zero; - let rem = bigInt(e); - let exp = base; - - while (! rem.eq(bigInt.zero)) { - if (rem.and(bigInt.one).eq(bigInt.one)) { - res = F.add(res, exp); - } - exp = F.double(exp); - rem = rem.shiftRight(1); - } - - return res; -}; -*/ - - -function exp(F, base, e) { - - if (isZero$1(e)) return F.one; - - const n = bits(e); - - if (n.length==0) return F.one; - - let res = base; - - for (let i=n.length-2; i>=0; i--) { - - res = F.square(res); - - if (n[i]) { - res = F.mul(res, base); - } - } - - return res; -} - -// Check here: https://eprint.iacr.org/2012/685.pdf - -function buildSqrt (F) { - if ((F.m % 2) == 1) { - if (eq(mod(F.p, 4), 1 )) { - if (eq(mod(F.p, 8), 1 )) { - if (eq(mod(F.p, 16), 1 )) { - // alg7_muller(F); - alg5_tonelliShanks(F); - } else if (eq(mod(F.p, 16), 9 )) { - alg4_kong(F); - } else { - throw new Error("Field withot sqrt"); - } - } else if (eq(mod(F.p, 8), 5 )) { - alg3_atkin(F); - } else { - throw new Error("Field withot sqrt"); - } - } else if (eq(mod(F.p, 4), 3 )) { - alg2_shanks(F); - } - } else { - const pm2mod4 = mod(pow(F.p, F.m/2), 4); - if (pm2mod4 == 1) { - alg10_adj(F); - } else if (pm2mod4 == 3) { - alg9_adj(F); - } else { - alg8_complex(F); - } - - } -} - - -function alg5_tonelliShanks(F) { - F.sqrt_q = pow(F.p, F.m); - - F.sqrt_s = 0; - F.sqrt_t = sub(F.sqrt_q, 1); - - while (!isOdd$5(F.sqrt_t)) { - F.sqrt_s = F.sqrt_s + 1; - F.sqrt_t = div(F.sqrt_t, 2); - } - - let c0 = F.one; - - while (F.eq(c0, F.one)) { - const c = F.random(); - F.sqrt_z = F.pow(c, F.sqrt_t); - c0 = F.pow(F.sqrt_z, 2 ** (F.sqrt_s-1) ); - } - - F.sqrt_tm1d2 = div(sub(F.sqrt_t, 1),2); - - F.sqrt = function(a) { - const F=this; - if (F.isZero(a)) return F.zero; - let w = F.pow(a, F.sqrt_tm1d2); - const a0 = F.pow( F.mul(F.square(w), a), 2 ** (F.sqrt_s-1) ); - if (F.eq(a0, F.negone)) return null; - - let v = F.sqrt_s; - let x = F.mul(a, w); - let b = F.mul(x, w); - let z = F.sqrt_z; - while (!F.eq(b, F.one)) { - let b2k = F.square(b); - let k=1; - while (!F.eq(b2k, F.one)) { - b2k = F.square(b2k); - k++; - } - - w = z; - for (let i=0; i>> 0; - st[d] = (st[d] ^ st[a]) >>> 0; - st[d] = ((st[d] << 16) | ((st[d]>>>16) & 0xFFFF)) >>> 0; - - st[c] = (st[c] + st[d]) >>> 0; - st[b] = (st[b] ^ st[c]) >>> 0; - st[b] = ((st[b] << 12) | ((st[b]>>>20) & 0xFFF)) >>> 0; - - st[a] = (st[a] + st[b]) >>> 0; - st[d] = (st[d] ^ st[a]) >>> 0; - st[d] = ((st[d] << 8) | ((st[d]>>>24) & 0xFF)) >>> 0; - - st[c] = (st[c] + st[d]) >>> 0; - st[b] = (st[b] ^ st[c]) >>> 0; - st[b] = ((st[b] << 7) | ((st[b]>>>25) & 0x7F)) >>> 0; -} - -function doubleRound(st) { - quarterRound(st, 0, 4, 8,12); - quarterRound(st, 1, 5, 9,13); - quarterRound(st, 2, 6,10,14); - quarterRound(st, 3, 7,11,15); - - quarterRound(st, 0, 5,10,15); - quarterRound(st, 1, 6,11,12); - quarterRound(st, 2, 7, 8,13); - quarterRound(st, 3, 4, 9,14); -} - -class ChaCha { - - constructor(seed) { - seed = seed || [0,0,0,0,0,0,0,0]; - this.state = [ - 0x61707865, - 0x3320646E, - 0x79622D32, - 0x6B206574, - seed[0], - seed[1], - seed[2], - seed[3], - seed[4], - seed[5], - seed[6], - seed[7], - 0, - 0, - 0, - 0 - ]; - this.idx = 16; - this.buff = new Array(16); - } - - nextU32() { - if (this.idx == 16) this.update(); - return this.buff[this.idx++]; - } - - nextU64() { - return add(mul(this.nextU32(), 0x100000000), this.nextU32()); - } - - nextBool() { - return (this.nextU32() & 1) == 1; - } - - update() { - // Copy the state - for (let i=0; i<16; i++) this.buff[i] = this.state[i]; - - // Apply the rounds - for (let i=0; i<10; i++) doubleRound(this.buff); - - // Add to the initial - for (let i=0; i<16; i++) this.buff[i] = (this.buff[i] + this.state[i]) >>> 0; - - this.idx = 0; - - this.state[12] = (this.state[12] + 1) >>> 0; - if (this.state[12] != 0) return; - this.state[13] = (this.state[13] + 1) >>> 0; - if (this.state[13] != 0) return; - this.state[14] = (this.state[14] + 1) >>> 0; - if (this.state[14] != 0) return; - this.state[15] = (this.state[15] + 1) >>> 0; - } -} - -function getRandomBytes(n) { - let array = new Uint8Array(n); - { // Browser - if (typeof globalThis.crypto !== "undefined") { // Supported - globalThis.crypto.getRandomValues(array); - } else { // fallback - for (let i=0; i>>0; - } - } - } - return array; -} - -function getRandomSeed() { - const arr = getRandomBytes(32); - const arrV = new Uint32Array(arr.buffer); - const seed = []; - for (let i=0; i<8; i++) { - seed.push(arrV[i]); - } - return seed; -} - -let threadRng = null; - -function getThreadRng() { - if (threadRng) return threadRng; - threadRng = new ChaCha(getRandomSeed()); - return threadRng; -} - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - -/* - This library does operations on polynomials with coefficients in a field F. - - A polynomial P(x) = p0 + p1 * x + p2 * x^2 + ... + pn * x^n is represented - by the array [ p0, p1, p2, ... , pn ]. - */ - -class FFT { - constructor (G, F, opMulGF) { - this.F = F; - this.G = G; - this.opMulGF = opMulGF; - - let rem = F.sqrt_t || F.t; - let s = F.sqrt_s || F.s; - - let nqr = F.one; - while (F.eq(F.pow(nqr, F.half), F.one)) nqr = F.add(nqr, F.one); - - this.w = new Array(s+1); - this.wi = new Array(s+1); - this.w[s] = this.F.pow(nqr, rem); - this.wi[s] = this.F.inv(this.w[s]); - - let n=s-1; - while (n>=0) { - this.w[n] = this.F.square(this.w[n+1]); - this.wi[n] = this.F.square(this.wi[n+1]); - n--; - } - - - this.roots = []; - /* - for (let i=0; i<16; i++) { - let r = this.F.one; - n = 1 << i; - const rootsi = new Array(n); - for (let j=0; j=0) && (!this.roots[i]); i--) { - let r = this.F.one; - const nroots = 1 << i; - const rootsi = new Array(nroots); - for (let j=0; j> 1; - const p1 = __fft(PF, pall, bits-1, offset, step*2); - const p2 = __fft(PF, pall, bits-1, offset+step, step*2); - - const out = new Array(n); - - for (let i=0; i> this.one; - this.bitLength = bitLength$6(this.p); - this.mask = (this.one << BigInt(this.bitLength)) - this.one; - - this.n64 = Math.floor((this.bitLength - 1) / 64)+1; - this.n32 = this.n64*2; - this.n8 = this.n64*8; - this.R = this.e(this.one << BigInt(this.n64*64)); - this.Ri = this.inv(this.R); - - const e = this.negone >> this.one; - this.nqr = this.two; - let r = this.pow(this.nqr, e); - while (!this.eq(r, this.negone)) { - this.nqr = this.nqr + this.one; - r = this.pow(this.nqr, e); - } - - - this.s = 0; - this.t = this.negone; - - while ((this.t & this.one) == this.zero) { - this.s = this.s + 1; - this.t = this.t >> this.one; - } - - this.nqr_to_t = this.pow(this.nqr, this.t); - - buildSqrt(this); - - this.FFT = new FFT(this, this, this.mul.bind(this)); - - this.fft = this.FFT.fft.bind(this.FFT); - this.ifft = this.FFT.ifft.bind(this.FFT); - this.w = this.FFT.w; - this.wi = this.FFT.wi; - - this.shift = this.square(this.nqr); - this.k = this.exp(this.nqr, 2**this.s); - } - - e(a,b) { - let res; - if (!b) { - res = BigInt(a); - } else if (b==16) { - res = BigInt("0x"+a); - } - if (res < 0) { - let nres = -res; - if (nres >= this.p) nres = nres % this.p; - return this.p - nres; - } else { - return (res>= this.p) ? res%this.p : res; - } - - } - - add(a, b) { - const res = a + b; - return res >= this.p ? res-this.p : res; - } - - sub(a, b) { - return (a >= b) ? a-b : this.p-b+a; - } - - neg(a) { - return a ? this.p-a : a; - } - - mul(a, b) { - return (a*b)%this.p; - } - - mulScalar(base, s) { - return (base * this.e(s)) % this.p; - } - - square(a) { - return (a*a) % this.p; - } - - eq(a, b) { - return a==b; - } - - neq(a, b) { - return a!=b; - } - - lt(a, b) { - const aa = (a > this.half) ? a - this.p : a; - const bb = (b > this.half) ? b - this.p : b; - return aa < bb; - } - - gt(a, b) { - const aa = (a > this.half) ? a - this.p : a; - const bb = (b > this.half) ? b - this.p : b; - return aa > bb; - } - - leq(a, b) { - const aa = (a > this.half) ? a - this.p : a; - const bb = (b > this.half) ? b - this.p : b; - return aa <= bb; - } - - geq(a, b) { - const aa = (a > this.half) ? a - this.p : a; - const bb = (b > this.half) ? b - this.p : b; - return aa >= bb; - } - - div(a, b) { - return this.mul(a, this.inv(b)); - } - - idiv(a, b) { - if (!b) throw new Error("Division by zero"); - return a / b; - } - - inv(a) { - if (!a) throw new Error("Division by zero"); - - let t = this.zero; - let r = this.p; - let newt = this.one; - let newr = a % this.p; - while (newr) { - let q = r/newr; - [t, newt] = [newt, t-q*newt]; - [r, newr] = [newr, r-q*newr]; - } - if (t= this.p ? res-this.p : res; - } - - bor(a, b) { - const res = ((a | b) & this.mask); - return res >= this.p ? res-this.p : res; - } - - bxor(a, b) { - const res = ((a ^ b) & this.mask); - return res >= this.p ? res-this.p : res; - } - - bnot(a) { - const res = a ^ this.mask; - return res >= this.p ? res-this.p : res; - } - - shl(a, b) { - if (Number(b) < this.bitLength) { - const res = (a << b) & this.mask; - return res >= this.p ? res-this.p : res; - } else { - const nb = this.p - b; - if (Number(nb) < this.bitLength) { - return a >> nb; - } else { - return this.zero; - } - } - } - - shr(a, b) { - if (Number(b) < this.bitLength) { - return a >> b; - } else { - const nb = this.p - b; - if (Number(nb) < this.bitLength) { - const res = (a << nb) & this.mask; - return res >= this.p ? res-this.p : res; - } else { - return 0; - } - } - } - - land(a, b) { - return (a && b) ? this.one : this.zero; - } - - lor(a, b) { - return (a || b) ? this.one : this.zero; - } - - lnot(a) { - return (a) ? this.zero : this.one; - } - - sqrt_old(n) { - - if (n == this.zero) return this.zero; - - // Test that have solution - const res = this.pow(n, this.negone >> this.one); - if ( res != this.one ) return null; - - let m = this.s; - let c = this.nqr_to_t; - let t = this.pow(n, this.t); - let r = this.pow(n, this.add(this.t, this.one) >> this.one ); - - while ( t != this.one ) { - let sq = this.square(t); - let i = 1; - while (sq != this.one ) { - i++; - sq = this.square(sq); - } - - // b = c ^ m-i-1 - let b = c; - for (let j=0; j< m-i-1; j ++) b = this.square(b); - - m = i; - c = this.square(b); - t = this.mul(t, c); - r = this.mul(r, b); - } - - if (r > (this.p >> this.one)) { - r = this.neg(r); - } - - return r; - } - - normalize(a, b) { - a = BigInt(a,b); - if (a < 0) { - let na = -a; - if (na >= this.p) na = na % this.p; - return this.p - na; - } else { - return (a>= this.p) ? a%this.p : a; - } - } - - random() { - const nBytes = (this.bitLength*2 / 8); - let res =this.zero; - for (let i=0; i this.half)&&(base == 10)) { - const v = this.p-a; - vs = "-"+v.toString(base); - } else { - vs = a.toString(base); - } - return vs; - } - - isZero(a) { - return a == this.zero; - } - - fromRng(rng) { - let v; - do { - v=this.zero; - for (let i=0; i= this.p); - v = (v * this.Ri) % this.p; // Convert from montgomery - return v; - } - - fft(a) { - return this.FFT.fft(a); - } - - ifft(a) { - return this.FFT.ifft(a); - } - - // Returns a buffer with Little Endian Representation - toRprLE(buff, o, e) { - toRprLE(buff, o, e, this.n64*8); - } - - // Returns a buffer with Big Endian Representation - toRprBE(buff, o, e) { - toRprBE(buff, o, e, this.n64*8); - } - - // Returns a buffer with Big Endian Montgomery Representation - toRprBEM(buff, o, e) { - return this.toRprBE(buff, o, this.mul(this.R, e)); - } - - toRprLEM(buff, o, e) { - return this.toRprLE(buff, o, this.mul(this.R, e)); - } - - - // Pases a buffer with Little Endian Representation - fromRprLE(buff, o) { - return fromRprLE(buff, o, this.n8); - } - - // Pases a buffer with Big Endian Representation - fromRprBE(buff, o) { - return fromRprBE(buff, o, this.n8); - } - - fromRprLEM(buff, o) { - return this.mul(this.fromRprLE(buff, o), this.Ri); - } - - fromRprBEM(buff, o) { - return this.mul(this.fromRprBE(buff, o), this.Ri); - } - - toObject(a) { - return a; - } -} - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - - -class F2Field { - constructor(F, nonResidue) { - this.type="F2"; - this.F = F; - this.zero = [this.F.zero, this.F.zero]; - this.one = [this.F.one, this.F.zero]; - this.negone = this.neg(this.one); - this.nonResidue = nonResidue; - this.m = F.m*2; - this.p = F.p; - this.n64 = F.n64*2; - this.n32 = this.n64*2; - this.n8 = this.n64*8; - - buildSqrt(this); - } - - _mulByNonResidue(a) { - return this.F.mul(this.nonResidue, a); - } - - copy(a) { - return [this.F.copy(a[0]), this.F.copy(a[1])]; - } - - add(a, b) { - return [ - this.F.add(a[0], b[0]), - this.F.add(a[1], b[1]) - ]; - } - - double(a) { - return this.add(a,a); - } - - sub(a, b) { - return [ - this.F.sub(a[0], b[0]), - this.F.sub(a[1], b[1]) - ]; - } - - neg(a) { - return this.sub(this.zero, a); - } - - conjugate(a) { - return [ - a[0], - this.F.neg(a[1]) - ]; - } - - mul(a, b) { - const aA = this.F.mul(a[0] , b[0]); - const bB = this.F.mul(a[1] , b[1]); - - return [ - this.F.add( aA , this._mulByNonResidue(bB)), - this.F.sub( - this.F.mul( - this.F.add(a[0], a[1]), - this.F.add(b[0], b[1])), - this.F.add(aA, bB))]; - } - - inv(a) { - const t0 = this.F.square(a[0]); - const t1 = this.F.square(a[1]); - const t2 = this.F.sub(t0, this._mulByNonResidue(t1)); - const t3 = this.F.inv(t2); - return [ - this.F.mul(a[0], t3), - this.F.neg(this.F.mul( a[1], t3)) ]; - } - - div(a, b) { - return this.mul(a, this.inv(b)); - } - - square(a) { - const ab = this.F.mul(a[0] , a[1]); - - /* - [ - (a + b) * (a + non_residue * b) - ab - non_residue * ab, - ab + ab - ]; - */ - - return [ - this.F.sub( - this.F.mul( - this.F.add(a[0], a[1]) , - this.F.add( - a[0] , - this._mulByNonResidue(a[1]))), - this.F.add( - ab, - this._mulByNonResidue(ab))), - this.F.add(ab, ab) - ]; - } - - isZero(a) { - return this.F.isZero(a[0]) && this.F.isZero(a[1]); - } - - eq(a, b) { - return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]); - } - - mulScalar(base, e) { - return mulScalar(this, base, e); - } - - pow(base, e) { - return exp(this, base, e); - } - - exp(base, e) { - return exp(this, base, e); - } - - toString(a) { - return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])} ]`; - } - - fromRng(rng) { - const c0 = this.F.fromRng(rng); - const c1 = this.F.fromRng(rng); - return [c0, c1]; - } - - gt(a, b) { - if (this.F.gt(a[0], b[0])) return true; - if (this.F.gt(b[0], a[0])) return false; - if (this.F.gt(a[1], b[1])) return true; - return false; - } - - geq(a, b) { - return this.gt(a, b) || this.eq(a, b); - } - - lt(a, b) { - return !this.geq(a,b); - } - - leq(a, b) { - return !this.gt(a,b); - } - - neq(a, b) { - return !this.eq(a,b); - } - - random() { - return [this.F.random(), this.F.random()]; - } - - - toRprLE(buff, o, e) { - this.F.toRprLE(buff, o, e[0]); - this.F.toRprLE(buff, o+this.F.n8, e[1]); - } - - toRprBE(buff, o, e) { - this.F.toRprBE(buff, o, e[1]); - this.F.toRprBE(buff, o+this.F.n8, e[0]); - } - - toRprLEM(buff, o, e) { - this.F.toRprLEM(buff, o, e[0]); - this.F.toRprLEM(buff, o+this.F.n8, e[1]); - } - - - toRprBEM(buff, o, e) { - this.F.toRprBEM(buff, o, e[1]); - this.F.toRprBEM(buff, o+this.F.n8, e[0]); - } - - fromRprLE(buff, o) { - o = o || 0; - const c0 = this.F.fromRprLE(buff, o); - const c1 = this.F.fromRprLE(buff, o+this.F.n8); - return [c0, c1]; - } - - fromRprBE(buff, o) { - o = o || 0; - const c1 = this.F.fromRprBE(buff, o); - const c0 = this.F.fromRprBE(buff, o+this.F.n8); - return [c0, c1]; - } - - fromRprLEM(buff, o) { - o = o || 0; - const c0 = this.F.fromRprLEM(buff, o); - const c1 = this.F.fromRprLEM(buff, o+this.F.n8); - return [c0, c1]; - } - - fromRprBEM(buff, o) { - o = o || 0; - const c1 = this.F.fromRprBEM(buff, o); - const c0 = this.F.fromRprBEM(buff, o+this.F.n8); - return [c0, c1]; - } - - toObject(a) { - return a; - } - -} - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - - -class F3Field { - constructor(F, nonResidue) { - this.type="F3"; - this.F = F; - this.zero = [this.F.zero, this.F.zero, this.F.zero]; - this.one = [this.F.one, this.F.zero, this.F.zero]; - this.negone = this.neg(this.one); - this.nonResidue = nonResidue; - this.m = F.m*3; - this.p = F.p; - this.n64 = F.n64*3; - this.n32 = this.n64*2; - this.n8 = this.n64*8; - } - - _mulByNonResidue(a) { - return this.F.mul(this.nonResidue, a); - } - - copy(a) { - return [this.F.copy(a[0]), this.F.copy(a[1]), this.F.copy(a[2])]; - } - - add(a, b) { - return [ - this.F.add(a[0], b[0]), - this.F.add(a[1], b[1]), - this.F.add(a[2], b[2]) - ]; - } - - double(a) { - return this.add(a,a); - } - - sub(a, b) { - return [ - this.F.sub(a[0], b[0]), - this.F.sub(a[1], b[1]), - this.F.sub(a[2], b[2]) - ]; - } - - neg(a) { - return this.sub(this.zero, a); - } - - mul(a, b) { - - const aA = this.F.mul(a[0] , b[0]); - const bB = this.F.mul(a[1] , b[1]); - const cC = this.F.mul(a[2] , b[2]); - - return [ - this.F.add( - aA, - this._mulByNonResidue( - this.F.sub( - this.F.mul( - this.F.add(a[1], a[2]), - this.F.add(b[1], b[2])), - this.F.add(bB, cC)))), // aA + non_residue*((b+c)*(B+C)-bB-cC), - - this.F.add( - this.F.sub( - this.F.mul( - this.F.add(a[0], a[1]), - this.F.add(b[0], b[1])), - this.F.add(aA, bB)), - this._mulByNonResidue( cC)), // (a+b)*(A+B)-aA-bB+non_residue*cC - - this.F.add( - this.F.sub( - this.F.mul( - this.F.add(a[0], a[2]), - this.F.add(b[0], b[2])), - this.F.add(aA, cC)), - bB)]; // (a+c)*(A+C)-aA+bB-cC) - } - - inv(a) { - const t0 = this.F.square(a[0]); // t0 = a^2 ; - const t1 = this.F.square(a[1]); // t1 = b^2 ; - const t2 = this.F.square(a[2]); // t2 = c^2; - const t3 = this.F.mul(a[0],a[1]); // t3 = ab - const t4 = this.F.mul(a[0],a[2]); // t4 = ac - const t5 = this.F.mul(a[1],a[2]); // t5 = bc; - // c0 = t0 - non_residue * t5; - const c0 = this.F.sub(t0, this._mulByNonResidue(t5)); - // c1 = non_residue * t2 - t3; - const c1 = this.F.sub(this._mulByNonResidue(t2), t3); - const c2 = this.F.sub(t1, t4); // c2 = t1-t4 - - // t6 = (a * c0 + non_residue * (c * c1 + b * c2)).inv(); - const t6 = - this.F.inv( - this.F.add( - this.F.mul(a[0], c0), - this._mulByNonResidue( - this.F.add( - this.F.mul(a[2], c1), - this.F.mul(a[1], c2))))); - - return [ - this.F.mul(t6, c0), // t6*c0 - this.F.mul(t6, c1), // t6*c1 - this.F.mul(t6, c2)]; // t6*c2 - } - - div(a, b) { - return this.mul(a, this.inv(b)); - } - - square(a) { - const s0 = this.F.square(a[0]); // s0 = a^2 - const ab = this.F.mul(a[0], a[1]); // ab = a*b - const s1 = this.F.add(ab, ab); // s1 = 2ab; - const s2 = this.F.square( - this.F.add(this.F.sub(a[0],a[1]), a[2])); // s2 = (a - b + c)^2; - const bc = this.F.mul(a[1],a[2]); // bc = b*c - const s3 = this.F.add(bc, bc); // s3 = 2*bc - const s4 = this.F.square(a[2]); // s4 = c^2 - - - return [ - this.F.add( - s0, - this._mulByNonResidue(s3)), // s0 + non_residue * s3, - this.F.add( - s1, - this._mulByNonResidue(s4)), // s1 + non_residue * s4, - this.F.sub( - this.F.add( this.F.add(s1, s2) , s3 ), - this.F.add(s0, s4))]; // s1 + s2 + s3 - s0 - s4 - } - - isZero(a) { - return this.F.isZero(a[0]) && this.F.isZero(a[1]) && this.F.isZero(a[2]); - } - - eq(a, b) { - return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]) && this.F.eq(a[2], b[2]); - } - - affine(a) { - return [this.F.affine(a[0]), this.F.affine(a[1]), this.F.affine(a[2])]; - } - - mulScalar(base, e) { - return mulScalar(this, base, e); - } - - pow(base, e) { - return exp(this, base, e); - } - - exp(base, e) { - return exp(this, base, e); - } - - toString(a) { - return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])}, ${this.F.toString(a[2])} ]`; - } - - fromRng(rng) { - const c0 = this.F.fromRng(rng); - const c1 = this.F.fromRng(rng); - const c2 = this.F.fromRng(rng); - return [c0, c1, c2]; - } - - gt(a, b) { - if (this.F.gt(a[0], b[0])) return true; - if (this.F.gt(b[0], a[0])) return false; - if (this.F.gt(a[1], b[1])) return true; - if (this.F.gt(b[1], a[1])) return false; - if (this.F.gt(a[2], b[2])) return true; - return false; - } - - - geq(a, b) { - return this.gt(a, b) || this.eq(a, b); - } - - lt(a, b) { - return !this.geq(a,b); - } - - leq(a, b) { - return !this.gt(a,b); - } - - neq(a, b) { - return !this.eq(a,b); - } - - random() { - return [this.F.random(), this.F.random(), this.F.random()]; - } - - - toRprLE(buff, o, e) { - this.F.toRprLE(buff, o, e[0]); - this.F.toRprLE(buff, o+this.F.n8, e[1]); - this.F.toRprLE(buff, o+this.F.n8*2, e[2]); - } - - toRprBE(buff, o, e) { - this.F.toRprBE(buff, o, e[2]); - this.F.toRprBE(buff, o+this.F.n8, e[1]); - this.F.toRprBE(buff, o+this.F.n8*2, e[0]); - } - - toRprLEM(buff, o, e) { - this.F.toRprLEM(buff, o, e[0]); - this.F.toRprLEM(buff, o+this.F.n8, e[1]); - this.F.toRprLEM(buff, o+this.F.n8*2, e[2]); - } - - - toRprBEM(buff, o, e) { - this.F.toRprBEM(buff, o, e[2]); - this.F.toRprBEM(buff, o+this.F.n8, e[1]); - this.F.toRprBEM(buff, o+this.F.n8*2, e[0]); - } - - fromRprLE(buff, o) { - o = o || 0; - const c0 = this.F.fromRprLE(buff, o); - const c1 = this.F.fromRprLE(buff, o+this.n8); - const c2 = this.F.fromRprLE(buff, o+this.n8*2); - return [c0, c1, c2]; - } - - fromRprBE(buff, o) { - o = o || 0; - const c2 = this.F.fromRprBE(buff, o); - const c1 = this.F.fromRprBE(buff, o+this.n8); - const c0 = this.F.fromRprBE(buff, o+this.n8*2); - return [c0, c1, c2]; - } - - fromRprLEM(buff, o) { - o = o || 0; - const c0 = this.F.fromRprLEM(buff, o); - const c1 = this.F.fromRprLEM(buff, o+this.n8); - const c2 = this.F.fromRprLEM(buff, o+this.n8*2); - return [c0, c1, c2]; - } - - fromRprBEM(buff, o) { - o = o || 0; - const c2 = this.F.fromRprBEM(buff, o); - const c1 = this.F.fromRprBEM(buff, o+this.n8); - const c0 = this.F.fromRprBEM(buff, o+this.n8*2); - return [c0, c1, c2]; - } - - toObject(a) { - return a; - } -} - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - - - -function isGreatest(F, a) { - if (Array.isArray(a)) { - for (let i=a.length-1; i>=0; i--) { - if (!F.F.isZero(a[i])) { - return isGreatest(F.F, a[i]); - } - } - return 0; - } else { - const na = F.neg(a); - return gt(a, na); - } -} - - -class EC { - - constructor(F, g) { - this.F = F; - this.g = g; - if (this.g.length == 2) this.g[2] = this.F.one; - this.zero = [this.F.zero, this.F.one, this.F.zero]; - } - - add(p1, p2) { - - const F = this.F; - - if (this.eq(p1, this.zero)) return p2; - if (this.eq(p2, this.zero)) return p1; - - const res = new Array(3); - - const Z1Z1 = F.square( p1[2] ); - const Z2Z2 = F.square( p2[2] ); - - const U1 = F.mul( p1[0] , Z2Z2 ); // U1 = X1 * Z2Z2 - const U2 = F.mul( p2[0] , Z1Z1 ); // U2 = X2 * Z1Z1 - - const Z1_cubed = F.mul( p1[2] , Z1Z1); - const Z2_cubed = F.mul( p2[2] , Z2Z2); - - const S1 = F.mul( p1[1] , Z2_cubed); // S1 = Y1 * Z2 * Z2Z2 - const S2 = F.mul( p2[1] , Z1_cubed); // S2 = Y2 * Z1 * Z1Z1 - - if (F.eq(U1,U2) && F.eq(S1,S2)) { - return this.double(p1); - } - - const H = F.sub( U2 , U1 ); // H = U2-U1 - - const S2_minus_S1 = F.sub( S2 , S1 ); - - const I = F.square( F.add(H,H) ); // I = (2 * H)^2 - const J = F.mul( H , I ); // J = H * I - - const r = F.add( S2_minus_S1 , S2_minus_S1 ); // r = 2 * (S2-S1) - const V = F.mul( U1 , I ); // V = U1 * I - - res[0] = - F.sub( - F.sub( F.square(r) , J ), - F.add( V , V )); // X3 = r^2 - J - 2 * V - - const S1_J = F.mul( S1 , J ); - - res[1] = - F.sub( - F.mul( r , F.sub(V,res[0])), - F.add( S1_J,S1_J )); // Y3 = r * (V-X3)-2 S1 J - - res[2] = - F.mul( - H, - F.sub( - F.square( F.add(p1[2],p2[2]) ), - F.add( Z1Z1 , Z2Z2 ))); // Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2) * H - - return res; - } - - neg(p) { - return [p[0], this.F.neg(p[1]), p[2]]; - } - - sub(a, b) { - return this.add(a, this.neg(b)); - } - - double(p) { - const F = this.F; - - const res = new Array(3); - - if (this.eq(p, this.zero)) return p; - - const A = F.square( p[0] ); // A = X1^2 - const B = F.square( p[1] ); // B = Y1^2 - const C = F.square( B ); // C = B^2 - - let D = - F.sub( - F.square( F.add(p[0] , B )), - F.add( A , C)); - D = F.add(D,D); // D = 2 * ((X1 + B)^2 - A - C) - - const E = F.add( F.add(A,A), A); // E = 3 * A - const FF =F.square( E ); // F = E^2 - - res[0] = F.sub( FF , F.add(D,D) ); // X3 = F - 2 D - - let eightC = F.add( C , C ); - eightC = F.add( eightC , eightC ); - eightC = F.add( eightC , eightC ); - - res[1] = - F.sub( - F.mul( - E, - F.sub( D, res[0] )), - eightC); // Y3 = E * (D - X3) - 8 * C - - const Y1Z1 = F.mul( p[1] , p[2] ); - res[2] = F.add( Y1Z1 , Y1Z1 ); // Z3 = 2 * Y1 * Z1 - - return res; - } - - timesScalar(base, e) { - return mulScalar(this, base, e); - } - - mulScalar(base, e) { - return mulScalar(this, base, e); - } - - affine(p) { - const F = this.F; - if (this.isZero(p)) { - return this.zero; - } else if (F.eq(p[2], F.one)) { - return p; - } else { - const Z_inv = F.inv(p[2]); - const Z2_inv = F.square(Z_inv); - const Z3_inv = F.mul(Z2_inv, Z_inv); - - const res = new Array(3); - res[0] = F.mul(p[0],Z2_inv); - res[1] = F.mul(p[1],Z3_inv); - res[2] = F.one; - - return res; - } - } - - multiAffine(arr) { - const keys = Object.keys(arr); - const F = this.F; - const accMul = new Array(keys.length+1); - accMul[0] = F.one; - for (let i = 0; i< keys.length; i++) { - if (F.eq(arr[keys[i]][2], F.zero)) { - accMul[i+1] = accMul[i]; - } else { - accMul[i+1] = F.mul(accMul[i], arr[keys[i]][2]); - } - } - - accMul[keys.length] = F.inv(accMul[keys.length]); - - for (let i = keys.length-1; i>=0; i--) { - if (F.eq(arr[keys[i]][2], F.zero)) { - accMul[i] = accMul[i+1]; - arr[keys[i]] = this.zero; - } else { - const Z_inv = F.mul(accMul[i], accMul[i+1]); - accMul[i] = F.mul(arr[keys[i]][2], accMul[i+1]); - - const Z2_inv = F.square(Z_inv); - const Z3_inv = F.mul(Z2_inv, Z_inv); - - arr[keys[i]][0] = F.mul(arr[keys[i]][0],Z2_inv); - arr[keys[i]][1] = F.mul(arr[keys[i]][1],Z3_inv); - arr[keys[i]][2] = F.one; - } - } - - } - - eq(p1, p2) { - const F = this.F; - - if (this.F.eq(p1[2], this.F.zero)) return this.F.eq(p2[2], this.F.zero); - if (this.F.eq(p2[2], this.F.zero)) return false; - - const Z1Z1 = F.square( p1[2] ); - const Z2Z2 = F.square( p2[2] ); - - const U1 = F.mul( p1[0] , Z2Z2 ); - const U2 = F.mul( p2[0] , Z1Z1 ); - - const Z1_cubed = F.mul( p1[2] , Z1Z1); - const Z2_cubed = F.mul( p2[2] , Z2Z2); - - const S1 = F.mul( p1[1] , Z2_cubed); - const S2 = F.mul( p2[1] , Z1_cubed); - - return (F.eq(U1,U2) && F.eq(S1,S2)); - } - - isZero(p) { - return this.F.isZero(p[2]); - } - - toString(p) { - const cp = this.affine(p); - return `[ ${this.F.toString(cp[0])} , ${this.F.toString(cp[1])} ]`; - } - - fromRng(rng) { - const F = this.F; - let P = []; - let greatest; - do { - P[0] = F.fromRng(rng); - greatest = rng.nextBool(); - const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); - P[1] = F.sqrt(x3b); - } while ((P[1] == null)||(F.isZero[P])); - - const s = isGreatest(F, P[1]); - if (greatest ^ s) P[1] = F.neg(P[1]); - P[2] = F.one; - - if (this.cofactor) { - P = this.mulScalar(P, this.cofactor); - } - - P = this.affine(P); - - return P; - - } - - toRprLE(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprLE(buff, o, p[0]); - this.F.toRprLE(buff, o+this.F.n8, p[1]); - } - - toRprBE(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprBE(buff, o, p[0]); - this.F.toRprBE(buff, o+this.F.n8, p[1]); - } - - toRprLEM(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprLEM(buff, o, p[0]); - this.F.toRprLEM(buff, o+this.F.n8, p[1]); - } - - toRprLEJM(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprLEM(buff, o, p[0]); - this.F.toRprLEM(buff, o+this.F.n8, p[1]); - this.F.toRprLEM(buff, o+2*this.F.n8, p[2]); - } - - - toRprBEM(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprBEM(buff, o, p[0]); - this.F.toRprBEM(buff, o+this.F.n8, p[1]); - } - - fromRprLE(buff, o) { - o = o || 0; - const x = this.F.fromRprLE(buff, o); - const y = this.F.fromRprLE(buff, o+this.F.n8); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, this.F.one]; - } - - fromRprBE(buff, o) { - o = o || 0; - const x = this.F.fromRprBE(buff, o); - const y = this.F.fromRprBE(buff, o+this.F.n8); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, this.F.one]; - } - - fromRprLEM(buff, o) { - o = o || 0; - const x = this.F.fromRprLEM(buff, o); - const y = this.F.fromRprLEM(buff, o+this.F.n8); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, this.F.one]; - } - - fromRprLEJM(buff, o) { - o = o || 0; - const x = this.F.fromRprLEM(buff, o); - const y = this.F.fromRprLEM(buff, o+this.F.n8); - const z = this.F.fromRprLEM(buff, o+this.F.n8*2); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, z]; - } - - fromRprBEM(buff, o) { - o = o || 0; - const x = this.F.fromRprBEM(buff, o); - const y = this.F.fromRprBEM(buff, o+this.F.n8); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, this.F.one]; - } - - fromRprCompressed(buff, o) { - const F = this.F; - const v = new Uint8Array(buff.buffer, o, F.n8); - if (v[0] & 0x40) return this.zero; - const P = new Array(3); - - const greatest = ((v[0] & 0x80) != 0); - v[0] = v[0] & 0x7F; - P[0] = F.fromRprBE(buff, o); - if (greatest) v[0] = v[0] | 0x80; // set back again the old value - - const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); - P[1] = F.sqrt(x3b); - - if (P[1] === null) { - throw new Error("Invalid Point!"); - } - - const s = isGreatest(F, P[1]); - if (greatest ^ s) P[1] = F.neg(P[1]); - P[2] = F.one; - - return P; - } - - toRprCompressed(buff, o, p) { - p = this.affine(p); - const v = new Uint8Array(buff.buffer, o, this.F.n8); - if (this.isZero(p)) { - v.fill(0); - v[0] = 0x40; - return; - } - this.F.toRprBE(buff, o, p[0]); - - if (isGreatest(this.F, p[1])) { - v[0] = v[0] | 0x80; - } - } - - - fromRprUncompressed(buff, o) { - if (buff[0] & 0x40) return this.zero; - - return this.fromRprBE(buff, o); - } - - toRprUncompressed(buff, o, p) { - this.toRprBE(buff, o, p); - - if (this.isZero(p)) { - buff[o] = buff[o] | 0x40; - } - } - - -} - -/* global BigInt */ - -function stringifyBigInts(o) { - if (typeof o == "bigint" || o.eq !== undefined) { - return o.toString(10); - } else if (o instanceof Uint8Array) { - return fromRprLE(o, 0); - } else if (Array.isArray(o)) { - return o.map(stringifyBigInts); - } else if (typeof o == "object") { - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = stringifyBigInts(o[k]); - }); - return res; - } else { - return o; - } -} - -function unstringifyBigInts(o) { - if (typeof o == "string" && /^[0-9]+$/.test(o)) { - return BigInt(o); - } else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) { - return BigInt(o); - } else if (Array.isArray(o)) { - return o.map(unstringifyBigInts); - } else if (typeof o == "object") { - if (o === null) return null; - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = unstringifyBigInts(o[k]); - }); - return res; - } else { - return o; - } -} - -function beBuff2int(buff) { - let res = BigInt(0); - let i = buff.length; - let offset = 0; - const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); - while (i > 0) { - if (i >= 4) { - i -= 4; - res += BigInt(buffV.getUint32(i)) << BigInt(offset * 8); - offset += 4; - } else if (i >= 2) { - i -= 2; - res += BigInt(buffV.getUint16(i)) << BigInt(offset * 8); - offset += 2; - } else { - i -= 1; - res += BigInt(buffV.getUint8(i)) << BigInt(offset * 8); - offset += 1; - } - } - return res; -} - -function beInt2Buff(n, len) { - let r = n; - const buff = new Uint8Array(len); - const buffV = new DataView(buff.buffer); - let o = len; - while (o > 0) { - if (o - 4 >= 0) { - o -= 4; - buffV.setUint32(o, Number(r & BigInt(0xffffffff))); - r = r >> BigInt(32); - } else if (o - 2 >= 0) { - o -= 2; - buffV.setUint16(o, Number(r & BigInt(0xffff))); - r = r >> BigInt(16); - } else { - o -= 1; - buffV.setUint8(o, Number(r & BigInt(0xff))); - r = r >> BigInt(8); - } - } - if (r) { - throw new Error("Number does not fit in this length"); - } - return buff; -} - -function leBuff2int(buff) { - let res = BigInt(0); - let i = 0; - const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); - while (i < buff.length) { - if (i + 4 <= buff.length) { - res += BigInt(buffV.getUint32(i, true)) << BigInt(i * 8); - i += 4; - } else if (i + 2 <= buff.length) { - res += BigInt(buffV.getUint16(i, true)) << BigInt(i * 8); - i += 2; - } else { - res += BigInt(buffV.getUint8(i, true)) << BigInt(i * 8); - i += 1; - } - } - return res; -} - -function leInt2Buff(n, len) { - let r = n; - if (typeof len === "undefined") { - len = Math.floor((bitLength$6(n) - 1) / 8) + 1; - if (len == 0) len = 1; - } - const buff = new Uint8Array(len); - const buffV = new DataView(buff.buffer); - let o = 0; - while (o < len) { - if (o + 4 <= len) { - buffV.setUint32(o, Number(r & BigInt(0xffffffff)), true); - o += 4; - r = r >> BigInt(32); - } else if (o + 2 <= len) { - buffV.setUint16(o, Number(r & BigInt(0xffff)), true); - o += 2; - r = r >> BigInt(16); - } else { - buffV.setUint8(o, Number(r & BigInt(0xff)), true); - o += 1; - r = r >> BigInt(8); - } - } - if (r) { - throw new Error("Number does not fit in this length"); - } - return buff; -} - -function stringifyFElements(F, o) { - if (typeof o == "bigint" || o.eq !== undefined) { - return o.toString(10); - } else if (o instanceof Uint8Array) { - return F.toString(F.e(o)); - } else if (Array.isArray(o)) { - return o.map(stringifyFElements.bind(this, F)); - } else if (typeof o == "object") { - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = stringifyFElements(F, o[k]); - }); - return res; - } else { - return o; - } -} - -function unstringifyFElements(F, o) { - if (typeof o == "string" && /^[0-9]+$/.test(o)) { - return F.e(o); - } else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) { - return F.e(o); - } else if (Array.isArray(o)) { - return o.map(unstringifyFElements.bind(this, F)); - } else if (typeof o == "object") { - if (o === null) return null; - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = unstringifyFElements(F, o[k]); - }); - return res; - } else { - return o; - } -} - -const _revTable = []; -for (let i = 0; i < 256; i++) { - _revTable[i] = _revSlow(i, 8); -} - -function _revSlow(idx, bits) { - let res = 0; - let a = idx; - for (let i = 0; i < bits; i++) { - res <<= 1; - res = res | (a & 1); - a >>= 1; - } - return res; -} - -function bitReverse(idx, bits) { - return ( - (_revTable[idx >>> 24] | - (_revTable[(idx >>> 16) & 0xff] << 8) | - (_revTable[(idx >>> 8) & 0xff] << 16) | - (_revTable[idx & 0xff] << 24)) >>> - (32 - bits) - ); -} - -function log2(V) { - return ( - ((V & 0xffff0000) !== 0 ? ((V &= 0xffff0000), 16) : 0) | - ((V & 0xff00ff00) !== 0 ? ((V &= 0xff00ff00), 8) : 0) | - ((V & 0xf0f0f0f0) !== 0 ? ((V &= 0xf0f0f0f0), 4) : 0) | - ((V & 0xcccccccc) !== 0 ? ((V &= 0xcccccccc), 2) : 0) | - ((V & 0xaaaaaaaa) !== 0) - ); -} - -function buffReverseBits(buff, eSize) { - const n = buff.byteLength / eSize; - const bits = log2(n); - if (n != 1 << bits) { - throw new Error("Invalid number of pointers"); - } - for (let i = 0; i < n; i++) { - const r = bitReverse(i, bits); - if (i > r) { - const tmp = buff.slice(i * eSize, (i + 1) * eSize); - buff.set(buff.slice(r * eSize, (r + 1) * eSize), i * eSize); - buff.set(tmp, r * eSize); - } - } -} - -function array2buffer(arr, sG) { - const buff = new Uint8Array(sG * arr.length); - - for (let i = 0; i < arr.length; i++) { - buff.set(arr[i], i * sG); - } - - return buff; -} - -function buffer2array(buff, sG) { - const n = buff.byteLength / sG; - const arr = new Array(n); - for (let i = 0; i < n; i++) { - arr[i] = buff.slice(i * sG, i * sG + sG); - } - return arr; -} - -var _utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - array2buffer: array2buffer, - beBuff2int: beBuff2int, - beInt2Buff: beInt2Buff, - bitReverse: bitReverse, - buffReverseBits: buffReverseBits, - buffer2array: buffer2array, - leBuff2int: leBuff2int, - leInt2Buff: leInt2Buff, - log2: log2, - stringifyBigInts: stringifyBigInts, - stringifyFElements: stringifyFElements, - unstringifyBigInts: unstringifyBigInts, - unstringifyFElements: unstringifyFElements -}); - -const PAGE_SIZE = ( typeof Buffer !== "undefined" && Buffer.constants && Buffer.constants.MAX_LENGTH ) ? Buffer.constants.MAX_LENGTH : (1 << 30); - -class BigBuffer { - - constructor(size) { - this.buffers = []; - this.byteLength = size; - for (let i=0; i0) { - // bytes to copy from this page - const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r; - const srcView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset+o, l); - if (l == len) return srcView.slice(); - if (!buff) { - if (len <= PAGE_SIZE) { - buff = new Uint8Array(len); - } else { - buff = new BigBuffer(len); - } - } - buff.set(srcView, len-r); - r = r-l; - p ++; - o = 0; - } - - return buff; - } - - set(buff, offset) { - if (offset === undefined) offset = 0; - - const len = buff.byteLength; - - if (len==0) return; - - const firstPage = Math.floor(offset / PAGE_SIZE); - const lastPage = Math.floor((offset+len-1) / PAGE_SIZE); - - if (firstPage == lastPage) { - if ((buff instanceof BigBuffer)&&(buff.buffers.length==1)) { - return this.buffers[firstPage].set(buff.buffers[0], offset % PAGE_SIZE); - } else { - return this.buffers[firstPage].set(buff, offset % PAGE_SIZE); - } - - } - - - let p = firstPage; - let o = offset % PAGE_SIZE; - let r = len; - while (r>0) { - const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r; - const srcView = buff.slice( len -r, len -r+l); - const dstView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset + o, l); - dstView.set(srcView); - r = r-l; - p ++; - o = 0; - } - - } -} - -function buildBatchConvert(tm, fnName, sIn, sOut) { - return async function batchConvert(buffIn) { - const nPoints = Math.floor(buffIn.byteLength / sIn); - if ( nPoints * sIn !== buffIn.byteLength) { - throw new Error("Invalid buffer size"); - } - const pointsPerChunk = Math.floor(nPoints/tm.concurrency); - const opPromises = []; - for (let i=0; i=0; i--) { - this.w[i] = this.square(this.w[i+1]); - } - - if (!this.eq(this.w[0], this.one)) { - throw new Error("Error calculating roots of unity"); - } - - this.batchToMontgomery = buildBatchConvert(tm, prefix + "_batchToMontgomery", this.n8, this.n8); - this.batchFromMontgomery = buildBatchConvert(tm, prefix + "_batchFromMontgomery", this.n8, this.n8); - } - - - op2(opName, a, b) { - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - op2Bool(opName, a, b) { - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); - } - - op1(opName, a) { - this.tm.setBuff(this.pOp1, a); - this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - op1Bool(opName, a) { - this.tm.setBuff(this.pOp1, a); - return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); - } - - add(a,b) { - return this.op2("_add", a, b); - } - - - eq(a,b) { - return this.op2Bool("_eq", a, b); - } - - isZero(a) { - return this.op1Bool("_isZero", a); - } - - sub(a,b) { - return this.op2("_sub", a, b); - } - - neg(a) { - return this.op1("_neg", a); - } - - inv(a) { - return this.op1("_inverse", a); - } - - toMontgomery(a) { - return this.op1("_toMontgomery", a); - } - - fromMontgomery(a) { - return this.op1("_fromMontgomery", a); - } - - mul(a,b) { - return this.op2("_mul", a, b); - } - - div(a, b) { - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); - this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - square(a) { - return this.op1("_square", a); - } - - isSquare(a) { - return this.op1Bool("_isSquare", a); - } - - sqrt(a) { - return this.op1("_sqrt", a); - } - - exp(a, b) { - if (!(b instanceof Uint8Array)) { - b = toLEBuff(e(b)); - } - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - this.tm.instance.exports[this.prefix + "_exp"](this.pOp1, this.pOp2, b.byteLength, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - isNegative(a) { - return this.op1Bool("_isNegative", a); - } - - e(a, b) { - if (a instanceof Uint8Array) return a; - let ra = e(a, b); - if (isNegative$4(ra)) { - ra = neg(ra); - if (gt(ra, this.p)) { - ra = mod(ra, this.p); - } - ra = sub(this.p, ra); - } else { - if (gt(ra, this.p)) { - ra = mod(ra, this.p); - } - } - const buff = leInt2Buff(ra, this.n8); - return this.toMontgomery(buff); - } - - toString(a, radix) { - const an = this.fromMontgomery(a); - const s = fromRprLE(an, 0); - return toString(s, radix); - } - - fromRng(rng) { - let v; - const buff = new Uint8Array(this.n8); - do { - v = zero; - for (let i=0; i memory.buffer.byteLength) { - const currentPages = memory.buffer.byteLength / 0x10000; - let requiredPages = Math.floor((u32[0] + length) / 0x10000)+1; - if (requiredPages>MAXMEM) requiredPages=MAXMEM; - memory.grow(requiredPages-currentPages); - console.log("Growing memory to", memory.buffer.byteLength / 1024 / 1024, "MB"); - } - return res; - } - - function allocBuffer(buffer) { - const p = alloc(buffer.byteLength); - setBuffer(p, buffer); - return p; - } - - function getBuffer(pointer, length) { - // const u8 = new Uint8Array(memory.buffer); - // return new Uint8Array(u8.buffer, u8.byteOffset + pointer, length); - return new Uint8Array(memory.buffer, pointer, length); - } - - function setBuffer(pointer, buffer) { - const u8 = new Uint8Array(memory.buffer); - u8.set(new Uint8Array(buffer), pointer); - } - - function runTask(task) { - clearTimeout(terminationTimer); - if (task[0].cmd === "INIT") { - return init(task[0]); - } - const ctx = { - vars: [], - out: [] - }; - const u32a = new Uint32Array(memory.buffer, 0, 1); - const oldAlloc = u32a[0]; - for (let i=0; i0) { - terminationTimer = setTimeout( () => { - console.log("Shutting down thread due to inactivity"); - terminate(); - }, terminationTimeout); - } - } - - function terminate() { - clearTimeout(terminationTimer); - instance = null; - memory = null; - if (self) { - console.log("TERMINATE"); - self.postMessage({status: "terminated"}); - self.close(); - } - } - - return runTask; -} - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -// const MEM_SIZE = 1000; // Memory size in 64K Pakes (512Mb) -const MEM_SIZE = 25; // Memory size in 64K Pakes (1600Kb) - -class Deferred { - constructor() { - this.promise = new Promise((resolve, reject)=> { - this.reject = reject; - this.resolve = resolve; - }); - } -} - -let workerSource; - -const threadStr = `(${"function thread(self) {\n const MAXMEM = 32767;\n let instance;\n let memory;\n let terminationTimeout = 500; // milliseconds\n let terminationTimer;\n\n if (self) {\n self.onmessage = function(e) {\n let data;\n if (e.data) {\n data = e.data;\n } else {\n data = e;\n }\n\n try {\n if (data[0].cmd === \"INIT\") {\n init(data[0]).then(function() {\n console.log(\"INIT DONE\");\n self.postMessage({status: \"initialized\"});\n });\n } else if (data[0].cmd === \"TERMINATE\") {\n terminate();\n } else {\n let terminateAfterTask = false;\n if (data[data.length-1].cmd === \"TERMINATE\") {\n terminateAfterTask = true;\n data.pop();\n //terminationTimeout = 1;\n }\n const res = runTask(data);\n //self.postMessage(res);\n let transfers = [];\n for (let i=0; i memory.buffer.byteLength) {\n const currentPages = memory.buffer.byteLength / 0x10000;\n let requiredPages = Math.floor((u32[0] + length) / 0x10000)+1;\n if (requiredPages>MAXMEM) requiredPages=MAXMEM;\n memory.grow(requiredPages-currentPages);\n console.log(\"Growing memory to\", memory.buffer.byteLength / 1024 / 1024, \"MB\");\n }\n return res;\n }\n\n function allocBuffer(buffer) {\n const p = alloc(buffer.byteLength);\n setBuffer(p, buffer);\n return p;\n }\n\n function getBuffer(pointer, length) {\n // const u8 = new Uint8Array(memory.buffer);\n // return new Uint8Array(u8.buffer, u8.byteOffset + pointer, length);\n return new Uint8Array(memory.buffer, pointer, length);\n }\n\n function setBuffer(pointer, buffer) {\n const u8 = new Uint8Array(memory.buffer);\n u8.set(new Uint8Array(buffer), pointer);\n }\n\n function runTask(task) {\n clearTimeout(terminationTimer);\n if (task[0].cmd === \"INIT\") {\n return init(task[0]);\n }\n const ctx = {\n vars: [],\n out: []\n };\n const u32a = new Uint32Array(memory.buffer, 0, 1);\n const oldAlloc = u32a[0];\n for (let i=0; i0) {\n terminationTimer = setTimeout( () => {\n console.log(\"Shutting down thread due to inactivity\");\n terminate();\n }, terminationTimeout);\n }\n }\n\n function terminate() {\n clearTimeout(terminationTimer);\n instance = null;\n memory = null;\n if (self) {\n console.log(\"TERMINATE\");\n self.postMessage({status: \"terminated\"});\n self.close();\n }\n }\n\n return runTask;\n}"})(self)`; -{ - if(globalThis?.Blob) { - const threadBytes= new TextEncoder().encode(threadStr); - const workerBlob = new Blob([threadBytes], { type: "application/javascript" }) ; - workerSource = URL.createObjectURL(workerBlob); - } else { - workerSource = "data:application/javascript;base64," + globalThis.btoa(threadStr); - } -} - - - -async function buildThreadManager(wasm, singleThread) { - const tm = new ThreadManager(); - - tm.memory = new WebAssembly.Memory({initial:MEM_SIZE}); - tm.u8 = new Uint8Array(tm.memory.buffer); - tm.u32 = new Uint32Array(tm.memory.buffer); - - const wasmModule = await WebAssembly.compile(wasm.code); - - tm.instance = await WebAssembly.instantiate(wasmModule, { - env: { - "memory": tm.memory - } - }); - - if(!globalThis?.Worker) { - singleThread = true; - } - - tm.singleThread = singleThread; - tm.initalPFree = tm.u32[0]; // Save the Pointer to free space. - tm.pq = wasm.pq; - tm.pr = wasm.pr; - tm.pG1gen = wasm.pG1gen; - tm.pG1zero = wasm.pG1zero; - tm.pG2gen = wasm.pG2gen; - tm.pG2zero = wasm.pG2zero; - tm.pOneT = wasm.pOneT; - - tm.code = wasm.code; - tm.wasmModule = wasmModule; - - // tm.pTmp0 = tm.alloc(curve.G2.F.n8*3); - // tm.pTmp1 = tm.alloc(curve.G2.F.n8*3); - - if (singleThread) { - tm.taskManager = thread(); - await tm.taskManager([{ - cmd: "INIT", - init: MEM_SIZE, - code: tm.code.slice() - }]); - tm.concurrency = 1; - } else { - tm.workers = []; - tm.pendingDeferreds = []; - tm.working = []; - tm.initialized = []; - tm.initializing = []; - - let concurrency = 2; - { - if (typeof navigator === "object" && navigator.hardwareConcurrency) { - concurrency = navigator.hardwareConcurrency; - } - } - - if(concurrency === 0){ - concurrency = 2; - } - - //concurrency = 10; // For testing - - // Limit to 64 threads for memory reasons. - if (concurrency>64) concurrency=64; - tm.concurrency = concurrency; - - // for (let i = 0; i<1; i++) { - // - // tm.workers[i] = new Worker(workerSource); - // - // tm.workers[i].addEventListener("message", getOnMsg(i)); - // //tm.workers[i].addEventListener("error", getOnError(i)); - // - // tm.working[i]=false; - // } - // - // const initPromises = []; - // for (let i=0; i { - this.initialized[i] = true; - }); - } - - startSyncOp() { - if (this.oldPFree !== 0) throw new Error("Sync operation in progress"); - this.oldPFree = this.u32[0]; - } - - endSyncOp() { - if (this.oldPFree === 0) throw new Error("No sync operation in progress"); - this.u32[0] = this.oldPFree; - this.oldPFree = 0; - } - - async postAction(workerId, e, transfers, _deferred) { - if (this.working[workerId]) { - throw new Error("Posting a job to a working worker"); - } - this.working[workerId] = true; - - this.pendingDeferreds[workerId] = _deferred ? _deferred : new Deferred(); - await this.workers[workerId].postMessage(e, transfers); - - return this.pendingDeferreds[workerId].promise; - } - - async processWorks() { - for (let i=0; (i 0); i++) { - if (this.workers[i] && this.initialized[i] && !this.working[i]) { - const work = this.actionQueue.shift(); - this.postAction(i, work.data, work.transfers, work.deferred); - } - } - - // Initialize more workers if needed - if (this.actionQueue.length > 0) { - // Find a worker that is not initialized yet - let initializingCount = 0; - for (let i=0; i= this.actionQueue.length) break; - - // Initialize this worker - console.log(`Worker ${i} not initialized yet. Initializing...`); - initializingCount++; - await this.startWorker(i); - //this.startWorker(i); - } - } - } - - queueAction(actionData, transfers) { - const d = new Deferred(); - - if (this.singleThread) { - const res = this.taskManager(actionData); - d.resolve(res); - } else { - this.actionQueue.push({ - data: actionData, - transfers: transfers, - deferred: d - }); - this.processWorks(); - } - return d.promise; - } - - resetMemory() { - this.u32[0] = this.initalPFree; - } - - allocBuff(buff) { - const pointer = this.alloc(buff.byteLength); - this.setBuff(pointer, buff); - return pointer; - } - - getBuff(pointer, length) { - return this.u8.slice(pointer, pointer+ length); - } - - setBuff(pointer, buffer) { - this.u8.set(new Uint8Array(buffer), pointer); - } - - alloc(length) { - while (this.u32[0] & 3) this.u32[0]++; // Return always aligned pointers - const res = this.u32[0]; - this.u32[0] += length; - return res; - } - - async terminate() { - console.log("terminate!!!"); - for (let i=0; i=0; i--) { - if (!G.isZero(res)) { - for (let j=0; jMAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; - if (chunkSize { - if (logger) logger.debug(`Multiexp end: ${logText}: ${i}/${nPoints}`); - return r; - })); - } - - let result = await Promise.all(opPromises); - - let res = G.zero; - for (let i=result.length-1; i>=0; i--) { - res = G.add(res, result[i]); - } - - return res; - } - - G.multiExp = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "jacobian", logger, logText); - }; - G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "affine", logger, logText); - }; -} - -function buildFFT$2(curve, groupName) { - const G = curve[groupName]; - const Fr = curve.Fr; - const tm = G.tm; - async function _fft(buff, inverse, inType, outType, logger, loggerTxt) { - - inType = inType || "affine"; - outType = outType || "affine"; - const MAX_BITS_THREAD = 14; - - let sIn, sMid, sOut, fnIn2Mid, fnMid2Out, fnFFTMix, fnFFTJoin, fnFFTFinal, fnReversePermutation; - if (groupName == "G1") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g1m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - sMid = G.F.n8*3; - if (inverse) { - fnFFTFinal = "g1m_fftFinal"; - } - fnFFTJoin = "g1m_fftJoin"; - fnFFTMix = "g1m_fftMix"; - fnReversePermutation = "g1m_reversePermutation"; - - if (outType == "affine") { - sOut = G.F.n8*2; - fnMid2Out = "g1m_batchToAffine"; - } else { - sOut = G.F.n8*3; - } - - } else if (groupName == "G2") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g2m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - sMid = G.F.n8*3; - if (inverse) { - fnFFTFinal = "g2m_fftFinal"; - } - fnFFTJoin = "g2m_fftJoin"; - fnFFTMix = "g2m_fftMix"; - fnReversePermutation = "g2m_reversePermutation"; - if (outType == "affine") { - sOut = G.F.n8*2; - fnMid2Out = "g2m_batchToAffine"; - } else { - sOut = G.F.n8*3; - } - } else if (groupName == "Fr") { - sIn = G.n8; - sMid = G.n8; - sOut = G.n8; - if (inverse) { - fnFFTFinal = "frm_fftFinal"; - } - fnFFTMix = "frm_fftMix"; - fnFFTJoin = "frm_fftJoin"; - fnReversePermutation = "frm_fftReversePermutation"; - } - - - let returnArray = false; - if (Array.isArray(buff)) { - buff = array2buffer(buff, sIn); - returnArray = true; - } else { - buff = buff.slice(0, buff.byteLength); - } - - console.log("FFT input size:", buff.byteLength, " bytes"); - - const nPoints = buff.byteLength / sIn; - const bits = log2(nPoints); - - console.log("FFT points:", nPoints, " bits:", bits); - - if ((1 << bits) != nPoints) { - throw new Error("fft must be multiple of 2" ); - } - - if (bits == Fr.s +1) { - let buffOut; - - if (inverse) { - buffOut = await _fftExtInv(buff, inType, outType, logger, loggerTxt); - } else { - buffOut = await _fftExt(buff, inType, outType, logger, loggerTxt); - } - - if (returnArray) { - return buffer2array(buffOut, sOut); - } else { - return buffOut; - } - } - - let inv; - if (inverse) { - inv = Fr.inv(Fr.e(nPoints)); - } - - let buffOut; - - // TODO: optimize. Move to wasm? - //buffReverseBits(buff, sIn); - - console.log("fnReversePermutation:", fnReversePermutation); - - const task = []; - task.push({cmd: "ALLOC", var: 0, len: buff.byteLength}); - task.push({cmd: "SET", var: 0, buff: buff}); - task.push({cmd: "CALL", fnName: fnReversePermutation, params: [{var:0}, {val: bits}, {var: 0}]}); - task.push({cmd: "GET", out:0, var: 0, len: buff.byteLength}); - const res = await tm.queueAction(task, [buff.buffer]); - - buff.set(res[0]); - - let chunks; - let pointsInChunk = Math.min(1 << MAX_BITS_THREAD, nPoints); - let nChunks = nPoints / pointsInChunk; - - while ((nChunks < tm.concurrency)&&(pointsInChunk>=16)) { - nChunks *= 2; - pointsInChunk /= 2; - } - - const l2Chunk = log2(pointsInChunk); - - const promises = []; - for (let i = 0; i< nChunks; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${i}/${nChunks}`); - const task = []; - task.push({cmd: "ALLOC", var: 0, len: sMid*pointsInChunk}); - const buffChunk = buff.slice( (pointsInChunk * i)*sIn, (pointsInChunk * (i+1))*sIn); - task.push({cmd: "SET", var: 0, buff: buffChunk}); - if (fnIn2Mid) { - task.push({cmd: "CALL", fnName:fnIn2Mid, params: [{var:0}, {val: pointsInChunk}, {var: 0}]}); - } - for (let j=1; j<=l2Chunk;j++) { - task.push({cmd: "CALL", fnName:fnFFTMix, params: [{var:0}, {val: pointsInChunk}, {val: j}]}); - } - - if (l2Chunk==bits) { - if (fnFFTFinal) { - task.push({cmd: "ALLOCSET", var: 1, buff: inv}); - task.push({cmd: "CALL", fnName: fnFFTFinal, params:[ - {var: 0}, - {val: pointsInChunk}, - {var: 1}, - ]}); - } - if (fnMid2Out) { - task.push({cmd: "CALL", fnName:fnMid2Out, params: [{var:0}, {val: pointsInChunk}, {var: 0}]}); - } - task.push({cmd: "GET", out: 0, var: 0, len: pointsInChunk*sOut}); - } else { - task.push({cmd: "GET", out:0, var: 0, len: sMid*pointsInChunk}); - } - promises.push(tm.queueAction(task, [buffChunk.buffer]).then( (r) => { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${i}/${nChunks}`); - return r; - })); - } - - chunks = await Promise.all(promises); - for (let i = 0; i< nChunks; i++) chunks[i] = chunks[i][0]; - - for (let i = l2Chunk+1; i<=bits; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); - const nGroups = 1 << (bits - i); - const nChunksPerGroup = nChunks / nGroups; - const opPromises = []; - for (let j=0; j { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join ${i}/${bits} ${j+1}/${nGroups} ${k}/${nChunksPerGroup/2}`); - return r; - })); - } - } - - const res = await Promise.all(opPromises); - for (let j=0; j0; i--) { - buffOut.set(chunks[i], p); - p += pointsInChunk*sOut; - delete chunks[i]; // Liberate mem - } - buffOut.set(chunks[0].slice(0, (pointsInChunk-1)*sOut), p); - delete chunks[0]; - } else { - for (let i=0; i (1<<28)) { - buffOut = new BigBuffer(res1[0].byteLength*2); - } else { - buffOut = new Uint8Array(res1[0].byteLength*2); - } - - buffOut.set(res1[0]); - buffOut.set(res1[1], res1[0].byteLength); - - return buffOut; - } - - async function _fftExtInv(buff, inType, outType, logger, loggerTxt) { - let b1, b2; - b1 = buff.slice( 0 , buff.byteLength/2); - b2 = buff.slice( buff.byteLength/2, buff.byteLength); - - const promises = []; - - promises.push( _fft(b1, true, inType, "jacobian", logger, loggerTxt)); - promises.push( _fft(b2, true, inType, "jacobian", logger, loggerTxt)); - - [b1, b2] = await Promise.all(promises); - - const res1 = await _fftJoinExt(b1, b2, "fftJoinExtInv", Fr.one, Fr.shiftInv, "jacobian", outType, logger, loggerTxt); - - let buffOut; - if (res1[0].byteLength > (1<<28)) { - buffOut = new BigBuffer(res1[0].byteLength*2); - } else { - buffOut = new Uint8Array(res1[0].byteLength*2); - } - - buffOut.set(res1[0]); - buffOut.set(res1[1], res1[0].byteLength); - - return buffOut; - } - - - async function _fftJoinExt(buff1, buff2, fn, first, inc, inType, outType, logger, loggerTxt) { - const MAX_CHUNK_SIZE = 1<<16; - const MIN_CHUNK_SIZE = 1<<4; - - let fnName; - let fnIn2Mid, fnMid2Out; - let sOut, sIn, sMid; - - if (groupName == "G1") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g1m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - sMid = G.F.n8*3; - fnName = "g1m_"+fn; - if (outType == "affine") { - fnMid2Out = "g1m_batchToAffine"; - sOut = G.F.n8*2; - } else { - sOut = G.F.n8*3; - } - } else if (groupName == "G2") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g2m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - fnName = "g2m_"+fn; - sMid = G.F.n8*3; - if (outType == "affine") { - fnMid2Out = "g2m_batchToAffine"; - sOut = G.F.n8*2; - } else { - sOut = G.F.n8*3; - } - } else if (groupName == "Fr") { - sIn = Fr.n8; - sOut = Fr.n8; - sMid = Fr.n8; - fnName = "frm_" + fn; - } else { - throw new Error("Invalid group"); - } - - if (buff1.byteLength != buff2.byteLength) { - throw new Error("Invalid buffer size"); - } - const nPoints = Math.floor(buff1.byteLength / sIn); - if (nPoints != 1 << log2(nPoints)) { - throw new Error("Invalid number of points"); - } - - let chunkSize = Math.floor(nPoints /tm.concurrency); - if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; - if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; - - const opPromises = []; - - for (let i=0; i { - if (logger) logger.debug(`${loggerTxt}: fftJoinExt End: ${i}/${nPoints}`); - return r; - }) - ); - } - - const result = await Promise.all(opPromises); - - let fullBuffOut1; - let fullBuffOut2; - if (nPoints * sOut > 1<<28) { - fullBuffOut1 = new BigBuffer(nPoints*sOut); - fullBuffOut2 = new BigBuffer(nPoints*sOut); - } else { - fullBuffOut1 = new Uint8Array(nPoints*sOut); - fullBuffOut2 = new Uint8Array(nPoints*sOut); - } - - let p =0; - for (let i=0; i Fr.s+1) { - if (logger) logger.error("lagrangeEvaluations input too big"); - throw new Error("lagrangeEvaluations input too big"); - } - - let t0 = buff.slice(0, buff.byteLength/2); - let t1 = buff.slice(buff.byteLength/2, buff.byteLength); - - - const shiftToSmallM = Fr.exp(Fr.shift, nPoints/2); - const sConst = Fr.inv( Fr.sub(Fr.one, shiftToSmallM)); - - [t0, t1] = await _fftJoinExt(t0, t1, "prepareLagrangeEvaluation", sConst, Fr.shiftInv, inType, "jacobian", logger, loggerTxt + " prep"); - - const promises = []; - - promises.push( _fft(t0, true, "jacobian", outType, logger, loggerTxt + " t0")); - promises.push( _fft(t1, true, "jacobian", outType, logger, loggerTxt + " t1")); - - [t0, t1] = await Promise.all(promises); - - let buffOut; - if (t0.byteLength > (1<<28)) { - buffOut = new BigBuffer(t0.byteLength*2); - } else { - buffOut = new Uint8Array(t0.byteLength*2); - } - - buffOut.set(t0); - buffOut.set(t1, t0.byteLength); - - return buffOut; - }; - - G.fftMix = async function fftMix(buff) { - const sG = G.F.n8*3; - let fnName, fnFFTJoin; - if (groupName == "G1") { - fnName = "g1m_fftMix"; - fnFFTJoin = "g1m_fftJoin"; - } else if (groupName == "G2") { - fnName = "g2m_fftMix"; - fnFFTJoin = "g2m_fftJoin"; - } else if (groupName == "Fr") { - fnName = "frm_fftMix"; - fnFFTJoin = "frm_fftJoin"; - } else { - throw new Error("Invalid group"); - } - - const nPoints = Math.floor(buff.byteLength / sG); - const power = log2(nPoints); - - let nChunks = 1 << log2(tm.concurrency); - - if (nPoints <= nChunks*2) nChunks = 1; - - const pointsPerChunk = nPoints / nChunks; - - const powerChunk = log2(pointsPerChunk); - - const opPromises = []; - for (let i=0; i=0; i--) { - fullBuffOut.set(result[i][0], p); - p+=result[i][0].byteLength; - } - - return fullBuffOut; - }; -} - -async function buildEngine(params) { - - const tm = await buildThreadManager(params.wasm, params.singleThread); - - - const curve = {}; - - curve.q = e(params.wasm.q.toString()); - curve.r = e(params.wasm.r.toString()); - curve.name = params.name; - curve.tm = tm; - curve.prePSize = params.wasm.prePSize; - curve.preQSize = params.wasm.preQSize; - curve.Fr = new WasmField1(tm, "frm", params.n8r, params.r); - curve.F1 = new WasmField1(tm, "f1m", params.n8q, params.q); - curve.F2 = new WasmField2(tm, "f2m", curve.F1); - curve.G1 = new WasmCurve(tm, "g1m", curve.F1, params.wasm.pG1gen, params.wasm.pG1b, params.cofactorG1); - curve.G2 = new WasmCurve(tm, "g2m", curve.F2, params.wasm.pG2gen, params.wasm.pG2b, params.cofactorG2); - curve.F6 = new WasmField3(tm, "f6m", curve.F2); - curve.F12 = new WasmField2(tm, "ftm", curve.F6); - - curve.Gt = curve.F12; - - buildBatchApplyKey(curve, "G1"); - buildBatchApplyKey(curve, "G2"); - buildBatchApplyKey(curve, "Fr"); - - buildMultiexp$1(curve, "G1"); - buildMultiexp$1(curve, "G2"); - - buildFFT$2(curve, "G1"); - buildFFT$2(curve, "G2"); - buildFFT$2(curve, "Fr"); - - buildPairing(curve); - - curve.array2buffer = function(arr, sG) { - const buff = new Uint8Array(sG*arr.length); - - for (let i=0; i= 0) { - curve = await buildBn128$1(singleThread, plugins); - } else if (["BLS12381"].indexOf(normName) >= 0) { - curve = await buildBls12381$1(singleThread, plugins); - } else { - throw new Error(`Curve not supported: ${name}`); - } - return curve; - - function normalizeName(n) { - return n.toUpperCase().match(/[A-Za-z0-9]+/g).join(""); - } - -} - -const Scalar=_Scalar; -const utils$6 = _utils; - -var bn128_wasm_gzip$1 = {}; - -bn128_wasm_gzip$1.gzipCode = "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"; - bn128_wasm_gzip$1.pq = 488; - bn128_wasm_gzip$1.pr = 1768; - bn128_wasm_gzip$1.pG1gen = 31432; - bn128_wasm_gzip$1.pG1zero = 31528; - bn128_wasm_gzip$1.pG1b = 3080; - bn128_wasm_gzip$1.pG2gen = 31624; - bn128_wasm_gzip$1.pG2zero = 31816; - bn128_wasm_gzip$1.pG2b = 12456; - bn128_wasm_gzip$1.pOneT = 32008; - bn128_wasm_gzip$1.prePSize = 192; - bn128_wasm_gzip$1.preQSize = 19776; - bn128_wasm_gzip$1.n8q = 32; - bn128_wasm_gzip$1.n8r = 32; - bn128_wasm_gzip$1.q = "21888242871839275222246405745257275088696311157297823662689037894645226208583"; - bn128_wasm_gzip$1.r = "21888242871839275222246405745257275088548364400416034343698204186575808495617"; - -var utils$5 = {}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -utils$5.bigInt2BytesLE = function bigInt2BytesLE(_a, len) { - const b = Array(len); - let v = BigInt(_a); - for (let i=0; i> 8n; - } - return b; -}; - -utils$5.bigInt2U32LE = function bigInt2BytesLE(_a, len) { - const b = Array(len); - let v = BigInt(_a); - for (let i=0; i> 32n; - } - return b; -}; - -utils$5.isOcamNum = function(a) { - if (!Array.isArray(a)) return false; - if (a.length != 3) return false; - if (typeof a[0] !== "number") return false; - if (typeof a[1] !== "number") return false; - if (!Array.isArray(a[2])) return false; - return true; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -var build_int = function buildInt(module, n64, _prefix) { - - const prefix = _prefix || "int"; - if (module.modules[prefix]) return prefix; // already builded - module.modules[prefix] = {}; - - const n32 = n64*2; - const n8 = n64*8; - - function buildCopy() { - const f = module.addFunction(prefix+"_copy"); - f.addParam("px", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - for (let i=0; i>1) )&&(i>1, k>>1) - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ) - ) - ); - } - - // Add the old carry - - if (k>0) { - f.addCode( - c.setLocal(c0, - c.i64_add( - c.i64_and( - c.getLocal(c0), - c.i64_const(0xFFFFFFFF) - ), - c.i64_and( - c.getLocal(c0_old), - c.i64_const(0xFFFFFFFF) - ), - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ), - c.getLocal(c1_old) - ) - ) - ); - } - - f.addCode( - c.i64_store32( - c.getLocal("r"), - k*4, - c.getLocal(c0) - ) - ); - - f.addCode( - c.setLocal( - c0_old, - c.getLocal(c1) - ), - c.setLocal( - c1_old, - c.i64_shr_u( - c.getLocal(c0_old), - c.i64_const(32) - ) - ) - ); - - } - f.addCode( - c.i64_store32( - c.getLocal("r"), - n32*4*2-4, - c.getLocal(c0_old) - ) - ); - - } - - - function buildSquareOld() { - const f = module.addFunction(prefix+"_squareOld"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call(prefix + "_mul", c.getLocal("x"), c.getLocal("x"), c.getLocal("r"))); - } - - function _buildMul1() { - const f = module.addFunction(prefix+"__mul1"); - f.addParam("px", "i32"); - f.addParam("y", "i64"); - f.addParam("pr", "i32"); - f.addLocal("c", "i64"); - - const c = f.getCodeBuilder(); - - f.addCode(c.setLocal( - "c", - c.i64_mul( - c.i64_load32_u(c.getLocal("px"), 0, 0), - c.getLocal("y") - ) - )); - - f.addCode(c.i64_store32( - c.getLocal("pr"), - 0, - 0, - c.getLocal("c"), - )); - - for (let i=1; i3)&&(Y[eY]==0) ey--; - f.addCode(c.block(c.loop( - c.br_if( - 1, - c.i32_or( - c.i32_load8_u( - c.i32_add(Y , c.getLocal("eY")), - 0, - 0 - ), - c.i32_eq( - c.getLocal("eY"), - c.i32_const(3) - ) - ) - ), - c.setLocal("eY", c.i32_sub(c.getLocal("eY"), c.i32_const(1))), - c.br(0) - ))); - - f.addCode( - c.setLocal( - "sy", - c.i64_add( - c.i64_load32_u( - c.i32_sub( - c.i32_add( Y, c.getLocal("eY")), - c.i32_const(3) - ), - 0, - 0 - ), - c.i64_const(1) - ) - ) - ); - - // Force a divide by 0 if quotien is 0 - f.addCode( - c.if( - c.i64_eq( - c.getLocal("sy"), - c.i64_const(1) - ), - c.drop(c.i64_div_u(c.i64_const(0), c.i64_const(0))) - ) - ); - - f.addCode(c.block(c.loop( - - // while (eX>7)&&(Y[eX]==0) ex--; - c.block(c.loop( - c.br_if( - 1, - c.i32_or( - c.i32_load8_u( - c.i32_add(R , c.getLocal("eX")), - 0, - 0 - ), - c.i32_eq( - c.getLocal("eX"), - c.i32_const(7) - ) - ) - ), - c.setLocal("eX", c.i32_sub(c.getLocal("eX"), c.i32_const(1))), - c.br(0) - )), - - c.setLocal( - "sx", - c.i64_load( - c.i32_sub( - c.i32_add( R, c.getLocal("eX")), - c.i32_const(7) - ), - 0, - 0 - ) - ), - - c.setLocal( - "sx", - c.i64_div_u( - c.getLocal("sx"), - c.getLocal("sy") - ) - ), - c.setLocal( - "ec", - c.i32_sub( - c.i32_sub( - c.getLocal("eX"), - c.getLocal("eY") - ), - c.i32_const(4) - ) - ), - - // While greater than 32 bits or ec is neg, shr and inc exp - c.block(c.loop( - c.br_if( - 1, - c.i32_and( - c.i64_eqz( - c.i64_and( - c.getLocal("sx"), - c.i64_const("0xFFFFFFFF00000000") - ) - ), - c.i32_ge_s( - c.getLocal("ec"), - c.i32_const(0) - ) - ) - ), - - c.setLocal( - "sx", - c.i64_shr_u( - c.getLocal("sx"), - c.i64_const(8) - ) - ), - - c.setLocal( - "ec", - c.i32_add( - c.getLocal("ec"), - c.i32_const(1) - ) - ), - c.br(0) - )), - - c.if( - c.i64_eqz(c.getLocal("sx")), - [ - ...c.br_if( - 2, - c.i32_eqz(c.call(prefix + "_gte", R, Y)) - ), - ...c.setLocal("sx", c.i64_const(1)), - ...c.setLocal("ec", c.i32_const(0)) - ] - ), - - c.call(prefix + "__mul1", Y, c.getLocal("sx"), R2), - c.drop(c.call( - prefix + "_sub", - R, - c.i32_sub(R2, c.getLocal("ec")), - R - )), - c.call( - prefix + "__add1", - c.i32_add(C, c.getLocal("ec")), - c.getLocal("sx") - ), - c.br(0) - ))); - } - - function buildInverseMod() { - - const f = module.addFunction(prefix+"_inverseMod"); - f.addParam("px", "i32"); - f.addParam("pm", "i32"); - f.addParam("pr", "i32"); - f.addLocal("t", "i32"); - f.addLocal("newt", "i32"); - f.addLocal("r", "i32"); - f.addLocal("qq", "i32"); - f.addLocal("qr", "i32"); - f.addLocal("newr", "i32"); - f.addLocal("swp", "i32"); - f.addLocal("x", "i32"); - f.addLocal("signt", "i32"); - f.addLocal("signnewt", "i32"); - f.addLocal("signx", "i32"); - - const c = f.getCodeBuilder(); - - const aux1 = c.i32_const(module.alloc(n8)); - const aux2 = c.i32_const(module.alloc(n8)); - const aux3 = c.i32_const(module.alloc(n8)); - const aux4 = c.i32_const(module.alloc(n8)); - const aux5 = c.i32_const(module.alloc(n8)); - const aux6 = c.i32_const(module.alloc(n8)); - const mulBuff = c.i32_const(module.alloc(n8*2)); - const aux7 = c.i32_const(module.alloc(n8)); - - f.addCode( - c.setLocal("t", aux1), - c.call(prefix + "_zero", aux1), - c.setLocal("signt", c.i32_const(0)), - ); - - f.addCode( - c.setLocal("r", aux2), - c.call(prefix + "_copy", c.getLocal("pm"), aux2) - ); - - f.addCode( - c.setLocal("newt", aux3), - c.call(prefix + "_one", aux3), - c.setLocal("signnewt", c.i32_const(0)), - ); - - f.addCode( - c.setLocal("newr", aux4), - c.call(prefix + "_copy", c.getLocal("px"), aux4) - ); - - - - - f.addCode(c.setLocal("qq", aux5)); - f.addCode(c.setLocal("qr", aux6)); - f.addCode(c.setLocal("x", aux7)); - - f.addCode(c.block(c.loop( - c.br_if( - 1, - c.call(prefix + "_isZero", c.getLocal("newr") ) - ), - c.call(prefix + "_div", c.getLocal("r"), c.getLocal("newr"), c.getLocal("qq"), c.getLocal("qr")), - - c.call(prefix + "_mul", c.getLocal("qq"), c.getLocal("newt"), mulBuff), - - c.if( - c.getLocal("signt"), - c.if( - c.getLocal("signnewt"), - c.if ( - c.call(prefix + "_gte", mulBuff, c.getLocal("t")), - [ - ...c.drop(c.call(prefix + "_sub", mulBuff, c.getLocal("t"), c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(0)) - ], - [ - ...c.drop(c.call(prefix + "_sub", c.getLocal("t"), mulBuff, c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(1)) - ], - ), - [ - ...c.drop(c.call(prefix + "_add", mulBuff, c.getLocal("t"), c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(1)) - ] - ), - c.if( - c.getLocal("signnewt"), - [ - ...c.drop(c.call(prefix + "_add", mulBuff, c.getLocal("t"), c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(0)) - ], - c.if ( - c.call(prefix + "_gte", c.getLocal("t"), mulBuff), - [ - ...c.drop(c.call(prefix + "_sub", c.getLocal("t"), mulBuff, c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(0)) - ], - [ - ...c.drop(c.call(prefix + "_sub", mulBuff, c.getLocal("t"), c.getLocal("x"))), - ...c.setLocal("signx", c.i32_const(1)) - ] - ) - ) - ), - - c.setLocal("swp", c.getLocal("t")), - c.setLocal("t", c.getLocal("newt")), - c.setLocal("newt", c.getLocal("x")), - c.setLocal("x", c.getLocal("swp")), - - c.setLocal("signt", c.getLocal("signnewt")), - c.setLocal("signnewt", c.getLocal("signx")), - - c.setLocal("swp", c.getLocal("r")), - c.setLocal("r", c.getLocal("newr")), - c.setLocal("newr", c.getLocal("qr")), - c.setLocal("qr", c.getLocal("swp")), - - c.br(0) - ))); - - f.addCode(c.if( - c.getLocal("signt"), - c.drop(c.call(prefix + "_sub", c.getLocal("pm"), c.getLocal("t"), c.getLocal("pr"))), - c.call(prefix + "_copy", c.getLocal("t"), c.getLocal("pr")) - )); - } - - - buildCopy(); - buildZero(); - buildIsZero(); - buildOne(); - buildEq(); - buildGte(); - buildAdd(); - buildSub(); - buildMul(); - buildSquare(); - buildSquareOld(); - buildDiv(); - buildInverseMod(); - module.exportFunction(prefix+"_copy"); - module.exportFunction(prefix+"_zero"); - module.exportFunction(prefix+"_one"); - module.exportFunction(prefix+"_isZero"); - module.exportFunction(prefix+"_eq"); - module.exportFunction(prefix+"_gte"); - module.exportFunction(prefix+"_add"); - module.exportFunction(prefix+"_sub"); - module.exportFunction(prefix+"_mul"); - module.exportFunction(prefix+"_square"); - module.exportFunction(prefix+"_squareOld"); - module.exportFunction(prefix+"_div"); - module.exportFunction(prefix+"_inverseMod"); - - return prefix; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -var build_timesscalar = function buildTimesScalar(module, fnName, elementLen, opAB, opAA, opCopy, opInit) { - - const f = module.addFunction(fnName); - f.addParam("base", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLength", "i32"); - f.addParam("r", "i32"); - f.addLocal("i", "i32"); - f.addLocal("b", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(elementLen)); - - f.addCode( - c.if( - c.i32_eqz(c.getLocal("scalarLength")), - [ - ...c.call(opInit, c.getLocal("r")), - ...c.ret([]) - ] - ) - ); - f.addCode(c.call(opCopy, c.getLocal("base"), aux)); - f.addCode(c.call(opInit, c.getLocal("r"))); - f.addCode(c.setLocal("i", c.getLocal("scalarLength"))); - f.addCode(c.block(c.loop( - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - - c.setLocal( - "b", - c.i32_load8_u( - c.i32_add( - c.getLocal("scalar"), - c.getLocal("i") - ) - ) - ), - ...innerLoop(), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.br(0) - ))); - - - function innerLoop() { - const code = []; - for (let i=0; i<8; i++) { - code.push( - ...c.call(opAA, c.getLocal("r"), c.getLocal("r")), - ...c.if( - c.i32_ge_u( c.getLocal("b"), c.i32_const(0x80 >> i)), - [ - ...c.setLocal( - "b", - c.i32_sub( - c.getLocal("b"), - c.i32_const(0x80 >> i) - ) - ), - ...c.call(opAB, c.getLocal("r"),aux, c.getLocal("r")) - ] - ) - ); - } - return code; - } - -}; - -var build_batchinverse = buildBatchInverse$3; - -function buildBatchInverse$3(module, prefix) { - - - const n8 = module.modules[prefix].n64*8; - - const f = module.addFunction(prefix+"_batchInverse"); - f.addParam("pIn", "i32"); - f.addParam("inStep", "i32"); - f.addParam("n", "i32"); - f.addParam("pOut", "i32"); - f.addParam("outStep", "i32"); - f.addLocal("itAux", "i32"); - f.addLocal("itIn", "i32"); - f.addLocal("itOut","i32"); - f.addLocal("i","i32"); - - const c = f.getCodeBuilder(); - - const AUX = c.i32_const(module.alloc(n8)); - - - // Alloc Working space for accumulated umltiplications - f.addCode( - c.setLocal("itAux", c.i32_load( c.i32_const(0) )), - c.i32_store( - c.i32_const(0), - c.i32_add( - c.getLocal("itAux"), - c.i32_mul( - c.i32_add( - c.getLocal("n"), - c.i32_const(1) - ), - c.i32_const(n8) - ) - ) - ) - ); - - f.addCode( - - // aux[0] = a; - c.call(prefix+"_one", c.getLocal("itAux")), - // for (i=0;i b ? 1 : -1; -} - -function square$1(n) { - return n * n; -} - -function isOdd$4(n) { - return n % 2n !== 0n; -} - -function isEven(n) { - return n % 2n === 0n; -} - -function isNegative$3(n) { - return n < 0n; -} - -function isPositive(n) { - return n > 0n; -} - -function bitLength$5(n) { - if (isNegative$3(n)) { - return n.toString(2).length - 1; // discard the - sign - } else { - return n.toString(2).length; - } -} - -function abs(n) { - return n < 0n ? -n : n; -} - -function isUnit(n) { - return abs(n) === 1n; -} - -function modInv$3(a, n) { - var t = 0n, newT = 1n, r = n, newR = abs(a), q, lastT, lastR; - while (newR !== 0n) { - q = r / newR; - lastT = t; - lastR = r; - t = newT; - r = newR; - newT = lastT - (q * newT); - newR = lastR - (q * newR); - } - if (!isUnit(r)) throw new Error(a.toString() + " and " + n.toString() + " are not co-prime"); - if (compare(t, 0n) === -1) { - t = t + n; - } - if (isNegative$3(a)) { - return -t; - } - return t; -} - -function modPow$2(n, exp, mod) { - if (mod === 0n) throw new Error("Cannot take modPow with modulus 0"); - var r = 1n, - base = n % mod; - if (isNegative$3(exp)) { - exp = exp * -1n; - base = modInv$3(base, mod); - } - while (isPositive(exp)) { - if (base === 0n) return 0n; - if (isOdd$4(exp)) r = r * base % mod; - exp = exp / 2n; - base = square$1(base) % mod; - } - return r; -} - -function compareAbs(a, b) { - a = a >= 0n ? a : -a; - b = b >= 0n ? b : -b; - return a === b ? 0 : a > b ? 1 : -1; -} - -function isDivisibleBy(a, n) { - if (n === 0n) return false; - if (isUnit(n)) return true; - if (compareAbs(n, 2n) === 0) return isEven(a); - return a % n === 0n; -} - -function isBasicPrime(v) { - var n = abs(v); - if (isUnit(n)) return false; - if (n === 2n || n === 3n || n === 5n) return true; - if (isEven(n) || isDivisibleBy(n, 3n) || isDivisibleBy(n, 5n)) return false; - if (n < 49n) return true; - // we don't know if it's prime: let the other functions figure it out -} - -function prev(n) { - return n - 1n; -} - -function millerRabinTest(n, a) { - var nPrev = prev(n), - b = nPrev, - r = 0, - d, i, x; - while (isEven(b)) b = b / 2n, r++; - next: for (i = 0; i < a.length; i++) { - if (n < a[i]) continue; - x = modPow$2(BigInt(a[i]), b, n); - if (isUnit(x) || x === nPrev) continue; - for (d = r - 1; d != 0; d--) { - x = square$1(x) % n; - if (isUnit(x)) return false; - if (x === nPrev) continue next; - } - return false; - } - return true; -} - -function isPrime$1(p) { - var isPrime = isBasicPrime(p); - if (isPrime !== undefined) return isPrime; - var n = abs(p); - var bits = bitLength$5(n); - if (bits <= 64) - return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]); - var logN = Math.log(2) * Number(bits); - var t = Math.ceil(logN); - for (var a = [], i = 0; i < t; i++) { - a.push(BigInt(i + 2)); - } - return millerRabinTest(n, a); -} - -bigint.bitLength = bitLength$5; -bigint.isOdd = isOdd$4; -bigint.isNegative = isNegative$3; -bigint.abs = abs; -bigint.isUnit = isUnit; -bigint.compare = compare; -bigint.modInv = modInv$3; -bigint.modPow = modPow$2; -bigint.isPrime = isPrime$1; -bigint.square = square$1; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -const buildInt = build_int; -const utils$4 = utils$5; -const buildExp$2 = build_timesscalar; -const buildBatchInverse$2 = build_batchinverse; -const buildBatchConvertion$1 = build_batchconvertion; -const buildBatchOp = build_batchop; -const { bitLength: bitLength$4, modInv: modInv$2, modPow: modPow$1, isPrime, isOdd: isOdd$3, square } = bigint; - -var build_f1m = function buildF1m(module, _q, _prefix, _intPrefix) { - const q = BigInt(_q); - const n64 = Math.floor((bitLength$4(q - 1n) - 1)/64) +1; - const n32 = n64*2; - const n8 = n64*8; - - const prefix = _prefix || "f1m"; - if (module.modules[prefix]) return prefix; // already builded - - const intPrefix = buildInt(module, n64, _intPrefix); - const pq = module.alloc(n8, utils$4.bigInt2BytesLE(q, n8)); - - const pR2 = module.alloc(utils$4.bigInt2BytesLE(square(1n << BigInt(n64*64)) % q, n8)); - const pOne = module.alloc(utils$4.bigInt2BytesLE((1n << BigInt(n64*64)) % q, n8)); - const pZero = module.alloc(utils$4.bigInt2BytesLE(0n, n8)); - const _minusOne = q - 1n; - const _e = _minusOne >> 1n; // e = (p-1)/2 - const pe = module.alloc(n8, utils$4.bigInt2BytesLE(_e, n8)); - - const _ePlusOne = _e + 1n; // e = (p-1)/2 - const pePlusOne = module.alloc(n8, utils$4.bigInt2BytesLE(_ePlusOne, n8)); - - module.modules[prefix] = { - pq: pq, - pR2: pR2, - n64: n64, - q: q, - pOne: pOne, - pZero: pZero, - pePlusOne: pePlusOne - }; - - function buildOne() { - const f = module.addFunction(prefix+"_one"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call(intPrefix + "_copy", c.i32_const(pOne), c.getLocal("pr"))); - } - - function buildAdd() { - const f = module.addFunction(prefix+"_add"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.if( - c.call(intPrefix+"_add", c.getLocal("x"), c.getLocal("y"), c.getLocal("r")), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - c.if( - c.call(intPrefix+"_gte", c.getLocal("r"), c.i32_const(pq) ), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - ) - ) - ); - } - - function buildSub() { - const f = module.addFunction(prefix+"_sub"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.if( - c.call(intPrefix+"_sub", c.getLocal("x"), c.getLocal("y"), c.getLocal("r")), - c.drop(c.call(intPrefix+"_add", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))) - ) - ); - } - - function buildNeg() { - const f = module.addFunction(prefix+"_neg"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(prefix + "_sub", c.i32_const(pZero), c.getLocal("x"), c.getLocal("r")) - ); - } - - - function buildIsNegative() { - const f = module.addFunction(prefix+"_isNegative"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const AUX = c.i32_const(module.alloc(n8)); - - f.addCode( - c.call(prefix + "_fromMontgomery", c.getLocal("x"), AUX), - c.call(intPrefix + "_gte", AUX, c.i32_const(pePlusOne) ) - ); - } - - function buildSign() { - const f = module.addFunction(prefix+"_sign"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const AUX = c.i32_const(module.alloc(n8)); - - f.addCode( - c.if ( - c.call(intPrefix + "_isZero", c.getLocal("x")), - c.ret(c.i32_const(0)) - ), - c.call(prefix + "_fromMontgomery", c.getLocal("x"), AUX), - c.if( - c.call(intPrefix + "_gte", AUX, c.i32_const(pePlusOne)), - c.ret(c.i32_const(-1)) - ), - c.ret(c.i32_const(1)) - ); - } - - - function buildMReduct() { - const carries = module.alloc(n32*n32*8); - - const f = module.addFunction(prefix+"_mReduct"); - f.addParam("t", "i32"); - f.addParam("r", "i32"); - f.addLocal("np32", "i64"); - f.addLocal("c", "i64"); - f.addLocal("m", "i64"); - - const c = f.getCodeBuilder(); - - const np32 = Number(0x100000000n - modInv$2(q, 0x100000000n)); - - f.addCode(c.setLocal("np32", c.i64_const(np32))); - - for (let i=0; i=n32) { - f.addCode( - c.i64_store32( - c.getLocal("r"), - (k-n32)*4, - c.getLocal(c0) - ) - ); - } - [c0, c1] = [c1, c0]; - f.addCode( - c.setLocal(c1, - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ) - ); - } - f.addCode( - c.i64_store32( - c.getLocal("r"), - n32*4-4, - c.getLocal(c0) - ) - ); - - f.addCode( - c.if( - c.i32_wrap_i64(c.getLocal(c1)), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - c.if( - c.call(intPrefix+"_gte", c.getLocal("r"), c.i32_const(pq) ), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - ) - ) - ); - } - - - function buildSquare() { - - const f = module.addFunction(prefix+"_square"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - f.addLocal("c0", "i64"); - f.addLocal("c1", "i64"); - f.addLocal("c0_old", "i64"); - f.addLocal("c1_old", "i64"); - f.addLocal("np32", "i64"); - - - for (let i=0;i>1) )&&(i>1, k>>1) - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ) - ) - ); - } - - // Add the old carry - - if (k>0) { - f.addCode( - c.setLocal(c0, - c.i64_add( - c.i64_and( - c.getLocal(c0), - c.i64_const(0xFFFFFFFF) - ), - c.i64_and( - c.getLocal(c0_old), - c.i64_const(0xFFFFFFFF) - ), - ) - ) - ); - - f.addCode( - c.setLocal(c1, - c.i64_add( - c.i64_add( - c.getLocal(c1), - c.i64_shr_u( - c.getLocal(c0), - c.i64_const(32) - ) - ), - c.getLocal(c1_old) - ) - ) - ); - } - - - for (let i=Math.max(1, k-n32+1); (i<=k)&&(i=n32) { - f.addCode( - c.i64_store32( - c.getLocal("r"), - (k-n32)*4, - c.getLocal(c0) - ) - ); - } - f.addCode( - c.setLocal( - c0_old, - c.getLocal(c1) - ), - c.setLocal( - c1_old, - c.i64_shr_u( - c.getLocal(c0_old), - c.i64_const(32) - ) - ) - ); - } - f.addCode( - c.i64_store32( - c.getLocal("r"), - n32*4-4, - c.getLocal(c0_old) - ) - ); - - f.addCode( - c.if( - c.i32_wrap_i64(c.getLocal(c1_old)), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - c.if( - c.call(intPrefix+"_gte", c.getLocal("r"), c.i32_const(pq) ), - c.drop(c.call(intPrefix+"_sub", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))), - ) - ) - ); - } - - - function buildSquareOld() { - const f = module.addFunction(prefix+"_squareOld"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call(prefix + "_mul", c.getLocal("x"), c.getLocal("x"), c.getLocal("r"))); - } - - function buildToMontgomery() { - const f = module.addFunction(prefix+"_toMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(prefix+"_mul", c.getLocal("x"), c.i32_const(pR2), c.getLocal("r"))); - } - - function buildFromMontgomery() { - - const pAux2 = module.alloc(n8*2); - - const f = module.addFunction(prefix+"_fromMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(intPrefix + "_copy", c.getLocal("x"), c.i32_const(pAux2) )); - f.addCode(c.call(intPrefix + "_zero", c.i32_const(pAux2 + n8) )); - f.addCode(c.call(prefix+"_mReduct", c.i32_const(pAux2), c.getLocal("r"))); - } - - function buildInverse() { - - const f = module.addFunction(prefix+ "_inverse"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(prefix + "_fromMontgomery", c.getLocal("x"), c.getLocal("r"))); - f.addCode(c.call(intPrefix + "_inverseMod", c.getLocal("r"), c.i32_const(pq), c.getLocal("r"))); - f.addCode(c.call(prefix + "_toMontgomery", c.getLocal("r"), c.getLocal("r"))); - } - - // Calculate various valuse needed for sqrt - - - let _nqr = 2n; - if (isPrime(q)) { - while (modPow$1(_nqr, _e, q) !== _minusOne) _nqr = _nqr + 1n; - } - - let s2 = 0; - let _t = _minusOne; - - while ((!isOdd$3(_t))&&(_t !== 0n)) { - s2++; - _t = _t >> 1n; - } - const pt = module.alloc(n8, utils$4.bigInt2BytesLE(_t, n8)); - - const _nqrToT = modPow$1(_nqr, _t, q); - const pNqrToT = module.alloc(utils$4.bigInt2BytesLE((_nqrToT << BigInt(n64*64)) % q, n8)); - - const _tPlusOneOver2 = (_t + 1n) >> 1n; - const ptPlusOneOver2 = module.alloc(n8, utils$4.bigInt2BytesLE(_tPlusOneOver2, n8)); - - function buildSqrt() { - - const f = module.addFunction(prefix+ "_sqrt"); - f.addParam("n", "i32"); - f.addParam("r", "i32"); - f.addLocal("m", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - - const c = f.getCodeBuilder(); - - const ONE = c.i32_const(pOne); - const C = c.i32_const(module.alloc(n8)); - const T = c.i32_const(module.alloc(n8)); - const R = c.i32_const(module.alloc(n8)); - const SQ = c.i32_const(module.alloc(n8)); - const B = c.i32_const(module.alloc(n8)); - - f.addCode( - - // If (n==0) return 0 - c.if( - c.call(prefix + "_isZero", c.getLocal("n")), - c.ret( - c.call(prefix + "_zero", c.getLocal("r")) - ) - ), - - c.setLocal("m", c.i32_const(s2)), - c.call(prefix + "_copy", c.i32_const(pNqrToT), C), - c.call(prefix + "_exp", c.getLocal("n"), c.i32_const(pt), c.i32_const(n8), T), - c.call(prefix + "_exp", c.getLocal("n"), c.i32_const(ptPlusOneOver2), c.i32_const(n8), R), - - c.block(c.loop( - c.br_if(1, c.call(prefix + "_eq", T, ONE)), - - c.call(prefix + "_square", T, SQ), - c.setLocal("i", c.i32_const(1)), - c.block(c.loop( - c.br_if(1, c.call(prefix + "_eq", SQ, ONE)), - c.call(prefix + "_square", SQ, SQ), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )), - - c.call(prefix + "_copy", C, B), - c.setLocal("j", c.i32_sub(c.i32_sub( c.getLocal("m"), c.getLocal("i")), c.i32_const(1)) ), - c.block(c.loop( - c.br_if(1, c.i32_eqz(c.getLocal("j"))), - c.call(prefix + "_square", B, B), - c.setLocal("j", c.i32_sub(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - - c.setLocal("m", c.getLocal("i")), - c.call(prefix + "_square", B, C), - c.call(prefix + "_mul", T, C, T), - c.call(prefix + "_mul", R, B, R), - - c.br(0) - )), - - c.if( - c.call(prefix + "_isNegative", R), - c.call(prefix + "_neg", R, c.getLocal("r")), - c.call(prefix + "_copy", R, c.getLocal("r")), - ) - ); - } - - function buildIsSquare() { - const f = module.addFunction(prefix+"_isSquare"); - f.addParam("n", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const ONE = c.i32_const(pOne); - const AUX = c.i32_const(module.alloc(n8)); - - f.addCode( - c.if( - c.call(prefix + "_isZero", c.getLocal("n")), - c.ret(c.i32_const(1)) - ), - c.call(prefix + "_exp", c.getLocal("n"), c.i32_const(pe), c.i32_const(n8), AUX), - c.call(prefix + "_eq", AUX, ONE) - ); - } - - - function buildLoad() { - const f = module.addFunction(prefix+"_load"); - f.addParam("scalar", "i32"); - f.addParam("scalarLen", "i32"); - f.addParam("r", "i32"); - f.addLocal("p", "i32"); - f.addLocal("l", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - const c = f.getCodeBuilder(); - - const R = c.i32_const(module.alloc(n8)); - const pAux = module.alloc(n8); - const AUX = c.i32_const(pAux); - - f.addCode( - c.call(intPrefix + "_zero", c.getLocal("r")), - c.setLocal("i", c.i32_const(n8)), - c.setLocal("p", c.getLocal("scalar")), - c.block(c.loop( - c.br_if(1, c.i32_gt_u(c.getLocal("i"), c.getLocal("scalarLen"))), - - c.if( - c.i32_eq(c.getLocal("i"), c.i32_const(n8)), - c.call(prefix + "_one", R), - c.call(prefix + "_mul", R, c.i32_const(pR2), R) - ), - c.call(prefix + "_mul", c.getLocal("p"), R, AUX), - c.call(prefix + "_add", c.getLocal("r"), AUX, c.getLocal("r")), - - c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(n8))), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(n8))), - c.br(0) - )), - - c.setLocal("l", c.i32_rem_u( c.getLocal("scalarLen"), c.i32_const(n8))), - c.if(c.i32_eqz(c.getLocal("l")), c.ret([])), - c.call(intPrefix + "_zero", AUX), - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if(1, c.i32_eq(c.getLocal("j"), c.getLocal("l"))), - - c.i32_store8( - c.getLocal("j"), - pAux, - c.i32_load8_u(c.getLocal("p")), - ), - c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(1))), - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - - c.if( - c.i32_eq(c.getLocal("i"), c.i32_const(n8)), - c.call(prefix + "_one", R), - c.call(prefix + "_mul", R, c.i32_const(pR2), R) - ), - c.call(prefix + "_mul", AUX, R, AUX), - c.call(prefix + "_add", c.getLocal("r"), AUX, c.getLocal("r")), - ); - } - - function buildTimesScalar() { - const f = module.addFunction(prefix+"_timesScalar"); - f.addParam("x", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLen", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const AUX = c.i32_const(module.alloc(n8)); - - f.addCode( - c.call(prefix + "_load", c.getLocal("scalar"), c.getLocal("scalarLen"), AUX), - c.call(prefix + "_toMontgomery", AUX, AUX), - c.call(prefix + "_mul", c.getLocal("x"), AUX, c.getLocal("r")), - ); - } - - function buildIsOne() { - const f = module.addFunction(prefix+"_isOne"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - f.addCode( - c.ret(c.call(intPrefix + "_eq", c.getLocal("x"), c.i32_const(pOne))) - ); - } - - - module.exportFunction(intPrefix + "_copy", prefix+"_copy"); - module.exportFunction(intPrefix + "_zero", prefix+"_zero"); - module.exportFunction(intPrefix + "_isZero", prefix+"_isZero"); - module.exportFunction(intPrefix + "_eq", prefix+"_eq"); - - buildIsOne(); - buildAdd(); - buildSub(); - buildNeg(); - buildMReduct(); - buildMul(); - buildSquare(); - buildSquareOld(); - buildToMontgomery(); - buildFromMontgomery(); - buildIsNegative(); - buildSign(); - buildInverse(); - buildOne(); - buildLoad(); - buildTimesScalar(); - buildBatchInverse$2(module, prefix); - buildBatchConvertion$1(module, prefix + "_batchToMontgomery", prefix + "_toMontgomery", n8, n8); - buildBatchConvertion$1(module, prefix + "_batchFromMontgomery", prefix + "_fromMontgomery", n8, n8); - buildBatchConvertion$1(module, prefix + "_batchNeg", prefix + "_neg", n8, n8); - buildBatchOp(module, prefix + "_batchAdd", prefix + "_add", n8, n8); - buildBatchOp(module, prefix + "_batchSub", prefix + "_sub", n8, n8); - buildBatchOp(module, prefix + "_batchMul", prefix + "_mul", n8, n8); - - module.exportFunction(prefix + "_add"); - module.exportFunction(prefix + "_sub"); - module.exportFunction(prefix + "_neg"); - module.exportFunction(prefix + "_isNegative"); - module.exportFunction(prefix + "_isOne"); - module.exportFunction(prefix + "_sign"); - module.exportFunction(prefix + "_mReduct"); - module.exportFunction(prefix + "_mul"); - module.exportFunction(prefix + "_square"); - module.exportFunction(prefix + "_squareOld"); - module.exportFunction(prefix + "_fromMontgomery"); - module.exportFunction(prefix + "_toMontgomery"); - module.exportFunction(prefix + "_inverse"); - module.exportFunction(prefix + "_one"); - module.exportFunction(prefix + "_load"); - module.exportFunction(prefix + "_timesScalar"); - buildExp$2( - module, - prefix + "_exp", - n8, - prefix + "_mul", - prefix + "_square", - intPrefix + "_copy", - prefix + "_one", - ); - module.exportFunction(prefix + "_exp"); - module.exportFunction(prefix + "_batchInverse"); - if (isPrime(q)) { - buildSqrt(); - buildIsSquare(); - module.exportFunction(prefix + "_sqrt"); - module.exportFunction(prefix + "_isSquare"); - } - module.exportFunction(prefix + "_batchToMontgomery"); - module.exportFunction(prefix + "_batchFromMontgomery"); - // console.log(module.functionIdxByName); - - return prefix; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -const buildF1m$2 =build_f1m; -const { bitLength: bitLength$3 } = bigint; - -var build_f1 = function buildF1(module, _q, _prefix, _f1mPrefix, _intPrefix) { - - const q = BigInt(_q); - const n64 = Math.floor((bitLength$3(q - 1n) - 1)/64) +1; - const n8 = n64*8; - - const prefix = _prefix || "f1"; - if (module.modules[prefix]) return prefix; // already builded - module.modules[prefix] = { - n64: n64 - }; - - const intPrefix = _intPrefix || "int"; - const f1mPrefix = buildF1m$2(module, q, _f1mPrefix, intPrefix); - - - const pR2 = module.modules[f1mPrefix].pR2; - const pq = module.modules[f1mPrefix].pq; - const pePlusOne = module.modules[f1mPrefix].pePlusOne; - - function buildMul() { - const pAux1 = module.alloc(n8); - - const f = module.addFunction(prefix+ "_mul"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(f1mPrefix + "_mul", c.getLocal("x"), c.getLocal("y"), c.i32_const(pAux1))); - f.addCode(c.call(f1mPrefix + "_mul", c.i32_const(pAux1), c.i32_const(pR2), c.getLocal("r"))); - } - - function buildSquare() { - const f = module.addFunction(prefix+"_square"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call(prefix + "_mul", c.getLocal("x"), c.getLocal("x"), c.getLocal("r"))); - } - - - function buildInverse() { - - const f = module.addFunction(prefix+ "_inverse"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - f.addCode(c.call(intPrefix + "_inverseMod", c.getLocal("x"), c.i32_const(pq), c.getLocal("r"))); - } - - function buildIsNegative() { - const f = module.addFunction(prefix+"_isNegative"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(intPrefix + "_gte", c.getLocal("x"), c.i32_const(pePlusOne) ) - ); - } - - - buildMul(); - buildSquare(); - buildInverse(); - buildIsNegative(); - module.exportFunction(f1mPrefix + "_add", prefix + "_add"); - module.exportFunction(f1mPrefix + "_sub", prefix + "_sub"); - module.exportFunction(f1mPrefix + "_neg", prefix + "_neg"); - module.exportFunction(prefix + "_mul"); - module.exportFunction(prefix + "_square"); - module.exportFunction(prefix + "_inverse"); - module.exportFunction(prefix + "_isNegative"); - module.exportFunction(f1mPrefix + "_copy", prefix+"_copy"); - module.exportFunction(f1mPrefix + "_zero", prefix+"_zero"); - module.exportFunction(f1mPrefix + "_one", prefix+"_one"); - module.exportFunction(f1mPrefix + "_isZero", prefix+"_isZero"); - module.exportFunction(f1mPrefix + "_eq", prefix+"_eq"); - - return prefix; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -const buildExp$1 = build_timesscalar; -const buildBatchInverse$1 = build_batchinverse; -const utils$3 = utils$5; - -var build_f2m = function buildF2m(module, mulNonResidueFn, prefix, f1mPrefix) { - - if (module.modules[prefix]) return prefix; // already builded - - const f1n8 = module.modules[f1mPrefix].n64*8; - const q = module.modules[f1mPrefix].q; - - module.modules[prefix] = { - n64: module.modules[f1mPrefix].n64*2 - }; - - function buildAdd() { - const f = module.addFunction(prefix+"_add"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_add", x0, y0, r0), - c.call(f1mPrefix+"_add", x1, y1, r1), - ); - } - - function buildTimesScalar() { - const f = module.addFunction(prefix+"_timesScalar"); - f.addParam("x", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLen", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_timesScalar", x0, c.getLocal("scalar"), c.getLocal("scalarLen"), r0), - c.call(f1mPrefix+"_timesScalar", x1, c.getLocal("scalar"), c.getLocal("scalarLen"), r1), - ); - } - - function buildSub() { - const f = module.addFunction(prefix+"_sub"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_sub", x0, y0, r0), - c.call(f1mPrefix+"_sub", x1, y1, r1), - ); - } - - function buildNeg() { - const f = module.addFunction(prefix+"_neg"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_neg", x0, r0), - c.call(f1mPrefix+"_neg", x1, r1), - ); - } - - function buildConjugate() { - const f = module.addFunction(prefix+"_conjugate"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_copy", x0, r0), - c.call(f1mPrefix+"_neg", x1, r1), - ); - } - - - function buildIsNegative() { - const f = module.addFunction(prefix+"_isNegative"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.if( - c.call(f1mPrefix+"_isZero", x1), - c.ret(c.call(f1mPrefix+"_isNegative", x0)) - ), - c.ret(c.call(f1mPrefix+"_isNegative", x1)) - ); - } - - function buildMul() { - const f = module.addFunction(prefix+"_mul"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - const A = c.i32_const(module.alloc(f1n8)); - const B = c.i32_const(module.alloc(f1n8)); - const C = c.i32_const(module.alloc(f1n8)); - const D = c.i32_const(module.alloc(f1n8)); - - - f.addCode( - c.call(f1mPrefix + "_mul", x0, y0, A), // A = x0*y0 - c.call(f1mPrefix + "_mul", x1, y1, B), // B = x1*y1 - - c.call(f1mPrefix + "_add", x0, x1, C), // C = x0 + x1 - c.call(f1mPrefix + "_add", y0, y1, D), // D = y0 + y1 - c.call(f1mPrefix + "_mul", C, D, C), // C = (x0 + x1)*(y0 + y1) = x0*y0+x0*y1+x1*y0+x1*y1 - - // c.call(f1mPrefix + "_mul", B, c.i32_const(pNonResidue), r0), // r0 = nr*(x1*y1) - c.call(mulNonResidueFn, B, r0), // r0 = nr*(x1*y1) - c.call(f1mPrefix + "_add", A, r0, r0), // r0 = x0*y0 + nr*(x1*y1) - c.call(f1mPrefix + "_add", A, B, r1), // r1 = x0*y0+x1*y1 - c.call(f1mPrefix + "_sub", C, r1, r1) // r1 = x0*y0+x0*y1+x1*y0+x1*y1 - x0*y0+x1*y1 = x0*y1+x1*y0 - ); - - } - - function buildMul1() { - const f = module.addFunction(prefix+"_mul1"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y = c.getLocal("y"); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - - f.addCode( - c.call(f1mPrefix + "_mul", x0, y, r0), // A = x0*y - c.call(f1mPrefix + "_mul", x1, y, r1), // B = x1*y - ); - } - - function buildSquare() { - const f = module.addFunction(prefix+"_square"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - const AB = c.i32_const(module.alloc(f1n8)); - const APB = c.i32_const(module.alloc(f1n8)); - const APNB = c.i32_const(module.alloc(f1n8)); - const ABPNAB = c.i32_const(module.alloc(f1n8)); - - - f.addCode( - // AB = x0*y1 - c.call(f1mPrefix + "_mul", x0, x1, AB), - - // APB = x0+y1 - c.call(f1mPrefix + "_add", x0, x1, APB), - - // APBN0 = x0 + nr*x1 - c.call(mulNonResidueFn, x1, APNB), - c.call(f1mPrefix + "_add", x0, APNB, APNB), - - // ABPNAB = ab + nr*ab - c.call(mulNonResidueFn, AB, ABPNAB), - c.call(f1mPrefix + "_add", ABPNAB, AB, ABPNAB), - - // r0 = APB * APNB - ABPNAB - c.call(f1mPrefix + "_mul", APB, APNB, r0), - c.call(f1mPrefix + "_sub", r0, ABPNAB, r0), - - // r1 = AB + AB - c.call(f1mPrefix + "_add", AB, AB, r1), - ); - - } - - - function buildToMontgomery() { - const f = module.addFunction(prefix+"_toMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_toMontgomery", x0, r0), - c.call(f1mPrefix+"_toMontgomery", x1, r1) - ); - } - - function buildFromMontgomery() { - const f = module.addFunction(prefix+"_fromMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_fromMontgomery", x0, r0), - c.call(f1mPrefix+"_fromMontgomery", x1, r1) - ); - } - - function buildCopy() { - const f = module.addFunction(prefix+"_copy"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_copy", x0, r0), - c.call(f1mPrefix+"_copy", x1, r1) - ); - } - - function buildZero() { - const f = module.addFunction(prefix+"_zero"); - f.addParam("x", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_zero", x0), - c.call(f1mPrefix+"_zero", x1) - ); - } - - function buildOne() { - const f = module.addFunction(prefix+"_one"); - f.addParam("x", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_one", x0), - c.call(f1mPrefix+"_zero", x1) - ); - } - - function buildEq() { - const f = module.addFunction(prefix+"_eq"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - - f.addCode( - c.i32_and( - c.call(f1mPrefix+"_eq", x0, y0), - c.call(f1mPrefix+"_eq", x1, y1) - ) - ); - } - - function buildIsZero() { - const f = module.addFunction(prefix+"_isZero"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.i32_and( - c.call(f1mPrefix+"_isZero", x0), - c.call(f1mPrefix+"_isZero", x1) - ) - ); - } - - function buildInverse() { - const f = module.addFunction(prefix+"_inverse"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - - const t0 = c.i32_const(module.alloc(f1n8)); - const t1 = c.i32_const(module.alloc(f1n8)); - const t2 = c.i32_const(module.alloc(f1n8)); - const t3 = c.i32_const(module.alloc(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_square", x0, t0), - c.call(f1mPrefix+"_square", x1, t1), - // c.call(f1mPrefix+"_mul", t1, c.i32_const(pNonResidue), t2), - c.call(mulNonResidueFn, t1, t2), - - c.call(f1mPrefix+"_sub", t0, t2, t2), - c.call(f1mPrefix+"_inverse", t2, t3), - - c.call(f1mPrefix+"_mul", x0, t3, r0), - c.call(f1mPrefix+"_mul", x1, t3, r1), - c.call(f1mPrefix+"_neg", r1, r1), - ); - } - - - function buildSign() { - const f = module.addFunction(prefix+"_sign"); - f.addParam("x", "i32"); - f.addLocal("s", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.setLocal("s" , c.call( f1mPrefix + "_sign", x1)), - c.if( - c.getLocal("s"), - c.ret(c.getLocal("s")) - ), - c.ret(c.call( f1mPrefix + "_sign", x0)) - ); - } - - function buildIsOne() { - const f = module.addFunction(prefix+"_isOne"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - - f.addCode( - c.ret(c.i32_and( - c.call(f1mPrefix + "_isOne", x0), - c.call(f1mPrefix + "_isZero", x1), - )) - ); - } - - - // Check here: https://eprint.iacr.org/2012/685.pdf - // Alg 9adj - function buildSqrt() { - - const f = module.addFunction(prefix+"_sqrt"); - f.addParam("a", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - // BigInt can't take `undefined` so we use `|| 0` - const e34 = c.i32_const(module.alloc(utils$3.bigInt2BytesLE((BigInt(q || 0) - 3n) / 4n, f1n8 ))); - // BigInt can't take `undefined` so we use `|| 0` - const e12 = c.i32_const(module.alloc(utils$3.bigInt2BytesLE((BigInt(q || 0) - 1n) / 2n, f1n8 ))); - - const a = c.getLocal("a"); - const a1 = c.i32_const(module.alloc(f1n8*2)); - const alpha = c.i32_const(module.alloc(f1n8*2)); - const a0 = c.i32_const(module.alloc(f1n8*2)); - const pn1 = module.alloc(f1n8*2); - const n1 = c.i32_const(pn1); - const n1a = c.i32_const(pn1); - const n1b = c.i32_const(pn1+f1n8); - const x0 = c.i32_const(module.alloc(f1n8*2)); - const b = c.i32_const(module.alloc(f1n8*2)); - - f.addCode( - - c.call(prefix + "_one", n1), - c.call(prefix + "_neg", n1, n1), - - // const a1 = F.pow(a, F.sqrt_e34); - c.call(prefix + "_exp", a, e34, c.i32_const(f1n8), a1), - - // const a1 = F.pow(a, F.sqrt_e34); - c.call(prefix + "_square", a1, alpha), - c.call(prefix + "_mul", a, alpha, alpha), - - // const a0 = F.mul(F.frobenius(1, alfa), alfa); - c.call(prefix + "_conjugate", alpha, a0), - c.call(prefix + "_mul", a0, alpha, a0), - - // if (F.eq(a0, F.negone)) return null; - c.if(c.call(prefix + "_eq",a0,n1), c.unreachable() ), - - // const x0 = F.mul(a1, a); - c.call(prefix + "_mul", a1, a, x0), - - // if (F.eq(alfa, F.negone)) { - c.if( - c.call(prefix + "_eq", alpha, n1), - [ - // x = F.mul(x0, [F.F.zero, F.F.one]); - ...c.call(f1mPrefix + "_zero", n1a), - ...c.call(f1mPrefix + "_one", n1b), - ...c.call(prefix + "_mul", n1, x0, c.getLocal("pr")), - ], - [ - // const b = F.pow(F.add(F.one, alfa), F.sqrt_e12); - ...c.call(prefix + "_one", b), - ...c.call(prefix + "_add", b, alpha, b), - ...c.call(prefix + "_exp", b, e12, c.i32_const(f1n8), b), - - // x = F.mul(b, x0); - ...c.call(prefix + "_mul", b, x0, c.getLocal("pr")), - ] - ) - ); - - } - - - function buildIsSquare() { - - const f = module.addFunction(prefix+"_isSquare"); - f.addParam("a", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - // BigInt can't take `undefined` so we use `|| 0` - const e34 = c.i32_const(module.alloc(utils$3.bigInt2BytesLE((BigInt(q || 0) - 3n) / 4n, f1n8 ))); - - const a = c.getLocal("a"); - const a1 = c.i32_const(module.alloc(f1n8*2)); - const alpha = c.i32_const(module.alloc(f1n8*2)); - const a0 = c.i32_const(module.alloc(f1n8*2)); - const pn1 = module.alloc(f1n8*2); - const n1 = c.i32_const(pn1); - - f.addCode( - - c.call(prefix + "_one", n1), - c.call(prefix + "_neg", n1, n1), - - // const a1 = F.pow(a, F.sqrt_e34); - c.call(prefix + "_exp", a, e34, c.i32_const(f1n8), a1), - - // const a1 = F.pow(a, F.sqrt_e34); - c.call(prefix + "_square", a1, alpha), - c.call(prefix + "_mul", a, alpha, alpha), - - // const a0 = F.mul(F.frobenius(1, alfa), alfa); - c.call(prefix + "_conjugate", alpha, a0), - c.call(prefix + "_mul", a0, alpha, a0), - - // if (F.eq(a0, F.negone)) return null; - c.if( - c.call( - prefix + "_eq", - a0, - n1 - ), - c.ret(c.i32_const(0)) - ), - c.ret(c.i32_const(1)) - ); - - } - - - buildIsZero(); - buildIsOne(); - buildZero(); - buildOne(); - buildCopy(); - buildMul(); - buildMul1(); - buildSquare(); - buildAdd(); - buildSub(); - buildNeg(); - buildConjugate(); - buildToMontgomery(); - buildFromMontgomery(); - buildEq(); - buildInverse(); - buildTimesScalar(); - buildSign(); - buildIsNegative(); - - module.exportFunction(prefix + "_isZero"); - module.exportFunction(prefix + "_isOne"); - module.exportFunction(prefix + "_zero"); - module.exportFunction(prefix + "_one"); - module.exportFunction(prefix + "_copy"); - module.exportFunction(prefix + "_mul"); - module.exportFunction(prefix + "_mul1"); - module.exportFunction(prefix + "_square"); - module.exportFunction(prefix + "_add"); - module.exportFunction(prefix + "_sub"); - module.exportFunction(prefix + "_neg"); - module.exportFunction(prefix + "_sign"); - module.exportFunction(prefix + "_conjugate"); - module.exportFunction(prefix + "_fromMontgomery"); - module.exportFunction(prefix + "_toMontgomery"); - module.exportFunction(prefix + "_eq"); - module.exportFunction(prefix + "_inverse"); - buildBatchInverse$1(module, prefix); - buildExp$1( - module, - prefix + "_exp", - f1n8*2, - prefix + "_mul", - prefix + "_square", - prefix + "_copy", - prefix + "_one", - ); - buildSqrt(); - buildIsSquare(); - - module.exportFunction(prefix + "_exp"); - module.exportFunction(prefix + "_timesScalar"); - module.exportFunction(prefix + "_batchInverse"); - module.exportFunction(prefix + "_sqrt"); - module.exportFunction(prefix + "_isSquare"); - module.exportFunction(prefix + "_isNegative"); - - - return prefix; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -const buildExp = build_timesscalar; -const buildBatchInverse = build_batchinverse; - -var build_f3m = function buildF3m(module, mulNonResidueFn, prefix, f1mPrefix) { - - if (module.modules[prefix]) return prefix; // already builded - - const f1n8 = module.modules[f1mPrefix].n64*8; - module.modules[prefix] = { - n64: module.modules[f1mPrefix].n64*3 - }; - - function buildAdd() { - const f = module.addFunction(prefix+"_add"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const y2 = c.i32_add(c.getLocal("y"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_add", x0, y0, r0), - c.call(f1mPrefix+"_add", x1, y1, r1), - c.call(f1mPrefix+"_add", x2, y2, r2), - ); - } - - function buildTimesScalar() { - const f = module.addFunction(prefix+"_timesScalar"); - f.addParam("x", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLen", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_timesScalar", x0, c.getLocal("scalar"), c.getLocal("scalarLen"), r0), - c.call(f1mPrefix+"_timesScalar", x1, c.getLocal("scalar"), c.getLocal("scalarLen"), r1), - c.call(f1mPrefix+"_timesScalar", x2, c.getLocal("scalar"), c.getLocal("scalarLen"), r2), - ); - } - - - function buildSub() { - const f = module.addFunction(prefix+"_sub"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const y2 = c.i32_add(c.getLocal("y"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_sub", x0, y0, r0), - c.call(f1mPrefix+"_sub", x1, y1, r1), - c.call(f1mPrefix+"_sub", x2, y2, r2), - ); - } - - function buildNeg() { - const f = module.addFunction(prefix+"_neg"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_neg", x0, r0), - c.call(f1mPrefix+"_neg", x1, r1), - c.call(f1mPrefix+"_neg", x2, r2), - ); - } - - function buildIsNegative() { - const f = module.addFunction(prefix+"_isNegative"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - - f.addCode( - c.if( - c.call(f1mPrefix+"_isZero", x2), - c.if( - c.call(f1mPrefix+"_isZero", x1), - c.ret(c.call(f1mPrefix+"_isNegative", x0)), - c.ret(c.call(f1mPrefix+"_isNegative", x1)) - ) - ), - c.ret(c.call(f1mPrefix+"_isNegative", x2)) - ); - } - - - function buildMul() { - const f = module.addFunction(prefix+"_mul"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.addParam("r", "i32"); - - const cd = f.getCodeBuilder(); - - const a = cd.getLocal("x"); - const b = cd.i32_add(cd.getLocal("x"), cd.i32_const(f1n8)); - const c = cd.i32_add(cd.getLocal("x"), cd.i32_const(2*f1n8)); - const A = cd.getLocal("y"); - const B = cd.i32_add(cd.getLocal("y"), cd.i32_const(f1n8)); - const C = cd.i32_add(cd.getLocal("y"), cd.i32_const(2*f1n8)); - const r0 = cd.getLocal("r"); - const r1 = cd.i32_add(cd.getLocal("r"), cd.i32_const(f1n8)); - const r2 = cd.i32_add(cd.getLocal("r"), cd.i32_const(2*f1n8)); - - const aA = cd.i32_const(module.alloc(f1n8)); - const bB = cd.i32_const(module.alloc(f1n8)); - const cC = cd.i32_const(module.alloc(f1n8)); - const a_b = cd.i32_const(module.alloc(f1n8)); - const A_B = cd.i32_const(module.alloc(f1n8)); - const a_c = cd.i32_const(module.alloc(f1n8)); - const A_C = cd.i32_const(module.alloc(f1n8)); - const b_c = cd.i32_const(module.alloc(f1n8)); - const B_C = cd.i32_const(module.alloc(f1n8)); - const aA_bB = cd.i32_const(module.alloc(f1n8)); - const aA_cC = cd.i32_const(module.alloc(f1n8)); - const bB_cC = cd.i32_const(module.alloc(f1n8)); - const AUX = cd.i32_const(module.alloc(f1n8)); - - - f.addCode( - cd.call(f1mPrefix + "_mul", a, A, aA), - cd.call(f1mPrefix + "_mul", b, B, bB), - cd.call(f1mPrefix + "_mul", c, C, cC), - - cd.call(f1mPrefix + "_add", a, b, a_b), - cd.call(f1mPrefix + "_add", A, B, A_B), - cd.call(f1mPrefix + "_add", a, c, a_c), - cd.call(f1mPrefix + "_add", A, C, A_C), - cd.call(f1mPrefix + "_add", b, c, b_c), - cd.call(f1mPrefix + "_add", B, C, B_C), - - cd.call(f1mPrefix + "_add", aA, bB, aA_bB), - cd.call(f1mPrefix + "_add", aA, cC, aA_cC), - cd.call(f1mPrefix + "_add", bB, cC, bB_cC), - - cd.call(f1mPrefix + "_mul", b_c, B_C, r0), - cd.call(f1mPrefix + "_sub", r0, bB_cC, r0), - cd.call(mulNonResidueFn, r0, r0), - cd.call(f1mPrefix + "_add", aA, r0, r0), - - cd.call(f1mPrefix + "_mul", a_b, A_B, r1), - cd.call(f1mPrefix + "_sub", r1, aA_bB, r1), - cd.call(mulNonResidueFn, cC, AUX), - cd.call(f1mPrefix + "_add", r1, AUX, r1), - - cd.call(f1mPrefix + "_mul", a_c, A_C, r2), - cd.call(f1mPrefix + "_sub", r2, aA_cC, r2), - cd.call(f1mPrefix + "_add", r2, bB, r2), - ); - - } - - function buildSquare() { - const f = module.addFunction(prefix+"_square"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const A = c.getLocal("x"); - const B = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const C = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - const s0 = c.i32_const(module.alloc(f1n8)); - const ab = c.i32_const(module.alloc(f1n8)); - const s1 = c.i32_const(module.alloc(f1n8)); - const s2 = c.i32_const(module.alloc(f1n8)); - const bc = c.i32_const(module.alloc(f1n8)); - const s3 = c.i32_const(module.alloc(f1n8)); - const s4 = c.i32_const(module.alloc(f1n8)); - - - f.addCode( - - c.call(f1mPrefix + "_square", A, s0), - c.call(f1mPrefix + "_mul", A, B, ab), - c.call(f1mPrefix + "_add", ab, ab, s1), - - c.call(f1mPrefix + "_sub", A, B, s2), - c.call(f1mPrefix + "_add", s2, C, s2), - c.call(f1mPrefix + "_square", s2, s2), - - c.call(f1mPrefix + "_mul", B, C, bc), - c.call(f1mPrefix + "_add", bc, bc, s3), - - c.call(f1mPrefix + "_square", C, s4), - - c.call(mulNonResidueFn, s3, r0), - c.call(f1mPrefix + "_add", s0, r0, r0), - - c.call(mulNonResidueFn, s4, r1), - c.call(f1mPrefix + "_add", s1, r1, r1), - - c.call(f1mPrefix + "_add", s0, s4, r2), - c.call(f1mPrefix + "_sub", s3, r2, r2), - c.call(f1mPrefix + "_add", s2, r2, r2), - c.call(f1mPrefix + "_add", s1, r2, r2), - ); - - } - - - function buildToMontgomery() { - const f = module.addFunction(prefix+"_toMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_toMontgomery", x0, r0), - c.call(f1mPrefix+"_toMontgomery", x1, r1), - c.call(f1mPrefix+"_toMontgomery", x2, r2) - ); - } - - function buildFromMontgomery() { - const f = module.addFunction(prefix+"_fromMontgomery"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_fromMontgomery", x0, r0), - c.call(f1mPrefix+"_fromMontgomery", x1, r1), - c.call(f1mPrefix+"_fromMontgomery", x2, r2) - ); - } - - function buildCopy() { - const f = module.addFunction(prefix+"_copy"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_copy", x0, r0), - c.call(f1mPrefix+"_copy", x1, r1), - c.call(f1mPrefix+"_copy", x2, r2), - ); - } - - function buildZero() { - const f = module.addFunction(prefix+"_zero"); - f.addParam("x", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_zero", x0), - c.call(f1mPrefix+"_zero", x1), - c.call(f1mPrefix+"_zero", x2), - ); - } - - function buildOne() { - const f = module.addFunction(prefix+"_one"); - f.addParam("x", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - - f.addCode( - c.call(f1mPrefix+"_one", x0), - c.call(f1mPrefix+"_zero", x1), - c.call(f1mPrefix+"_zero", x2), - ); - } - - function buildEq() { - const f = module.addFunction(prefix+"_eq"); - f.addParam("x", "i32"); - f.addParam("y", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const y0 = c.getLocal("y"); - const y1 = c.i32_add(c.getLocal("y"), c.i32_const(f1n8)); - const y2 = c.i32_add(c.getLocal("y"), c.i32_const(2*f1n8)); - - f.addCode( - c.i32_and( - c.i32_and( - c.call(f1mPrefix+"_eq", x0, y0), - c.call(f1mPrefix+"_eq", x1, y1), - ), - c.call(f1mPrefix+"_eq", x2, y2) - ) - ); - } - - function buildIsZero() { - const f = module.addFunction(prefix+"_isZero"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - - f.addCode( - c.i32_and( - c.i32_and( - c.call(f1mPrefix+"_isZero", x0), - c.call(f1mPrefix+"_isZero", x1) - ), - c.call(f1mPrefix+"_isZero", x2) - ) - ); - } - - function buildInverse() { - const f = module.addFunction(prefix+"_inverse"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - const r0 = c.getLocal("r"); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(f1n8)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(2*f1n8)); - - const t0 = c.i32_const(module.alloc(f1n8)); - const t1 = c.i32_const(module.alloc(f1n8)); - const t2 = c.i32_const(module.alloc(f1n8)); - const t3 = c.i32_const(module.alloc(f1n8)); - const t4 = c.i32_const(module.alloc(f1n8)); - const t5 = c.i32_const(module.alloc(f1n8)); - const c0 = c.i32_const(module.alloc(f1n8)); - const c1 = c.i32_const(module.alloc(f1n8)); - const c2 = c.i32_const(module.alloc(f1n8)); - const t6 = c.i32_const(module.alloc(f1n8)); - const AUX = c.i32_const(module.alloc(f1n8)); - - f.addCode( - c.call(f1mPrefix+"_square", x0, t0), - c.call(f1mPrefix+"_square", x1, t1), - c.call(f1mPrefix+"_square", x2, t2), - c.call(f1mPrefix+"_mul", x0, x1, t3), - c.call(f1mPrefix+"_mul", x0, x2, t4), - c.call(f1mPrefix+"_mul", x1, x2, t5), - - c.call(mulNonResidueFn, t5, c0), - c.call(f1mPrefix+"_sub", t0, c0, c0), - - c.call(mulNonResidueFn, t2, c1), - c.call(f1mPrefix+"_sub", c1, t3, c1), - - c.call(f1mPrefix+"_sub", t1, t4, c2), - - c.call(f1mPrefix+"_mul", x2, c1, t6), - c.call(f1mPrefix+"_mul", x1, c2, AUX), - c.call(f1mPrefix+"_add", t6, AUX, t6), - c.call(mulNonResidueFn, t6, t6), - c.call(f1mPrefix+"_mul", x0, c0, AUX), - c.call(f1mPrefix+"_add", AUX, t6, t6), - - c.call(f1mPrefix+"_inverse", t6, t6), - - c.call(f1mPrefix+"_mul", t6, c0, r0), - c.call(f1mPrefix+"_mul", t6, c1, r1), - c.call(f1mPrefix+"_mul", t6, c2, r2) - ); - } - - - function buildSign() { - const f = module.addFunction(prefix+"_sign"); - f.addParam("x", "i32"); - f.addLocal("s", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(2*f1n8)); - - f.addCode( - c.setLocal("s" , c.call( f1mPrefix + "_sign", x2)), - c.if( - c.getLocal("s"), - c.ret(c.getLocal("s")) - ), - c.setLocal("s" , c.call( f1mPrefix + "_sign", x1)), - c.if( - c.getLocal("s"), - c.ret(c.getLocal("s")) - ), - c.ret(c.call( f1mPrefix + "_sign", x0)) - ); - } - - function buildIsOne() { - const f = module.addFunction(prefix+"_isOne"); - f.addParam("x", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(f1n8*2)); - - f.addCode( - c.ret( - c.i32_and( - c.i32_and( - c.call(f1mPrefix + "_isOne", x0), - c.call(f1mPrefix + "_isZero", x1) - ), - c.call(f1mPrefix + "_isZero", x2) - ) - ) - ); - } - - buildIsZero(); - buildIsOne(); - buildZero(); - buildOne(); - buildCopy(); - buildMul(); - buildSquare(); - buildAdd(); - buildSub(); - buildNeg(); - buildSign(); - buildToMontgomery(); - buildFromMontgomery(); - buildEq(); - buildInverse(); - buildTimesScalar(); - buildIsNegative(); - - module.exportFunction(prefix + "_isZero"); - module.exportFunction(prefix + "_isOne"); - module.exportFunction(prefix + "_zero"); - module.exportFunction(prefix + "_one"); - module.exportFunction(prefix + "_copy"); - module.exportFunction(prefix + "_mul"); - module.exportFunction(prefix + "_square"); - module.exportFunction(prefix + "_add"); - module.exportFunction(prefix + "_sub"); - module.exportFunction(prefix + "_neg"); - module.exportFunction(prefix + "_sign"); - module.exportFunction(prefix + "_fromMontgomery"); - module.exportFunction(prefix + "_toMontgomery"); - module.exportFunction(prefix + "_eq"); - module.exportFunction(prefix + "_inverse"); - buildBatchInverse(module, prefix); - buildExp( - module, - prefix + "_exp", - f1n8*3, - prefix + "_mul", - prefix + "_square", - prefix + "_copy", - prefix + "_one" - ); - module.exportFunction(prefix + "_exp"); - module.exportFunction(prefix + "_timesScalar"); - module.exportFunction(prefix + "_batchInverse"); - module.exportFunction(prefix + "_isNegative"); - - return prefix; -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -var build_timesscalarnaf = function buildTimesScalarNAF(module, fnName, elementLen, opAB, opAA, opAmB, opCopy, opInit) { - - const f = module.addFunction(fnName); - f.addParam("base", "i32"); - f.addParam("scalar", "i32"); - f.addParam("scalarLength", "i32"); - f.addParam("r", "i32"); - f.addLocal("old0", "i32"); - f.addLocal("nbits", "i32"); - f.addLocal("i", "i32"); - f.addLocal("last", "i32"); - f.addLocal("cur", "i32"); - f.addLocal("carry", "i32"); - f.addLocal("p", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(elementLen)); - - function getBit(IDX) { - return c.i32_and( - c.i32_shr_u( - c.i32_load( - c.i32_add( - c.getLocal("scalar"), - c.i32_and( - c.i32_shr_u( - IDX, - c.i32_const(3) - ), - c.i32_const(0xFFFFFFFC) - ) - ) - ), - c.i32_and( - IDX, - c.i32_const(0x1F) - ) - ), - c.i32_const(1) - ); - } - - function pushBit(b) { - return [ - ...c.i32_store8( - c.getLocal("p"), - c.i32_const(b) - ), - ...c.setLocal( - "p", - c.i32_add( - c.getLocal("p"), - c.i32_const(1) - ) - ) - ]; - } - - f.addCode( - c.if( - c.i32_eqz(c.getLocal("scalarLength")), - [ - ...c.call(opInit, c.getLocal("r")), - ...c.ret([]) - ] - ), - c.setLocal("nbits", c.i32_shl(c.getLocal("scalarLength"), c.i32_const(3))), - c.setLocal("old0", c.i32_load(c.i32_const(0))), - c.setLocal("p", c.getLocal("old0")), - c.i32_store( - c.i32_const(0), - c.i32_and( - c.i32_add( - c.i32_add( - c.getLocal("old0"), - c.i32_const(32) - ), - c.getLocal("nbits") - ), - c.i32_const(0xFFFFFFF8) - ) - ), - c.setLocal("i", c.i32_const(1)), - - c.setLocal("last",getBit(c.i32_const(0))), - c.setLocal("carry",c.i32_const(0)), - - c.block(c.loop( - c.br_if(1, c.i32_eq( c.getLocal("i"), c.getLocal("nbits"))), - - c.setLocal("cur", getBit(c.getLocal("i"))), - c.if( c.getLocal("last"), - c.if( c.getLocal("cur"), - c.if(c.getLocal("carry"), - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(1)), - ...pushBit(1) - ] - , - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(1)), - ...pushBit(255) - ], - ), - c.if(c.getLocal("carry"), - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(1)), - ...pushBit(255) - ] - , - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(0)), - ...pushBit(1) - ], - ), - ), - c.if( c.getLocal("cur"), - c.if(c.getLocal("carry"), - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(1)), - ...pushBit(0) - ] - , - [ - ...c.setLocal("last", c.i32_const(1)), - ...c.setLocal("carry", c.i32_const(0)), - ...pushBit(0) - ], - ), - c.if(c.getLocal("carry"), - [ - ...c.setLocal("last", c.i32_const(1)), - ...c.setLocal("carry", c.i32_const(0)), - ...pushBit(0) - ] - , - [ - ...c.setLocal("last", c.i32_const(0)), - ...c.setLocal("carry", c.i32_const(0)), - ...pushBit(0) - ], - ), - ) - ), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )), - - c.if( c.getLocal("last"), - c.if(c.getLocal("carry"), - [ - ...pushBit(255), - ...pushBit(0), - ...pushBit(1) - ] - , - [ - ...pushBit(1) - ], - ), - c.if(c.getLocal("carry"), - [ - ...pushBit(0), - ...pushBit(1) - ] - ), - ), - - c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), - - // p already points to the last bit - - c.call(opCopy, c.getLocal("base"), aux), - - c.call(opInit, c.getLocal("r")), - - c.block(c.loop( - - - c.call(opAA, c.getLocal("r"), c.getLocal("r")), - - - c.setLocal("cur", - c.i32_load8_u( - c.getLocal("p") - ) - ), - - c.if( - c.getLocal("cur"), - c.if( - c.i32_eq(c.getLocal("cur"), c.i32_const(1)), - c.call(opAB, c.getLocal("r"), aux, c.getLocal("r")), - c.call(opAmB, c.getLocal("r"), aux, c.getLocal("r")), - ) - ), - - c.br_if(1, c.i32_eq( c.getLocal("old0"), c.getLocal("p"))), - c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), - c.br(0) - - )), - - c.i32_store( c.i32_const(0), c.getLocal("old0")) - - ); - -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -var build_multiexp = function buildMultiexp(module, prefix, fnName, opAdd, n8b) { - - const n64g = module.modules[prefix].n64; - const n8g = n64g*8; - - function buildGetChunk() { - const f = module.addFunction(fnName + "_getChunk"); - f.addParam("pScalar", "i32"); - f.addParam("scalarSize", "i32"); // Number of bytes of the scalar - f.addParam("startBit", "i32"); // Bit to start extract - f.addParam("chunkSize", "i32"); // Chunk size in bits - f.addLocal("bitsToEnd", "i32"); - f.addLocal("mask", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal("bitsToEnd", - c.i32_sub( - c.i32_mul( - c.getLocal("scalarSize"), - c.i32_const(8) - ), - c.getLocal("startBit") - ) - ), - c.if( - c.i32_gt_s( - c.getLocal("chunkSize"), - c.getLocal("bitsToEnd") - ), - c.setLocal( - "mask", - c.i32_sub( - c.i32_shl( - c.i32_const(1), - c.getLocal("bitsToEnd") - ), - c.i32_const(1) - ) - ), - c.setLocal( - "mask", - c.i32_sub( - c.i32_shl( - c.i32_const(1), - c.getLocal("chunkSize") - ), - c.i32_const(1) - ) - ) - ), - c.i32_and( - c.i32_shr_u( - c.i32_load( - c.i32_add( - c.getLocal("pScalar"), - c.i32_shr_u( - c.getLocal("startBit"), - c.i32_const(3) - ) - ), - 0, // offset - 0 // align to byte. - ), - c.i32_and( - c.getLocal("startBit"), - c.i32_const(0x7) - ) - ), - c.getLocal("mask") - ) - ); - } - - function buildMutiexpChunk() { - const f = module.addFunction(fnName + "_chunk"); - f.addParam("pBases", "i32"); - f.addParam("pScalars", "i32"); - f.addParam("scalarSize", "i32"); // Number of points - f.addParam("n", "i32"); // Number of points - f.addParam("startBit", "i32"); // bit where it starts the chunk - f.addParam("chunkSize", "i32"); // bit where it starts the chunk - f.addParam("pr", "i32"); - f.addLocal("nChunks", "i32"); - f.addLocal("itScalar", "i32"); - f.addLocal("endScalar", "i32"); - f.addLocal("itBase", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - f.addLocal("nTable", "i32"); - f.addLocal("pTable", "i32"); - f.addLocal("idx", "i32"); - f.addLocal("pIdxTable", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.if( - c.i32_eqz(c.getLocal("n")), - [ - ...c.call(prefix + "_zero", c.getLocal("pr")), - ...c.ret([]) - ] - ), - - // Allocate memory - - c.setLocal( - "nTable", - c.i32_shl( - c.i32_const(1), - c.getLocal("chunkSize") - ) - ), - c.setLocal("pTable", c.i32_load( c.i32_const(0) )), - c.i32_store( - c.i32_const(0), - c.i32_add( - c.getLocal("pTable"), - c.i32_mul( - c.getLocal("nTable"), - c.i32_const(n8g) - ) - ) - ), - - // Reset Table - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("nTable") - ) - ), - - c.call( - prefix + "_zero", - c.i32_add( - c.getLocal("pTable"), - c.i32_mul( - c.getLocal("j"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - - // Distribute elements - c.setLocal("itBase", c.getLocal("pBases")), - c.setLocal("itScalar", c.getLocal("pScalars")), - c.setLocal("endScalar", - c.i32_add( - c.getLocal("pScalars"), - c.i32_mul( - c.getLocal("n"), - c.getLocal("scalarSize") - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("itScalar"), - c.getLocal("endScalar") - ) - ), - - c.setLocal( - "idx", - c.call(fnName + "_getChunk", - c.getLocal("itScalar"), - c.getLocal("scalarSize"), - c.getLocal("startBit"), - c.getLocal("chunkSize") - ) - ), - - c.if( - c.getLocal("idx"), - [ - ...c.setLocal( - "pIdxTable", - c.i32_add( - c.getLocal("pTable"), - c.i32_mul( - c.i32_sub( - c.getLocal("idx"), - c.i32_const(1) - ), - c.i32_const(n8g) - ) - ) - ), - ...c.call( - opAdd, - c.getLocal("pIdxTable"), - c.getLocal("itBase"), - c.getLocal("pIdxTable"), - ) - ] - ), - - c.setLocal("itScalar", c.i32_add(c.getLocal("itScalar"), c.getLocal("scalarSize"))), - c.setLocal("itBase", c.i32_add(c.getLocal("itBase"), c.i32_const(n8b))), - c.br(0) - )), - - c.call(fnName + "_reduceTable", c.getLocal("pTable"), c.getLocal("chunkSize")), - c.call( - prefix + "_copy", - c.getLocal("pTable"), - c.getLocal("pr") - ), - - - c.i32_store( - c.i32_const(0), - c.getLocal("pTable") - ) - - ); - } - - function buildMultiexp() { - const f = module.addFunction(fnName); - f.addParam("pBases", "i32"); - f.addParam("pScalars", "i32"); - f.addParam("scalarSize", "i32"); // Number of points - f.addParam("n", "i32"); // Number of points - f.addParam("pr", "i32"); - f.addLocal("chunkSize", "i32"); - f.addLocal("nChunks", "i32"); - f.addLocal("itScalar", "i32"); - f.addLocal("endScalar", "i32"); - f.addLocal("itBase", "i32"); - f.addLocal("itBit", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - f.addLocal("nTable", "i32"); - f.addLocal("pTable", "i32"); - f.addLocal("idx", "i32"); - f.addLocal("pIdxTable", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(n8g)); - - const pTSizes = module.alloc([ - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 16, 16, 15, 14, 13, 13, - 12, 11, 10, 9, 8, 7, 7, 6, - 5 , 4, 3, 2, 1, 1, 1, 1 - ]); - - f.addCode( - c.call(prefix + "_zero", c.getLocal("pr")), - c.if( - c.i32_eqz(c.getLocal("n")), - c.ret([]) - ), - c.setLocal("chunkSize", c.i32_load8_u( c.i32_clz(c.getLocal("n")), pTSizes )), - c.setLocal( - "nChunks", - c.i32_add( - c.i32_div_u( - c.i32_sub( - c.i32_shl( - c.getLocal("scalarSize"), - c.i32_const(3) - ), - c.i32_const(1) - ), - c.getLocal("chunkSize") - ), - c.i32_const(1) - ) - ), - - - // Allocate memory - - c.setLocal( - "itBit", - c.i32_mul( - c.i32_sub( - c.getLocal("nChunks"), - c.i32_const(1) - ), - c.getLocal("chunkSize") - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_lt_s( - c.getLocal("itBit"), - c.i32_const(0) - ) - ), - - // Double nChunk times - c.if( - c.i32_eqz(c.call(prefix + "_isZero", c.getLocal("pr"))), - [ - ...c.setLocal("j", c.i32_const(0)), - ...c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("chunkSize") - ) - ), - - c.call(prefix + "_double", c.getLocal("pr"), c.getLocal("pr")), - - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )) - ] - ), - - c.call( - fnName + "_chunk", - c.getLocal("pBases"), - c.getLocal("pScalars"), - c.getLocal("scalarSize"), - c.getLocal("n"), - c.getLocal("itBit"), - c.getLocal("chunkSize"), - aux - ), - - c.call( - prefix + "_add", - c.getLocal("pr"), - aux, - c.getLocal("pr") - ), - c.setLocal("itBit", c.i32_sub(c.getLocal("itBit"), c.getLocal("chunkSize"))), - c.br(0) - )) - ); - } - - function buildReduceTable() { - const f = module.addFunction(fnName + "_reduceTable"); - f.addParam("pTable", "i32"); - f.addParam("p", "i32"); // Number of bits of the table - f.addLocal("half", "i32"); - f.addLocal("it1", "i32"); - f.addLocal("it2", "i32"); - f.addLocal("pAcc", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.if( - c.i32_eq(c.getLocal("p"), c.i32_const(1)), - c.ret([]) - ), - c.setLocal( - "half", - c.i32_shl( - c.i32_const(1), - c.i32_sub( - c.getLocal("p"), - c.i32_const(1) - ) - ) - ), - - c.setLocal("it1", c.getLocal("pTable")), - c.setLocal( - "it2", - c.i32_add( - c.getLocal("pTable"), - c.i32_mul( - c.getLocal("half"), - c.i32_const(n8g) - ) - ) - ), - c.setLocal("pAcc", - c.i32_sub( - c.getLocal("it2"), - c.i32_const(n8g) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("it1"), - c.getLocal("pAcc") - ) - ), - c.call( - prefix + "_add", - c.getLocal("it1"), - c.getLocal("it2"), - c.getLocal("it1") - ), - c.call( - prefix + "_add", - c.getLocal("pAcc"), - c.getLocal("it2"), - c.getLocal("pAcc") - ), - c.setLocal("it1", c.i32_add(c.getLocal("it1"), c.i32_const(n8g))), - c.setLocal("it2", c.i32_add(c.getLocal("it2"), c.i32_const(n8g))), - c.br(0) - )), - - c.call( - fnName + "_reduceTable", - c.getLocal("pTable"), - c.i32_sub( - c.getLocal("p"), - c.i32_const(1) - ) - ), - - c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), - c.block(c.loop( - c.br_if(1, c.i32_eqz(c.getLocal("p"))), - c.call(prefix + "_double", c.getLocal("pAcc"), c.getLocal("pAcc")), - c.setLocal("p", c.i32_sub(c.getLocal("p"), c.i32_const(1))), - c.br(0) - )), - - c.call(prefix + "_add", c.getLocal("pTable"), c.getLocal("pAcc"), c.getLocal("pTable")) - ); - } - - buildGetChunk(); - buildReduceTable(); - buildMutiexpChunk(); - buildMultiexp(); - - module.exportFunction(fnName); - module.exportFunction(fnName +"_chunk"); - - -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -const buildTimesScalarNAF = build_timesscalarnaf; -//const buildTimesScalar = require("./build_timesscalar"); -const buildBatchConvertion = build_batchconvertion; -const buildMultiexp = build_multiexp; - -var build_curve_jacobian_a0 = function buildCurve(module, prefix, prefixField, pB) { - - - const n64 = module.modules[prefixField].n64; - const n8 = n64*8; - - if (module.modules[prefix]) return prefix; // already builded - module.modules[prefix] = { - n64: n64*3 - }; - - function buildIsZero() { - const f = module.addFunction(prefix + "_isZero"); - f.addParam("p1", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode(c.call( - prefixField + "_isZero", - c.i32_add( - c.getLocal("p1"), - c.i32_const(n8*2) - ) - )); - } - function buildIsZeroAffine() { - const f = module.addFunction(prefix + "_isZeroAffine"); - f.addParam("p1", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.i32_and( - c.call( - prefixField + "_isZero", - c.getLocal("p1") - ), - c.call( - prefixField + "_isZero", - c.i32_add( - c.getLocal("p1"), - c.i32_const(n8) - ) - ) - ) - ); - } - - function buildCopy() { - const f = module.addFunction(prefix + "_copy"); - f.addParam("ps", "i32"); - f.addParam("pd", "i32"); - - const c = f.getCodeBuilder(); - - for (let i=0; i. -*/ - -const { isOdd: isOdd$2, modInv: modInv$1, modPow } = bigint; -const utils$2 = utils$5; - -var build_fft = function buildFFT(module, prefix, gPrefix, fPrefix, opGtimesF) { - - const n64f = module.modules[fPrefix].n64; - const n8f = n64f*8; - - const n64g = module.modules[gPrefix].n64; - const n8g = n64g*8; - - const q = module.modules[fPrefix].q; - - let rem = q - 1n; - let maxBits = 0; - while (!isOdd$2(rem)) { - maxBits ++; - rem = rem >> 1n; - } - - let nr = 2n; - - while ( modPow(nr, q >> 1n, q) === 1n ) nr = nr + 1n; - - // console.log(nr); - - const w = new Array(maxBits+1); - w[maxBits] = modPow(nr, rem, q); - - let n=maxBits-1; - while (n>=0) { - w[n] = modPow(w[n+1], 2n, q); - n--; - } - - const bytes = []; - const R = (1n << BigInt(n8f*8)) % q; - - for (let i=0; i> i); - } - } - return r; - } - - const rtable = Array(256); - for (let i=0; i<256; i++) { - rtable[i] = rev(i); - } - - const REVTABLE = module.alloc(rtable); - - - function buildLog2() { - const f = module.addFunction(prefix+"__log2"); - f.addParam("n", "i32"); - f.setReturnType("i32"); - f.addLocal("bits", "i32"); - f.addLocal("aux", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal( - "aux", - c.i32_shr_u( - c.getLocal("n"), - c.i32_const(1) - ) - ) - ); - f.addCode(c.setLocal("bits", c.i32_const(0))); - - f.addCode(c.block(c.loop( - c.br_if( - 1, - c.i32_eqz(c.getLocal("aux")) - ), - - c.setLocal( - "aux", - c.i32_shr_u( - c.getLocal("aux"), - c.i32_const(1) - ) - ), - - c.setLocal( - "bits", - c.i32_add( - c.getLocal("bits"), - c.i32_const(1) - ) - ), - - c.br(0) - ))); - - f.addCode(c.if( - c.i32_ne( - c.getLocal("n"), - c.i32_shl( - c.i32_const(1), - c.getLocal("bits") - ) - ), - c.unreachable() - )); - - f.addCode(c.if( - c.i32_gt_u( - c.getLocal("bits"), - c.i32_const(maxBits) - ), - c.unreachable() - )); - - f.addCode(c.getLocal("bits")); - } - - function buildFFT() { - const f = module.addFunction(prefix+"_fft"); - f.addParam("px", "i32"); - f.addParam("n", "i32"); - - f.addLocal("bits", "i32"); - - const c = f.getCodeBuilder(); - - const One = c.i32_const(module.alloc(n8f)); - - f.addCode( - c.setLocal( - "bits", - c.call( - prefix + "__log2", - c.getLocal("n") - ) - ), - c.call(fPrefix + "_one", One), - c.call( - prefix+"_rawfft", - c.getLocal("px"), - c.getLocal("bits"), - c.i32_const(0), - One - ) - ); - - } - - function buildIFFT() { - const f = module.addFunction(prefix+"_ifft"); - f.addParam("px", "i32"); - f.addParam("n", "i32"); - f.addLocal("bits", "i32"); - f.addLocal("pInv2", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal( - "bits", - c.call( - prefix + "__log2", - c.getLocal("n") - ) - ), - c.setLocal( - "pInv2", - c.i32_add( - c.i32_const(INV2), - c.i32_mul( - c.getLocal("bits"), - c.i32_const(n8f) - ) - ) - ), - - c.call( - prefix+"_rawfft", - c.getLocal("px"), - c.getLocal("bits"), - c.i32_const(1), - c.getLocal("pInv2") - ), - ); - } - - function buildRawFFT() { - const f = module.addFunction(prefix+"_rawfft"); - f.addParam("px", "i32"); - f.addParam("bits", "i32"); // 2 power - f.addParam("reverse", "i32"); - f.addParam("mulFactor", "i32"); - - f.addLocal("s", "i32"); - f.addLocal("k", "i32"); - f.addLocal("j", "i32"); - f.addLocal("m", "i32"); - f.addLocal("mdiv2", "i32"); - f.addLocal("n", "i32"); - f.addLocal("pwm", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const T = c.i32_const(module.alloc(n8g)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.call(prefix + "__reversePermutation", c.getLocal("px"), c.getLocal("bits")), - c.setLocal("n", c.i32_shl(c.i32_const(1), c.getLocal("bits"))), - c.setLocal("s", c.i32_const(1)), - c.block(c.loop( - c.br_if( - 1, - c.i32_gt_u( - c.getLocal("s"), - c.getLocal("bits") - ) - ), - c.setLocal("m", c.i32_shl(c.i32_const(1), c.getLocal("s"))), - c.setLocal("pwm", - c.i32_add( - c.i32_const(ROOTs), - c.i32_mul( - c.getLocal("s"), - c.i32_const(n8f) - ) - ) - ), - c.setLocal("k", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_ge_u( - c.getLocal("k"), - c.getLocal("n") - ) - ), - - c.call(fPrefix + "_one", W), - - c.setLocal("mdiv2", c.i32_shr_u(c.getLocal("m"), c.i32_const(1)) ), - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_ge_u( - c.getLocal("j"), - c.getLocal("mdiv2") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.i32_add( - c.getLocal("k"), - c.getLocal("j") - ), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("idx1"), - c.i32_mul( - c.getLocal("mdiv2"), - c.i32_const(n8g) - ) - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - T - ), - - c.call( - gPrefix + "_copy", - c.getLocal("idx1"), - U - ), - - c.call( - gPrefix + "_add", - U, - T, - c.getLocal("idx1"), - ), - - c.call( - gPrefix + "_sub", - U, - T, - c.getLocal("idx2"), - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("pwm"), - W, - ), - - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - - c.setLocal("k", c.i32_add(c.getLocal("k"), c.getLocal("m"))), - c.br(0) - )), - - c.setLocal("s", c.i32_add(c.getLocal("s"), c.i32_const(1))), - c.br(0) - )), - c.call( - prefix + "__fftFinal", - c.getLocal("px"), - c.getLocal("bits"), - c.getLocal("reverse"), - c.getLocal("mulFactor") - ) - ); - } - - - function buildFinalInverse() { - const f = module.addFunction(prefix+"__fftFinal"); - f.addParam("px", "i32"); - f.addParam("bits", "i32"); - f.addParam("reverse", "i32"); - f.addParam("mulFactor", "i32"); - f.addLocal("n", "i32"); - f.addLocal("ndiv2", "i32"); - f.addLocal("pInv2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("mask", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - - const c = f.getCodeBuilder(); - - const T = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.if( - c.i32_and( - c.i32_eqz(c.getLocal("reverse")), - c.call(fPrefix + "_isOne", c.getLocal("mulFactor")) - ), - c.ret([]) - ), - c.setLocal("n", c.i32_shl( c.i32_const(1), c.getLocal("bits"))), - - c.setLocal("mask", c.i32_sub( c.getLocal("n") , c.i32_const(1))), - c.setLocal("i", c.i32_const(1)), - c.setLocal( - "ndiv2", - c.i32_shr_u( - c.getLocal("n"), - c.i32_const(1) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_ge_u( - c.getLocal("i"), - c.getLocal("ndiv2") - ) - ), - - c.setLocal("idx1", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal("idx2", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.i32_sub( - c.getLocal("n"), - c.getLocal("i") - ), - c.i32_const(n8g) - ) - ) - ), - - c.if( - c.getLocal("reverse"), - c.if( - c.call(fPrefix + "_isOne", c.getLocal("mulFactor")), - [ - ...c.call(gPrefix + "_copy", c.getLocal("idx1"), T), - ...c.call(gPrefix + "_copy", c.getLocal("idx2") , c.getLocal("idx1") ), - ...c.call(gPrefix + "_copy", T , c.getLocal("idx2")), - ], - [ - ...c.call(gPrefix + "_copy", c.getLocal("idx1"), T), - ...c.call(opGtimesF , c.getLocal("idx2") , c.getLocal("mulFactor"), c.getLocal("idx1") ), - ...c.call(opGtimesF , T , c.getLocal("mulFactor"), c.getLocal("idx2")), - ] - ), - c.if( - c.call(fPrefix + "_isOne", c.getLocal("mulFactor")), - [ - // Do nothing (It should not be here) - ], - [ - ...c.call(opGtimesF , c.getLocal("idx1") , c.getLocal("mulFactor"), c.getLocal("idx1") ), - ...c.call(opGtimesF , c.getLocal("idx2") , c.getLocal("mulFactor"), c.getLocal("idx2")), - ] - ) - ), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - - c.br(0) - )), - - c.if( - c.call(fPrefix + "_isOne", c.getLocal("mulFactor")), - [ - // Do nothing (It should not be here) - ], - [ - ...c.call(opGtimesF, c.getLocal("px") , c.getLocal("mulFactor"), c.getLocal("px")), - ...c.setLocal("idx2", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("ndiv2"), - c.i32_const(n8g) - ) - ) - ), - ...c.call(opGtimesF, c.getLocal("idx2"),c.getLocal("mulFactor"), c.getLocal("idx2")) - ] - ) - ); - } - - function buildReversePermutation() { - const f = module.addFunction(prefix+"__reversePermutation"); - f.addParam("px", "i32"); - f.addParam("bits", "i32"); - f.addLocal("n", "i32"); - f.addLocal("i", "i32"); - f.addLocal("ri", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - - const c = f.getCodeBuilder(); - - const T = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.setLocal("n", c.i32_shl( c.i32_const(1), c.getLocal("bits"))), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal("idx1", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal("ri", c.call(prefix + "__rev", c.getLocal("i"), c.getLocal("bits"))), - - c.setLocal("idx2", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("ri"), - c.i32_const(n8g) - ) - ) - ), - - c.if( - c.i32_lt_u( - c.getLocal("i"), - c.getLocal("ri") - ), - [ - ...c.call(gPrefix + "_copy", c.getLocal("idx1"), T), - ...c.call(gPrefix + "_copy", c.getLocal("idx2") , c.getLocal("idx1")), - ...c.call(gPrefix + "_copy", T , c.getLocal("idx2")) - ] - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - - c.br(0) - )) - ); - } - - function buildRev() { - const f = module.addFunction(prefix+"__rev"); - f.addParam("x", "i32"); - f.addParam("bits", "i32"); - f.setReturnType("i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.i32_rotl( - c.i32_add( - c.i32_add( - c.i32_shl( - c.i32_load8_u( - c.i32_and( - c.getLocal("x"), - c.i32_const(0xFF) - ), - REVTABLE, - 0 - ), - c.i32_const(24) - ), - c.i32_shl( - c.i32_load8_u( - c.i32_and( - c.i32_shr_u( - c.getLocal("x"), - c.i32_const(8) - ), - c.i32_const(0xFF) - ), - REVTABLE, - 0 - ), - c.i32_const(16) - ), - ), - c.i32_add( - c.i32_shl( - c.i32_load8_u( - c.i32_and( - c.i32_shr_u( - c.getLocal("x"), - c.i32_const(16) - ), - c.i32_const(0xFF) - ), - REVTABLE, - 0 - ), - c.i32_const(8) - ), - c.i32_load8_u( - c.i32_and( - c.i32_shr_u( - c.getLocal("x"), - c.i32_const(24) - ), - c.i32_const(0xFF) - ), - REVTABLE, - 0 - ), - ) - ), - c.getLocal("bits") - ) - ); - } - - - function buildFFTJoin() { - const f = module.addFunction(prefix+"_fftJoin"); - f.addParam("pBuff1", "i32"); - f.addParam("pBuff2", "i32"); - f.addParam("n", "i32"); - f.addParam("first", "i32"); - f.addParam("inc", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const T = c.i32_const(module.alloc(n8g)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.call( fPrefix + "_copy", c.getLocal("first"), W), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff1"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff2"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - T - ), - - c.call( - gPrefix + "_copy", - c.getLocal("idx1"), - U - ), - - c.call( - gPrefix + "_add", - U, - T, - c.getLocal("idx1"), - ), - - c.call( - gPrefix + "_sub", - U, - T, - c.getLocal("idx2"), - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("inc"), - W, - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - function buildFFTJoinExt() { - const f = module.addFunction(prefix+"_fftJoinExt"); - f.addParam("pBuff1", "i32"); - f.addParam("pBuff2", "i32"); - f.addParam("n", "i32"); - f.addParam("first", "i32"); - f.addParam("inc", "i32"); - f.addParam("totalBits", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("pShiftToM", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - - c.setLocal("pShiftToM", - c.i32_add( - c.i32_const(SHIFT_TO_M), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - - - c.call( fPrefix + "_copy", c.getLocal("first"), W), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff1"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff2"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.call( - gPrefix + "_add", - c.getLocal("idx1"), - c.getLocal("idx2"), - U - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - c.getLocal("pShiftToM"), - c.getLocal("idx2") - ), - - c.call( - gPrefix + "_add", - c.getLocal("idx1"), - c.getLocal("idx2"), - c.getLocal("idx2") - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - c.getLocal("idx2"), - ), - - c.call( - gPrefix + "_copy", - U, - c.getLocal("idx1") - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("inc"), - W - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - function buildFFTJoinExtInv() { - const f = module.addFunction(prefix+"_fftJoinExtInv"); - f.addParam("pBuff1", "i32"); - f.addParam("pBuff2", "i32"); - f.addParam("n", "i32"); - f.addParam("first", "i32"); - f.addParam("inc", "i32"); - f.addParam("totalBits", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("pShiftToM", "i32"); - f.addLocal("pSConst", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - - c.setLocal("pShiftToM", - c.i32_add( - c.i32_const(SHIFT_TO_M), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - c.setLocal("pSConst", - c.i32_add( - c.i32_const(SCONST), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - - - c.call( fPrefix + "_copy", c.getLocal("first"), W), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff1"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff2"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - U - ), - - c.call( - gPrefix + "_sub", - c.getLocal("idx1"), - U, - c.getLocal("idx2"), - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - c.getLocal("pSConst"), - c.getLocal("idx2") - ), - - c.call( - opGtimesF, - c.getLocal("idx1"), - c.getLocal("pShiftToM"), - c.getLocal("idx1") - ), - - c.call( - gPrefix + "_sub", - U, - c.getLocal("idx1"), - c.getLocal("idx1") - ), - - c.call( - opGtimesF, - c.getLocal("idx1"), - c.getLocal("pSConst"), - c.getLocal("idx1") - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("inc"), - W - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - - function buildPrepareLagrangeEvaluation() { - const f = module.addFunction(prefix+"_prepareLagrangeEvaluation"); - f.addParam("pBuff1", "i32"); - f.addParam("pBuff2", "i32"); - f.addParam("n", "i32"); - f.addParam("first", "i32"); - f.addParam("inc", "i32"); - f.addParam("totalBits", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("pShiftToM", "i32"); - f.addLocal("pSConst", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - - c.setLocal("pShiftToM", - c.i32_add( - c.i32_const(SHIFT_TO_M), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - c.setLocal("pSConst", - c.i32_add( - c.i32_const(SCONST), - c.i32_mul( - c.getLocal("totalBits"), - c.i32_const(n8f) - ) - ) - ), - - - c.call( fPrefix + "_copy", c.getLocal("first"), W), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("n") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff1"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff2"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - - c.call( - opGtimesF, - c.getLocal("idx1"), - c.getLocal("pShiftToM"), - U - ), - - c.call( - gPrefix + "_sub", - c.getLocal("idx2"), - U, - U - ), - - c.call( - gPrefix + "_sub", - c.getLocal("idx1"), - c.getLocal("idx2"), - c.getLocal("idx2"), - ), - - c.call( - opGtimesF, - U, - c.getLocal("pSConst"), - c.getLocal("idx1"), - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - c.getLocal("idx2"), - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("inc"), - W - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - function buildFFTMix() { - const f = module.addFunction(prefix+"_fftMix"); - f.addParam("pBuff", "i32"); - f.addParam("n", "i32"); - f.addParam("exp", "i32"); - f.addLocal("nGroups", "i32"); - f.addLocal("nPerGroup", "i32"); - f.addLocal("nPerGroupDiv2", "i32"); - f.addLocal("pairOffset", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - f.addLocal("pwm", "i32"); - - const c = f.getCodeBuilder(); - - const W = c.i32_const(module.alloc(n8f)); - const T = c.i32_const(module.alloc(n8g)); - const U = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.setLocal("nPerGroup", c.i32_shl(c.i32_const(1), c.getLocal("exp"))), - c.setLocal("nPerGroupDiv2", c.i32_shr_u(c.getLocal("nPerGroup"), c.i32_const(1))), - c.setLocal("nGroups", c.i32_shr_u(c.getLocal("n"), c.getLocal("exp"))), - c.setLocal("pairOffset", c.i32_mul(c.getLocal("nPerGroupDiv2"), c.i32_const(n8g))), - c.setLocal("pwm", - c.i32_add( - c.i32_const(ROOTs), - c.i32_mul( - c.getLocal("exp"), - c.i32_const(n8f) - ) - ) - ), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("nGroups") - ) - ), - c.call( fPrefix + "_one", W), - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("nPerGroupDiv2") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.i32_add( - c.i32_mul( - c.getLocal("i"), - c.getLocal("nPerGroup") - ), - c.getLocal("j") - ), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("idx1"), - c.getLocal("pairOffset") - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - W, - T - ), - - c.call( - gPrefix + "_copy", - c.getLocal("idx1"), - U - ), - - c.call( - gPrefix + "_add", - U, - T, - c.getLocal("idx1"), - ), - - c.call( - gPrefix + "_sub", - U, - T, - c.getLocal("idx2"), - ), - - c.call( - fPrefix + "_mul", - W, - c.getLocal("pwm"), - W, - ), - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - // Reverse all and multiply by factor - function buildFFTFinal() { - const f = module.addFunction(prefix+"_fftFinal"); - f.addParam("pBuff", "i32"); - f.addParam("n", "i32"); - f.addParam("factor", "i32"); - f.addLocal("idx1", "i32"); - f.addLocal("idx2", "i32"); - f.addLocal("i", "i32"); - f.addLocal("ndiv2", "i32"); - - const c = f.getCodeBuilder(); - - const T = c.i32_const(module.alloc(n8g)); - - f.addCode( - c.setLocal("ndiv2", c.i32_shr_u(c.getLocal("n"), c.i32_const(1))), - c.if( - c.i32_and( - c.getLocal("n"), - c.i32_const(1) - ), - c.call( - opGtimesF, - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.getLocal("ndiv2"), - c.i32_const(n8g) - ) - ), - c.getLocal("factor"), - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.getLocal("ndiv2"), - c.i32_const(n8g) - ) - ), - ), - ), - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_ge_u( - c.getLocal("i"), - c.getLocal("ndiv2") - ) - ), - - c.setLocal( - "idx1", - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.getLocal("i"), - c.i32_const(n8g) - ) - ) - ), - - c.setLocal( - "idx2", - c.i32_add( - c.getLocal("pBuff"), - c.i32_mul( - c.i32_sub( - c.i32_sub( - c.getLocal("n"), - c.i32_const(1) - ), - c.getLocal("i") - ), - c.i32_const(n8g) - ) - ) - ), - - c.call( - opGtimesF, - c.getLocal("idx2"), - c.getLocal("factor"), - T - ), - - c.call( - opGtimesF, - c.getLocal("idx1"), - c.getLocal("factor"), - c.getLocal("idx2"), - ), - - c.call( - gPrefix + "_copy", - T, - c.getLocal("idx1"), - ), - - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - buildRev(); - buildReversePermutation(); - buildFinalInverse(); - buildRawFFT(); - buildLog2(); - buildFFT(); - buildIFFT(); - buildFFTJoin(); - buildFFTJoinExt(); - buildFFTJoinExtInv(); - buildFFTMix(); - buildFFTFinal(); - buildPrepareLagrangeEvaluation(); - - module.exportFunction(prefix+"__reversePermutation"); - module.exportFunction(prefix+"_fft"); - module.exportFunction(prefix+"_ifft"); - module.exportFunction(prefix+"_rawfft"); - module.exportFunction(prefix+"_fftJoin"); - module.exportFunction(prefix+"_fftJoinExt"); - module.exportFunction(prefix+"_fftJoinExtInv"); - module.exportFunction(prefix+"_fftMix"); - module.exportFunction(prefix+"_fftFinal"); - module.exportFunction(prefix+"_prepareLagrangeEvaluation"); - -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -var build_pol = function buildPol(module, prefix, prefixField) { - - const n64 = module.modules[prefixField].n64; - const n8 = n64*8; - - - function buildZero() { - const f = module.addFunction(prefix+"_zero"); - f.addParam("px", "i32"); - f.addParam("n", "i32"); - f.addLocal("lastp", "i32"); - f.addLocal("p", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal("p", c.getLocal("px")), - c.setLocal( - "lastp", - c.i32_add( - c.getLocal("px"), - c.i32_mul( - c.getLocal("n"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("p"), - c.getLocal("lastp") - ) - ), - c.call(prefixField + "_zero", c.getLocal("p")), - c.setLocal("p", c.i32_add(c.getLocal("p"), c.i32_const(n8))), - c.br(0) - )) - ); - } - - function buildConstructLC() { - const f = module.addFunction(prefix+"_constructLC"); - f.addParam("ppolynomials", "i32"); - f.addParam("psignals", "i32"); - f.addParam("nSignals", "i32"); - f.addParam("pres", "i32"); - f.addLocal("i", "i32"); - f.addLocal("j", "i32"); - f.addLocal("pp", "i32"); - f.addLocal("ps", "i32"); - f.addLocal("pd", "i32"); - f.addLocal("ncoefs", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(n8)); - - f.addCode( - c.setLocal("i", c.i32_const(0)), - c.setLocal("pp", c.getLocal("ppolynomials")), - c.setLocal("ps", c.getLocal("psignals")), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("i"), - c.getLocal("nSignals") - ) - ), - - c.setLocal("ncoefs", c.i32_load(c.getLocal("pp"))), - c.setLocal("pp", c.i32_add(c.getLocal("pp"), c.i32_const(4))), - - c.setLocal("j", c.i32_const(0)), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("j"), - c.getLocal("ncoefs") - ) - ), - - c.setLocal( - "pd", - c.i32_add( - c.getLocal("pres"), - c.i32_mul( - c.i32_load(c.getLocal("pp")), - c.i32_const(n8) - ) - ) - ), - - c.setLocal("pp", c.i32_add(c.getLocal("pp"), c.i32_const(4))), - - - c.call( - prefixField + "_mul", - c.getLocal("ps"), - c.getLocal("pp"), - aux - ), - - c.call( - prefixField + "_add", - aux, - c.getLocal("pd"), - c.getLocal("pd") - ), - - c.setLocal("pp", c.i32_add(c.getLocal("pp"), c.i32_const(n8))), - c.setLocal("j", c.i32_add(c.getLocal("j"), c.i32_const(1))), - c.br(0) - )), - - c.setLocal("ps", c.i32_add(c.getLocal("ps"), c.i32_const(n8))), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - - } - - buildZero(); - buildConstructLC(); - - - module.exportFunction(prefix + "_zero"); - module.exportFunction(prefix + "_constructLC"); - - return prefix; - - - - -}; - -var build_qap = function buildQAP(module, prefix, prefixField) { - - const n64 = module.modules[prefixField].n64; - const n8 = n64*8; - - - function buildBuildABC() { - const f = module.addFunction(prefix+"_buildABC"); - f.addParam("pCoefs", "i32"); - f.addParam("nCoefs", "i32"); - f.addParam("pWitness", "i32"); - f.addParam("pA", "i32"); - f.addParam("pB", "i32"); - f.addParam("pC", "i32"); - f.addParam("offsetOut", "i32"); - f.addParam("nOut", "i32"); - f.addParam("offsetWitness", "i32"); - f.addParam("nWitness", "i32"); - f.addLocal("it", "i32"); - f.addLocal("ita", "i32"); - f.addLocal("itb", "i32"); - f.addLocal("last", "i32"); - f.addLocal("m", "i32"); - f.addLocal("c", "i32"); - f.addLocal("s", "i32"); - f.addLocal("pOut", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(n8)); - - f.addCode( - - // Set output a and b to 0 - c.setLocal("ita", c.getLocal("pA")), - c.setLocal("itb", c.getLocal("pB")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pA"), - c.i32_mul( - c.getLocal("nOut"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("ita"), - c.getLocal("last") - ) - ), - c.call(prefixField + "_zero", c.getLocal("ita")), - c.call(prefixField + "_zero", c.getLocal("itb")), - c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), - c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), - c.br(0) - )), - - - c.setLocal("it", c.getLocal("pCoefs")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pCoefs"), - c.i32_mul( - c.getLocal("nCoefs"), - c.i32_const(n8+12) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("it"), - c.getLocal("last") - ) - ), - c.setLocal( - "s", - c.i32_load(c.getLocal("it"), 8) - ), - c.if( - c.i32_or( - c.i32_lt_u( - c.getLocal("s"), - c.getLocal("offsetWitness"), - ), - c.i32_ge_u( - c.getLocal("s"), - c.i32_add( - c.getLocal("offsetWitness"), - c.getLocal("nWitness"), - ) - ) - ), - [ - ...c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8+12))), - ...c.br(1) - ] - ), - - c.setLocal( - "m", - c.i32_load(c.getLocal("it")) - ), - c.if( - c.i32_eq(c.getLocal("m"), c.i32_const(0)), - c.setLocal("pOut", c.getLocal("pA")), - c.if( - c.i32_eq(c.getLocal("m"), c.i32_const(1)), - c.setLocal("pOut", c.getLocal("pB")), - [ - ...c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8+12))), - ...c.br(1) - ] - ) - ), - c.setLocal( - "c", - c.i32_load(c.getLocal("it"), 4) - ), - c.if( - c.i32_or( - c.i32_lt_u( - c.getLocal("c"), - c.getLocal("offsetOut"), - ), - c.i32_ge_u( - c.getLocal("c"), - c.i32_add( - c.getLocal("offsetOut"), - c.getLocal("nOut"), - ) - ) - ), - [ - ...c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8+12))), - ...c.br(1) - ] - ), - c.setLocal( - "pOut", - c.i32_add( - c.getLocal("pOut"), - c.i32_mul( - c.i32_sub( - c.getLocal("c"), - c.getLocal("offsetOut") - ), - c.i32_const(n8) - ) - ) - ), - c.call( - prefixField + "_mul", - c.i32_add( - c.getLocal("pWitness"), - c.i32_mul( - c.i32_sub(c.getLocal("s"), c.getLocal("offsetWitness")), - c.i32_const(n8) - ) - ), - c.i32_add( c.getLocal("it"), c.i32_const(12)), - aux - ), - c.call( - prefixField + "_add", - c.getLocal("pOut"), - aux, - c.getLocal("pOut"), - ), - c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8+12))), - c.br(0) - )), - - c.setLocal("ita", c.getLocal("pA")), - c.setLocal("itb", c.getLocal("pB")), - c.setLocal("it", c.getLocal("pC")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pA"), - c.i32_mul( - c.getLocal("nOut"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("ita"), - c.getLocal("last") - ) - ), - c.call( - prefixField + "_mul", - c.getLocal("ita"), - c.getLocal("itb"), - c.getLocal("it") - ), - c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), - c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), - c.setLocal("it", c.i32_add(c.getLocal("it"), c.i32_const(n8))), - c.br(0) - )), - - ); - } - - function buildJoinABC() { - const f = module.addFunction(prefix+"_joinABC"); - f.addParam("pA", "i32"); - f.addParam("pB", "i32"); - f.addParam("pC", "i32"); - f.addParam("n", "i32"); - f.addParam("pP", "i32"); - f.addLocal("ita", "i32"); - f.addLocal("itb", "i32"); - f.addLocal("itc", "i32"); - f.addLocal("itp", "i32"); - f.addLocal("last", "i32"); - - const c = f.getCodeBuilder(); - - const aux = c.i32_const(module.alloc(n8)); - - f.addCode( - c.setLocal("ita", c.getLocal("pA")), - c.setLocal("itb", c.getLocal("pB")), - c.setLocal("itc", c.getLocal("pC")), - c.setLocal("itp", c.getLocal("pP")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pA"), - c.i32_mul( - c.getLocal("n"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("ita"), - c.getLocal("last") - ) - ), - c.call( - prefixField + "_mul", - c.getLocal("ita"), - c.getLocal("itb"), - aux - ), - c.call( - prefixField + "_sub", - aux, - c.getLocal("itc"), - c.getLocal("itp"), - ), - c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), - c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), - c.setLocal("itc", c.i32_add(c.getLocal("itc"), c.i32_const(n8))), - c.setLocal("itp", c.i32_add(c.getLocal("itp"), c.i32_const(n8))), - c.br(0) - )) - ); - } - - function buildBatchAdd() { - const f = module.addFunction(prefix+"_batchAdd"); - f.addParam("pa", "i32"); - f.addParam("pb", "i32"); - f.addParam("n", "i32"); - f.addParam("pr", "i32"); - f.addLocal("ita", "i32"); - f.addLocal("itb", "i32"); - f.addLocal("itr", "i32"); - f.addLocal("last", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.setLocal("ita", c.getLocal("pa")), - c.setLocal("itb", c.getLocal("pb")), - c.setLocal("itr", c.getLocal("pr")), - c.setLocal( - "last", - c.i32_add( - c.getLocal("pa"), - c.i32_mul( - c.getLocal("n"), - c.i32_const(n8) - ) - ) - ), - c.block(c.loop( - c.br_if( - 1, - c.i32_eq( - c.getLocal("ita"), - c.getLocal("last") - ) - ), - c.call( - prefixField + "_add", - c.getLocal("ita"), - c.getLocal("itb"), - c.getLocal("itr"), - ), - c.setLocal("ita", c.i32_add(c.getLocal("ita"), c.i32_const(n8))), - c.setLocal("itb", c.i32_add(c.getLocal("itb"), c.i32_const(n8))), - c.setLocal("itr", c.i32_add(c.getLocal("itr"), c.i32_const(n8))), - c.br(0) - )) - ); - } - - buildBuildABC(); - buildJoinABC(); - buildBatchAdd(); - - module.exportFunction(prefix + "_buildABC"); - module.exportFunction(prefix + "_joinABC"); - module.exportFunction(prefix + "_batchAdd"); - - return prefix; - -}; - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -var build_applykey = function buildApplyKey(module, fnName, gPrefix, frPrefix, sizeGIn, sizeGOut, sizeF, opGtimesF) { - - const f = module.addFunction(fnName); - f.addParam("pIn", "i32"); - f.addParam("n", "i32"); - f.addParam("pFirst", "i32"); - f.addParam("pInc", "i32"); - f.addParam("pOut", "i32"); - f.addLocal("pOldFree", "i32"); - f.addLocal("i", "i32"); - f.addLocal("pFrom", "i32"); - f.addLocal("pTo", "i32"); - - const c = f.getCodeBuilder(); - - const t = c.i32_const(module.alloc(sizeF)); - - f.addCode( - c.setLocal("pFrom", c.getLocal("pIn")), - c.setLocal("pTo", c.getLocal("pOut")), - ); - - // t = first - f.addCode( - c.call( - frPrefix + "_copy", - c.getLocal("pFirst"), - t - ) - ); - f.addCode( - c.setLocal("i", c.i32_const(0)), - c.block(c.loop( - c.br_if(1, c.i32_eq ( c.getLocal("i"), c.getLocal("n") )), - - c.call( - opGtimesF, - c.getLocal("pFrom"), - t, - c.getLocal("pTo") - ), - c.setLocal("pFrom", c.i32_add(c.getLocal("pFrom"), c.i32_const(sizeGIn))), - c.setLocal("pTo", c.i32_add(c.getLocal("pTo"), c.i32_const(sizeGOut))), - - // t = t* inc - c.call( - frPrefix + "_mul", - t, - c.getLocal("pInc"), - t - ), - c.setLocal("i", c.i32_add(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - - module.exportFunction(fnName); - -}; - -const utils$1 = utils$5; - -const buildF1m$1 =build_f1m; -const buildF1$1 =build_f1; -const buildF2m$1 =build_f2m; -const buildF3m$1 =build_f3m; -const buildCurve$1 =build_curve_jacobian_a0; -const buildFFT$1 = build_fft; -const buildPol$1 = build_pol; -const buildQAP$1 = build_qap; -const buildApplyKey$1 = build_applykey; -const { bitLength: bitLength$2, modInv, isOdd: isOdd$1, isNegative: isNegative$2 } = bigint; - -var build_bn128 = function buildBN128(module, _prefix) { - - const prefix = _prefix || "bn128"; - - if (module.modules[prefix]) return prefix; // already builded - - const q = 21888242871839275222246405745257275088696311157297823662689037894645226208583n; - const r = 21888242871839275222246405745257275088548364400416034343698204186575808495617n; - - - const n64 = Math.floor((bitLength$2(q - 1n) - 1)/64) +1; - const n8 = n64*8; - const frsize = n8; - const f1size = n8; - const f2size = f1size * 2; - const ftsize = f1size * 12; - - const pr = module.alloc(utils$1.bigInt2BytesLE( r, frsize )); - - const f1mPrefix = buildF1m$1(module, q, "f1m"); - buildF1$1(module, r, "fr", "frm"); - - const pG1b = module.alloc(utils$1.bigInt2BytesLE( toMontgomery(3n), f1size )); - const g1mPrefix = buildCurve$1(module, "g1m", "f1m", pG1b); - - buildFFT$1(module, "frm", "frm", "frm", "frm_mul"); - - buildPol$1(module, "pol", "frm"); - buildQAP$1(module, "qap", "frm"); - - const f2mPrefix = buildF2m$1(module, "f1m_neg", "f2m", "f1m"); - const pG2b = module.alloc([ - ...utils$1.bigInt2BytesLE( toMontgomery(19485874751759354771024239261021720505790618469301721065564631296452457478373n), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(266929791119991161246907387137283842545076965332900288569378510910307636690n), f1size ) - ]); - const g2mPrefix = buildCurve$1(module, "g2m", "f2m", pG2b); - - - function buildGTimesFr(fnName, opMul) { - const f = module.addFunction(fnName); - f.addParam("pG", "i32"); - f.addParam("pFr", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - const AUX = c.i32_const(module.alloc(n8)); - - f.addCode( - c.call("frm_fromMontgomery", c.getLocal("pFr"), AUX), - c.call( - opMul, - c.getLocal("pG"), - AUX, - c.i32_const(n8), - c.getLocal("pr") - ) - ); - - module.exportFunction(fnName); - } - buildGTimesFr("g1m_timesFr", "g1m_timesScalar"); - buildFFT$1(module, "g1m", "g1m", "frm", "g1m_timesFr"); - - buildGTimesFr("g2m_timesFr", "g2m_timesScalar"); - buildFFT$1(module, "g2m", "g2m", "frm", "g2m_timesFr"); - - buildGTimesFr("g1m_timesFrAffine", "g1m_timesScalarAffine"); - buildGTimesFr("g2m_timesFrAffine", "g2m_timesScalarAffine"); - - buildApplyKey$1(module, "frm_batchApplyKey", "fmr", "frm", n8, n8, n8, "frm_mul"); - buildApplyKey$1(module, "g1m_batchApplyKey", "g1m", "frm", n8*3, n8*3, n8, "g1m_timesFr"); - buildApplyKey$1(module, "g1m_batchApplyKeyMixed", "g1m", "frm", n8*2, n8*3, n8, "g1m_timesFrAffine"); - buildApplyKey$1(module, "g2m_batchApplyKey", "g2m", "frm", n8*2*3, n8*3*2, n8, "g2m_timesFr"); - buildApplyKey$1(module, "g2m_batchApplyKeyMixed", "g2m", "frm", n8*2*2, n8*3*2, n8, "g2m_timesFrAffine"); - - function toMontgomery(a) { - return BigInt(a) * ( 1n << BigInt(f1size*8)) % q; - } - - const G1gen = [ - 1n, - 2n, - 1n - ]; - - const pG1gen = module.alloc( - [ - ...utils$1.bigInt2BytesLE( toMontgomery(G1gen[0]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G1gen[1]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G1gen[2]), f1size ), - ] - ); - - const G1zero = [ - 0n, - 1n, - 0n - ]; - - const pG1zero = module.alloc( - [ - ...utils$1.bigInt2BytesLE( toMontgomery(G1zero[0]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G1zero[1]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G1zero[2]), f1size ) - ] - ); - - const G2gen = [ - [ - 10857046999023057135944570762232829481370756359578518086990519993285655852781n, - 11559732032986387107991004021392285783925812861821192530917403151452391805634n, - ],[ - 8495653923123431417604973247489272438418190587263600148770280649306958101930n, - 4082367875863433681332203403145435568316851327593401208105741076214120093531n, - ],[ - 1n, - 0n, - ] - ]; - - const pG2gen = module.alloc( - [ - ...utils$1.bigInt2BytesLE( toMontgomery(G2gen[0][0]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2gen[0][1]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2gen[1][0]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2gen[1][1]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2gen[2][0]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2gen[2][1]), f1size ), - ] - ); - - const G2zero = [ - [ - 0n, - 0n, - ],[ - 1n, - 0n, - ],[ - 0n, - 0n, - ] - ]; - - const pG2zero = module.alloc( - [ - ...utils$1.bigInt2BytesLE( toMontgomery(G2zero[0][0]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2zero[0][1]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2zero[1][0]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2zero[1][1]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2zero[2][0]), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(G2zero[2][1]), f1size ), - ] - ); - - const pOneT = module.alloc([ - ...utils$1.bigInt2BytesLE( toMontgomery(1), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(0), f1size ), - ]); - - const pNonResidueF6 = module.alloc([ - ...utils$1.bigInt2BytesLE( toMontgomery(9), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(1), f1size ), - ]); - - const pTwoInv = module.alloc([ - ...utils$1.bigInt2BytesLE( toMontgomery( modInv(2n, q)), f1size ), - ...utils$1.bigInt2BytesLE( 0n, f1size ) - ]); - - const pAltBn128Twist = pNonResidueF6; - - const pTwistCoefB = module.alloc([ - ...utils$1.bigInt2BytesLE( toMontgomery(19485874751759354771024239261021720505790618469301721065564631296452457478373n), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery(266929791119991161246907387137283842545076965332900288569378510910307636690n), f1size ), - ]); - - function build_mulNR6() { - const f = module.addFunction(prefix + "_mulNR6"); - f.addParam("x", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call( - f2mPrefix + "_mul", - c.i32_const(pNonResidueF6), - c.getLocal("x"), - c.getLocal("pr") - ) - ); - } - build_mulNR6(); - - const f6mPrefix = buildF3m$1(module, prefix+"_mulNR6", "f6m", "f2m"); - - function build_mulNR12() { - const f = module.addFunction(prefix + "_mulNR12"); - f.addParam("x", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call( - f2mPrefix + "_mul", - c.i32_const(pNonResidueF6), - c.i32_add(c.getLocal("x"), c.i32_const(n8*4)), - c.getLocal("pr") - ), - c.call( - f2mPrefix + "_copy", - c.getLocal("x"), - c.i32_add(c.getLocal("pr"), c.i32_const(n8*2)), - ), - c.call( - f2mPrefix + "_copy", - c.i32_add(c.getLocal("x"), c.i32_const(n8*2)), - c.i32_add(c.getLocal("pr"), c.i32_const(n8*4)), - ) - ); - } - build_mulNR12(); - - const ftmPrefix = buildF2m$1(module, prefix+"_mulNR12", "ftm", f6mPrefix); - - - const ateLoopCount = 29793968203157093288n; - const ateLoopBitBytes = bits(ateLoopCount); - const pAteLoopBitBytes = module.alloc(ateLoopBitBytes); - - const ateCoefSize = 3 * f2size; - const ateNDblCoefs = ateLoopBitBytes.length-1; - const ateNAddCoefs = ateLoopBitBytes.reduce((acc, b) => acc + ( b!=0 ? 1 : 0) ,0); - const ateNCoefs = ateNAddCoefs + ateNDblCoefs + 1; - const prePSize = 3*2*n8; - const preQSize = 3*n8*2 + ateNCoefs*ateCoefSize; - - - module.modules[prefix] = { - n64: n64, - pG1gen: pG1gen, - pG1zero: pG1zero, - pG1b: pG1b, - pG2gen: pG2gen, - pG2zero: pG2zero, - pG2b: pG2b, - pq: module.modules["f1m"].pq, - pr: pr, - pOneT: pOneT, - prePSize: prePSize, - preQSize: preQSize, - r: r.toString(), - q: q.toString() - }; - - // console.log("PrePSize: " +prePSize); - // console.log("PreQSize: " +preQSize); - - const finalExpZ = 4965661367192848881n; - - function naf(n) { - let E = n; - const res = []; - while (E > 0n) { - if (isOdd$1(E)) { - const z = 2 - Number(E % 4n); - res.push( z ); - E = E - BigInt(z); - } else { - res.push( 0 ); - } - E = E >> 1n; - } - return res; - } - - function bits(n) { - let E = n; - const res = []; - while (E > 0n) { - if (isOdd$1(E)) { - res.push( 1 ); - } else { - res.push( 0 ); - } - E = E >> 1n; - } - return res; - } - - function buildPrepareG1() { - const f = module.addFunction(prefix+ "_prepareG1"); - f.addParam("pP", "i32"); - f.addParam("ppreP", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(g1mPrefix + "_normalize", c.getLocal("pP"), c.getLocal("ppreP")), // TODO Remove if already in affine - ); - } - - function buildPrepAddStep() { - const f = module.addFunction(prefix+ "_prepAddStep"); - f.addParam("pQ", "i32"); - f.addParam("pR", "i32"); - f.addParam("pCoef", "i32"); - - const c = f.getCodeBuilder(); - - const X2 = c.getLocal("pQ"); - const Y2 = c.i32_add(c.getLocal("pQ"), c.i32_const(f2size)); - - const X1 = c.getLocal("pR"); - const Y1 = c.i32_add(c.getLocal("pR"), c.i32_const(f2size)); - const Z1 = c.i32_add(c.getLocal("pR"), c.i32_const(2*f2size)); - - const ELL_0 = c.getLocal("pCoef"); - const ELL_VW = c.i32_add(c.getLocal("pCoef"), c.i32_const(f2size)); - const ELL_VV = c.i32_add(c.getLocal("pCoef"), c.i32_const(2*f2size)); - - const D = ELL_VW; - const E = c.i32_const(module.alloc(f2size)); - const F = c.i32_const(module.alloc(f2size)); - const G = c.i32_const(module.alloc(f2size)); - const H = c.i32_const(module.alloc(f2size)); - const I = c.i32_const(module.alloc(f2size)); - const J = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - f.addCode( - // D = X1 - X2*Z1 - c.call(f2mPrefix + "_mul", X2, Z1, D), - c.call(f2mPrefix + "_sub", X1, D, D), - - // E = Y1 - Y2*Z1 - c.call(f2mPrefix + "_mul", Y2, Z1, E), - c.call(f2mPrefix + "_sub", Y1, E, E), - - // F = D^2 - c.call(f2mPrefix + "_square", D, F), - - // G = E^2 - c.call(f2mPrefix + "_square", E, G), - - // H = D*F - c.call(f2mPrefix + "_mul", D, F, H), - - // I = X1 * F - c.call(f2mPrefix + "_mul", X1, F, I), - - // J = H + Z1*G - (I+I) - c.call(f2mPrefix + "_add", I, I, AUX), - c.call(f2mPrefix + "_mul", Z1, G, J), - c.call(f2mPrefix + "_add", H, J, J), - c.call(f2mPrefix + "_sub", J, AUX, J), - - - // X3 (X1) = D*J - c.call(f2mPrefix + "_mul", D, J, X1), - - // Y3 (Y1) = E*(I-J)-(H*Y1) - c.call(f2mPrefix + "_mul", H, Y1, Y1), - c.call(f2mPrefix + "_sub", I, J, AUX), - c.call(f2mPrefix + "_mul", E, AUX, AUX), - c.call(f2mPrefix + "_sub", AUX, Y1, Y1), - - // Z3 (Z1) = Z1*H - c.call(f2mPrefix + "_mul", Z1, H, Z1), - - // ell_0 = xi * (E * X2 - D * Y2) - c.call(f2mPrefix + "_mul", D, Y2, AUX), - c.call(f2mPrefix + "_mul", E, X2, ELL_0), - c.call(f2mPrefix + "_sub", ELL_0, AUX, ELL_0), - c.call(f2mPrefix + "_mul", ELL_0, c.i32_const(pAltBn128Twist), ELL_0), - - - // ell_VV = - E (later: * xP) - c.call(f2mPrefix + "_neg", E, ELL_VV), - - // ell_VW = D (later: * yP ) - // Already assigned - - ); - } - - - - function buildPrepDoubleStep() { - const f = module.addFunction(prefix+ "_prepDblStep"); - f.addParam("pR", "i32"); - f.addParam("pCoef", "i32"); - - const c = f.getCodeBuilder(); - - const X1 = c.getLocal("pR"); - const Y1 = c.i32_add(c.getLocal("pR"), c.i32_const(f2size)); - const Z1 = c.i32_add(c.getLocal("pR"), c.i32_const(2*f2size)); - - const ELL_0 = c.getLocal("pCoef"); - const ELL_VW = c.i32_add(c.getLocal("pCoef"), c.i32_const(f2size)); - const ELL_VV = c.i32_add(c.getLocal("pCoef"), c.i32_const(2*f2size)); - - const A = c.i32_const(module.alloc(f2size)); - const B = c.i32_const(module.alloc(f2size)); - const C = c.i32_const(module.alloc(f2size)); - const D = c.i32_const(module.alloc(f2size)); - const E = c.i32_const(module.alloc(f2size)); - const F = c.i32_const(module.alloc(f2size)); - const G = c.i32_const(module.alloc(f2size)); - const H = c.i32_const(module.alloc(f2size)); - const I = c.i32_const(module.alloc(f2size)); - const J = c.i32_const(module.alloc(f2size)); - const E2 = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - f.addCode( - - // A = X1 * Y1 / 2 - c.call(f2mPrefix + "_mul", Y1, c.i32_const(pTwoInv), A), - c.call(f2mPrefix + "_mul", X1, A, A), - - // B = Y1^2 - c.call(f2mPrefix + "_square", Y1, B), - - // C = Z1^2 - c.call(f2mPrefix + "_square", Z1, C), - - // D = 3 * C - c.call(f2mPrefix + "_add", C, C, D), - c.call(f2mPrefix + "_add", D, C, D), - - // E = twist_b * D - c.call(f2mPrefix + "_mul", c.i32_const(pTwistCoefB), D, E), - - // F = 3 * E - c.call(f2mPrefix + "_add", E, E, F), - c.call(f2mPrefix + "_add", E, F, F), - - // G = (B+F)/2 - c.call(f2mPrefix + "_add", B, F, G), - c.call(f2mPrefix + "_mul", G, c.i32_const(pTwoInv), G), - - // H = (Y1+Z1)^2-(B+C) - c.call(f2mPrefix + "_add", B, C, AUX), - c.call(f2mPrefix + "_add", Y1, Z1, H), - c.call(f2mPrefix + "_square", H, H), - c.call(f2mPrefix + "_sub", H, AUX, H), - - // I = E-B - c.call(f2mPrefix + "_sub", E, B, I), - - // J = X1^2 - c.call(f2mPrefix + "_square", X1, J), - - // E_squared = E^2 - c.call(f2mPrefix + "_square", E, E2), - - // X3 (X1) = A * (B-F) - c.call(f2mPrefix + "_sub", B, F, AUX), - c.call(f2mPrefix + "_mul", A, AUX, X1), - - // Y3 (Y1) = G^2 - 3*E^2 - c.call(f2mPrefix + "_add", E2, E2, AUX), - c.call(f2mPrefix + "_add", E2, AUX, AUX), - c.call(f2mPrefix + "_square", G, Y1), - c.call(f2mPrefix + "_sub", Y1, AUX, Y1), - - // Z3 (Z1) = B * H - c.call(f2mPrefix + "_mul", B, H, Z1), - - // ell_0 = xi * I - c.call(f2mPrefix + "_mul", c.i32_const(pAltBn128Twist), I, ELL_0), - - // ell_VW = - H (later: * yP) - c.call(f2mPrefix + "_neg", H, ELL_VW), - - // ell_VV = 3*J (later: * xP) - c.call(f2mPrefix + "_add", J, J, ELL_VV), - c.call(f2mPrefix + "_add", J, ELL_VV, ELL_VV), - - ); - } - - function buildMulByQ() { - const f = module.addFunction(prefix + "_mulByQ"); - f.addParam("p1", "i32"); - f.addParam("pr", "i32"); - - const c = f.getCodeBuilder(); - - const x = c.getLocal("p1"); - const y = c.i32_add(c.getLocal("p1"), c.i32_const(f2size)); - const z = c.i32_add(c.getLocal("p1"), c.i32_const(f2size*2)); - const x3 = c.getLocal("pr"); - const y3 = c.i32_add(c.getLocal("pr"), c.i32_const(f2size)); - const z3 = c.i32_add(c.getLocal("pr"), c.i32_const(f2size*2)); - - const MulByQX = c.i32_const(module.alloc([ - ...utils$1.bigInt2BytesLE( toMontgomery("21575463638280843010398324269430826099269044274347216827212613867836435027261"), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery("10307601595873709700152284273816112264069230130616436755625194854815875713954"), f1size ), - ])); - - const MulByQY = c.i32_const(module.alloc([ - ...utils$1.bigInt2BytesLE( toMontgomery("2821565182194536844548159561693502659359617185244120367078079554186484126554"), f1size ), - ...utils$1.bigInt2BytesLE( toMontgomery("3505843767911556378687030309984248845540243509899259641013678093033130930403"), f1size ), - ])); - - f.addCode( - // The frobeniusMap(1) in this field, is the conjugate - c.call(f2mPrefix + "_conjugate", x, x3), - c.call(f2mPrefix + "_mul", MulByQX, x3, x3), - c.call(f2mPrefix + "_conjugate", y, y3), - c.call(f2mPrefix + "_mul", MulByQY, y3, y3), - c.call(f2mPrefix + "_conjugate", z, z3), - ); - } - - - function buildPrepareG2() { - buildMulByQ(); - const f = module.addFunction(prefix+ "_prepareG2"); - f.addParam("pQ", "i32"); - f.addParam("ppreQ", "i32"); - f.addLocal("pCoef", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const QX = c.getLocal("pQ"); - - const pR = module.alloc(f2size*3); - const R = c.i32_const(pR); - const RX = c.i32_const(pR); - const RY = c.i32_const(pR+f2size); - const RZ = c.i32_const(pR+2*f2size); - - const cQX = c.i32_add( c.getLocal("ppreQ"), c.i32_const(0)); - const cQY = c.i32_add( c.getLocal("ppreQ"), c.i32_const(f2size)); - - const pQ1 = module.alloc(f2size*3); - const Q1 = c.i32_const(pQ1); - - const pQ2 = module.alloc(f2size*3); - const Q2 = c.i32_const(pQ2); - const Q2Y = c.i32_const(pQ2 + f2size); - - f.addCode( - c.call(g2mPrefix + "_normalize", QX, cQX), // TODO Remove if already in affine - c.call(f2mPrefix + "_copy", cQX, RX), - c.call(f2mPrefix + "_copy", cQY, RY), - c.call(f2mPrefix + "_one", RZ), - ); - - f.addCode( - c.setLocal("pCoef", c.i32_add( c.getLocal("ppreQ"), c.i32_const(f2size*3))), - c.setLocal("i", c.i32_const(ateLoopBitBytes.length-2)), - c.block(c.loop( - - c.call(prefix + "_prepDblStep", R, c.getLocal("pCoef")), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.if( - c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), - [ - ...c.call(prefix + "_prepAddStep", cQX, R, c.getLocal("pCoef")), - ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - ] - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - - f.addCode( - c.call(prefix + "_mulByQ", cQX, Q1), - c.call(prefix + "_mulByQ", Q1, Q2) - ); - - f.addCode( - c.call(f2mPrefix + "_neg", Q2Y, Q2Y), - - c.call(prefix + "_prepAddStep", Q1, R, c.getLocal("pCoef")), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.call(prefix + "_prepAddStep", Q2, R, c.getLocal("pCoef")), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - ); - } - - function buildMulBy024Old() { - const f = module.addFunction(prefix+ "__mulBy024Old"); - f.addParam("pEll0", "i32"); - f.addParam("pEllVW", "i32"); - f.addParam("pEllVV", "i32"); - f.addParam("pR", "i32"); // Result in F12 - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("pEll0"); - const x2 = c.getLocal("pEllVV"); - const x4 = c.getLocal("pEllVW"); - - const z0 = c.getLocal("pR"); - - const pAUX12 = module.alloc(ftsize); - const AUX12 = c.i32_const(pAUX12); - const AUX12_0 = c.i32_const(pAUX12); - const AUX12_2 = c.i32_const(pAUX12+f2size); - const AUX12_4 = c.i32_const(pAUX12+f2size*2); - const AUX12_6 = c.i32_const(pAUX12+f2size*3); - const AUX12_8 = c.i32_const(pAUX12+f2size*4); - const AUX12_10 = c.i32_const(pAUX12+f2size*5); - - f.addCode( - - c.call(f2mPrefix + "_copy", x0, AUX12_0), - c.call(f2mPrefix + "_zero", AUX12_2), - c.call(f2mPrefix + "_copy", x2, AUX12_4), - c.call(f2mPrefix + "_zero", AUX12_6), - c.call(f2mPrefix + "_copy", x4, AUX12_8), - c.call(f2mPrefix + "_zero", AUX12_10), - c.call(ftmPrefix + "_mul", AUX12, z0, z0), - ); - } - - function buildMulBy024() { - const f = module.addFunction(prefix+ "__mulBy024"); - f.addParam("pEll0", "i32"); - f.addParam("pEllVW", "i32"); - f.addParam("pEllVV", "i32"); - f.addParam("pR", "i32"); // Result in F12 - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("pEll0"); - const x2 = c.getLocal("pEllVV"); - const x4 = c.getLocal("pEllVW"); - - const z0 = c.getLocal("pR"); - const z1 = c.i32_add(c.getLocal("pR"), c.i32_const(2*n8)); - const z2 = c.i32_add(c.getLocal("pR"), c.i32_const(4*n8)); - const z3 = c.i32_add(c.getLocal("pR"), c.i32_const(6*n8)); - const z4 = c.i32_add(c.getLocal("pR"), c.i32_const(8*n8)); - const z5 = c.i32_add(c.getLocal("pR"), c.i32_const(10*n8)); - - const t0 = c.i32_const(module.alloc(f2size)); - const t1 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const s0 = c.i32_const(module.alloc(f2size)); - const T3 = c.i32_const(module.alloc(f2size)); - const T4 = c.i32_const(module.alloc(f2size)); - const D0 = c.i32_const(module.alloc(f2size)); - const D2 = c.i32_const(module.alloc(f2size)); - const D4 = c.i32_const(module.alloc(f2size)); - const S1 = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - f.addCode( - - // D0 = z0 * x0; - c.call(f2mPrefix + "_mul", z0, x0, D0), - // D2 = z2 * x2; - c.call(f2mPrefix + "_mul", z2, x2, D2), - // D4 = z4 * x4; - c.call(f2mPrefix + "_mul", z4, x4, D4), - // t2 = z0 + z4; - c.call(f2mPrefix + "_add", z0, z4, t2), - // t1 = z0 + z2; - c.call(f2mPrefix + "_add", z0, z2, t1), - // s0 = z1 + z3 + z5; - c.call(f2mPrefix + "_add", z1, z3, s0), - c.call(f2mPrefix + "_add", s0, z5, s0), - - - // For z.a_.a_ = z0. - // S1 = z1 * x2; - c.call(f2mPrefix + "_mul", z1, x2, S1), - // T3 = S1 + D4; - c.call(f2mPrefix + "_add", S1, D4, T3), - // T4 = my_Fp6::non_residue * T3 + D0; - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), - c.call(f2mPrefix + "_add", T4, D0, z0), - // z0 = T4; - - // For z.a_.b_ = z1 - // T3 = z5 * x4; - c.call(f2mPrefix + "_mul", z5, x4, T3), - // S1 = S1 + T3; - c.call(f2mPrefix + "_add", S1, T3, S1), - // T3 = T3 + D2; - c.call(f2mPrefix + "_add", T3, D2, T3), - // T4 = my_Fp6::non_residue * T3; - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), - // T3 = z1 * x0; - c.call(f2mPrefix + "_mul", z1, x0, T3), - // S1 = S1 + T3; - c.call(f2mPrefix + "_add", S1, T3, S1), - // T4 = T4 + T3; - c.call(f2mPrefix + "_add", T4, T3, z1), - // z1 = T4; - - - - // For z.a_.c_ = z2 - // t0 = x0 + x2; - c.call(f2mPrefix + "_add", x0, x2, t0), - // T3 = t1 * t0 - D0 - D2; - c.call(f2mPrefix + "_mul", t1, t0, T3), - c.call(f2mPrefix + "_add", D0, D2, AUX), - c.call(f2mPrefix + "_sub", T3, AUX, T3), - // T4 = z3 * x4; - c.call(f2mPrefix + "_mul", z3, x4, T4), - // S1 = S1 + T4; - c.call(f2mPrefix + "_add", S1, T4, S1), - - - // For z.b_.a_ = z3 (z3 needs z2) - // t0 = z2 + z4; - c.call(f2mPrefix + "_add", z2, z4, t0), - // T3 = T3 + T4; - // z2 = T3; - c.call(f2mPrefix + "_add", T3, T4, z2), - // t1 = x2 + x4; - c.call(f2mPrefix + "_add", x2, x4, t1), - // T3 = t0 * t1 - D2 - D4; - c.call(f2mPrefix + "_mul", t1, t0, T3), - c.call(f2mPrefix + "_add", D2, D4, AUX), - c.call(f2mPrefix + "_sub", T3, AUX, T3), - // T4 = my_Fp6::non_residue * T3; - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), - // T3 = z3 * x0; - c.call(f2mPrefix + "_mul", z3, x0, T3), - // S1 = S1 + T3; - c.call(f2mPrefix + "_add", S1, T3, S1), - // T4 = T4 + T3; - c.call(f2mPrefix + "_add", T4, T3, z3), - // z3 = T4; - - // For z.b_.b_ = z4 - // T3 = z5 * x2; - c.call(f2mPrefix + "_mul", z5, x2, T3), - // S1 = S1 + T3; - c.call(f2mPrefix + "_add", S1, T3, S1), - // T4 = my_Fp6::non_residue * T3; - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), T3, T4), - // t0 = x0 + x4; - c.call(f2mPrefix + "_add", x0, x4, t0), - // T3 = t2 * t0 - D0 - D4; - c.call(f2mPrefix + "_mul", t2, t0, T3), - c.call(f2mPrefix + "_add", D0, D4, AUX), - c.call(f2mPrefix + "_sub", T3, AUX, T3), - // T4 = T4 + T3; - c.call(f2mPrefix + "_add", T4, T3, z4), - // z4 = T4; - - // For z.b_.c_ = z5. - // t0 = x0 + x2 + x4; - c.call(f2mPrefix + "_add", x0, x2, t0), - c.call(f2mPrefix + "_add", t0, x4, t0), - // T3 = s0 * t0 - S1; - c.call(f2mPrefix + "_mul", s0, t0, T3), - c.call(f2mPrefix + "_sub", T3, S1, z5), - // z5 = T3; - - ); - } - - - function buildMillerLoop() { - const f = module.addFunction(prefix+ "_millerLoop"); - f.addParam("ppreP", "i32"); - f.addParam("ppreQ", "i32"); - f.addParam("r", "i32"); - f.addLocal("pCoef", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const preP_PX = c.getLocal("ppreP"); - const preP_PY = c.i32_add(c.getLocal("ppreP"), c.i32_const(f1size)); - - const ELL_0 = c.getLocal("pCoef"); - const ELL_VW = c.i32_add(c.getLocal("pCoef"), c.i32_const(f2size)); - const ELL_VV = c.i32_add(c.getLocal("pCoef"), c.i32_const(2*f2size)); - - - const pVW = module.alloc(f2size); - const VW = c.i32_const(pVW); - const pVV = module.alloc(f2size); - const VV = c.i32_const(pVV); - - const F = c.getLocal("r"); - - - f.addCode( - c.call(ftmPrefix + "_one", F), - - c.setLocal("pCoef", c.i32_add( c.getLocal("ppreQ"), c.i32_const(f2size*3))), - - c.setLocal("i", c.i32_const(ateLoopBitBytes.length-2)), - c.block(c.loop( - - - c.call(ftmPrefix + "_square", F, F), - - c.call(f2mPrefix + "_mul1", ELL_VW,preP_PY, VW), - c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), - c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.if( - c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), - [ - ...c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), - ...c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), - - ...c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), - ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - ] - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - - ); - - f.addCode( - c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), - c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), - c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.call(f2mPrefix + "_mul1", ELL_VW, preP_PY, VW), - c.call(f2mPrefix + "_mul1", ELL_VV, preP_PX, VV), - c.call(prefix + "__mulBy024", ELL_0, VW, VV, F), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - ); - - } - - - function buildFrobeniusMap(n) { - const F12 = [ - [ - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - ], - [ - [1n, 0n], - [8376118865763821496583973867626364092589906065868298776909617916018768340080n, 16469823323077808223889137241176536799009286646108169935659301613961712198316n], - [21888242871839275220042445260109153167277707414472061641714758635765020556617n, 0n], - [11697423496358154304825782922584725312912383441159505038794027105778954184319n, 303847389135065887422783454877609941456349188919719272345083954437860409601n], - [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n], - [3321304630594332808241809054958361220322477375291206261884409189760185844239n, 5722266937896532885780051958958348231143373700109372999374820235121374419868n], - [21888242871839275222246405745257275088696311157297823662689037894645226208582n, 0n], - [13512124006075453725662431877630910996106405091429524885779419978626457868503n, 5418419548761466998357268504080738289687024511189653727029736280683514010267n], - [2203960485148121921418603742825762020974279258880205651966n, 0n], - [10190819375481120917420622822672549775783927716138318623895010788866272024264n, 21584395482704209334823622290379665147239961968378104390343953940207365798982n], - [2203960485148121921418603742825762020974279258880205651967n, 0n], - [18566938241244942414004596690298913868373833782006617400804628704885040364344n, 16165975933942742336466353786298926857552937457188450663314217659523851788715n], - ] - ]; - - const F6 = [ - [ - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - ], - [ - [1n, 0n], - [21575463638280843010398324269430826099269044274347216827212613867836435027261n, 10307601595873709700152284273816112264069230130616436755625194854815875713954n], - [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n], - [3772000881919853776433695186713858239009073593817195771773381919316419345261n, 2236595495967245188281701248203181795121068902605861227855261137820944008926n], - [2203960485148121921418603742825762020974279258880205651966n, 0n], - [18429021223477853657660792034369865839114504446431234726392080002137598044644n, 9344045779998320333812420223237981029506012124075525679208581902008406485703n], - ], - [ - [1n, 0n], - [2581911344467009335267311115468803099551665605076196740867805258568234346338n, 19937756971775647987995932169929341994314640652964949448313374472400716661030n], - [2203960485148121921418603742825762020974279258880205651966n, 0n], - [5324479202449903542726783395506214481928257762400643279780343368557297135718n, 16208900380737693084919495127334387981393726419856888799917914180988844123039n], - [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n], - [13981852324922362344252311234282257507216387789820983642040889267519694726527n, 7629828391165209371577384193250820201684255241773809077146787135900891633097n], - ] - ]; - - const f = module.addFunction(prefix+ "__frobeniusMap"+n); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - for (let i=0; i<6; i++) { - const X = (i==0) ? c.getLocal("x") : c.i32_add(c.getLocal("x"), c.i32_const(i*f2size)); - const Xc0 = X; - const Xc1 = c.i32_add(c.getLocal("x"), c.i32_const(i*f2size + f1size)); - const R = (i==0) ? c.getLocal("r") : c.i32_add(c.getLocal("r"), c.i32_const(i*f2size)); - const Rc0 = R; - const Rc1 = c.i32_add(c.getLocal("r"), c.i32_const(i*f2size + f1size)); - const coef = mul2(F12[Math.floor(i/3)][n%12] , F6[i%3][n%6]); - const pCoef = module.alloc([ - ...utils$1.bigInt2BytesLE(toMontgomery(coef[0]), 32), - ...utils$1.bigInt2BytesLE(toMontgomery(coef[1]), 32), - ]); - if (n%2 == 1) { - f.addCode( - c.call(f1mPrefix + "_copy", Xc0, Rc0), - c.call(f1mPrefix + "_neg", Xc1, Rc1), - c.call(f2mPrefix + "_mul", R, c.i32_const(pCoef), R), - ); - } else { - f.addCode(c.call(f2mPrefix + "_mul", X, c.i32_const(pCoef), R)); - } - } - - function mul2(a, b) { - const ac0 = BigInt(a[0]); - const ac1 = BigInt(a[1]); - const bc0 = BigInt(b[0]); - const bc1 = BigInt(b[1]); - const res = [ - (ac0 * bc0 - ( ac1 * bc1) ) % q, - (ac0 * bc1 + ( ac1 * bc0) ) % q, - ]; - if (isNegative$2(res[0])) res[0] = res[0] + q; - return res; - } - - } - - - - function buildFinalExponentiationFirstChunk() { - - const f = module.addFunction(prefix+ "__finalExponentiationFirstChunk"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const elt = c.getLocal("x"); - const eltC0 = elt; - const eltC1 = c.i32_add(elt, c.i32_const(n8*6)); - const r = c.getLocal("r"); - const pA = module.alloc(ftsize); - const A = c.i32_const(pA); - const Ac0 = A; - const Ac1 = c.i32_const(pA + n8*6); - const B = c.i32_const(module.alloc(ftsize)); - const C = c.i32_const(module.alloc(ftsize)); - const D = c.i32_const(module.alloc(ftsize)); - - f.addCode( - // const alt_bn128_Fq12 A = alt_bn128_Fq12(elt.c0,-elt.c1); - c.call(f6mPrefix + "_copy", eltC0, Ac0), - c.call(f6mPrefix + "_neg", eltC1, Ac1), - - // const alt_bn128_Fq12 B = elt.inverse(); - c.call(ftmPrefix + "_inverse", elt, B), - - // const alt_bn128_Fq12 C = A * B; - c.call(ftmPrefix + "_mul", A, B, C), - // const alt_bn128_Fq12 D = C.Frobenius_map(2); - c.call(prefix + "__frobeniusMap2", C, D), - // const alt_bn128_Fq12 result = D * C; - c.call(ftmPrefix + "_mul", C, D, r), - ); - } - - function buildCyclotomicSquare() { - const f = module.addFunction(prefix+ "__cyclotomicSquare"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x4 = c.i32_add(c.getLocal("x"), c.i32_const(f2size)); - const x3 = c.i32_add(c.getLocal("x"), c.i32_const(2*f2size)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(3*f2size)); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(4*f2size)); - const x5 = c.i32_add(c.getLocal("x"), c.i32_const(5*f2size)); - - const r0 = c.getLocal("r"); - const r4 = c.i32_add(c.getLocal("r"), c.i32_const(f2size)); - const r3 = c.i32_add(c.getLocal("r"), c.i32_const(2*f2size)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(3*f2size)); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(4*f2size)); - const r5 = c.i32_add(c.getLocal("r"), c.i32_const(5*f2size)); - - const t0 = c.i32_const(module.alloc(f2size)); - const t1 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const t3 = c.i32_const(module.alloc(f2size)); - const t4 = c.i32_const(module.alloc(f2size)); - const t5 = c.i32_const(module.alloc(f2size)); - const tmp = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - - f.addCode( - // // t0 + t1*y = (z0 + z1*y)^2 = a^2 - // tmp = z0 * z1; - // t0 = (z0 + z1) * (z0 + my_Fp6::non_residue * z1) - tmp - my_Fp6::non_residue * tmp; - // t1 = tmp + tmp; - c.call(f2mPrefix + "_mul", x0, x1, tmp), - c.call(f2mPrefix + "_mul", x1, c.i32_const(pNonResidueF6), t0), - c.call(f2mPrefix + "_add", x0, t0, t0), - c.call(f2mPrefix + "_add", x0, x1, AUX), - c.call(f2mPrefix + "_mul", AUX, t0, t0), - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t0, AUX, t0), - c.call(f2mPrefix + "_add", tmp, tmp, t1), - - // // t2 + t3*y = (z2 + z3*y)^2 = b^2 - // tmp = z2 * z3; - // t2 = (z2 + z3) * (z2 + my_Fp6::non_residue * z3) - tmp - my_Fp6::non_residue * tmp; - // t3 = tmp + tmp; - c.call(f2mPrefix + "_mul", x2, x3, tmp), - c.call(f2mPrefix + "_mul", x3, c.i32_const(pNonResidueF6), t2), - c.call(f2mPrefix + "_add", x2, t2, t2), - c.call(f2mPrefix + "_add", x2, x3, AUX), - c.call(f2mPrefix + "_mul", AUX, t2, t2), - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t2, AUX, t2), - c.call(f2mPrefix + "_add", tmp, tmp, t3), - - // // t4 + t5*y = (z4 + z5*y)^2 = c^2 - // tmp = z4 * z5; - // t4 = (z4 + z5) * (z4 + my_Fp6::non_residue * z5) - tmp - my_Fp6::non_residue * tmp; - // t5 = tmp + tmp; - c.call(f2mPrefix + "_mul", x4, x5, tmp), - c.call(f2mPrefix + "_mul", x5, c.i32_const(pNonResidueF6), t4), - c.call(f2mPrefix + "_add", x4, t4, t4), - c.call(f2mPrefix + "_add", x4, x5, AUX), - c.call(f2mPrefix + "_mul", AUX, t4, t4), - c.call(f2mPrefix + "_mul", c.i32_const(pNonResidueF6), tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t4, AUX, t4), - c.call(f2mPrefix + "_add", tmp, tmp, t5), - - // For A - // z0 = 3 * t0 - 2 * z0 - c.call(f2mPrefix + "_sub", t0, x0, r0), - c.call(f2mPrefix + "_add", r0, r0, r0), - c.call(f2mPrefix + "_add", t0, r0, r0), - // z1 = 3 * t1 + 2 * z1 - c.call(f2mPrefix + "_add", t1, x1, r1), - c.call(f2mPrefix + "_add", r1, r1, r1), - c.call(f2mPrefix + "_add", t1, r1, r1), - - // For B - // z2 = 3 * (xi * t5) + 2 * z2 - c.call(f2mPrefix + "_mul", t5, c.i32_const(pAltBn128Twist), AUX), - c.call(f2mPrefix + "_add", AUX, x2, r2), - c.call(f2mPrefix + "_add", r2, r2, r2), - c.call(f2mPrefix + "_add", AUX, r2, r2), - // z3 = 3 * t4 - 2 * z3 - c.call(f2mPrefix + "_sub", t4, x3, r3), - c.call(f2mPrefix + "_add", r3, r3, r3), - c.call(f2mPrefix + "_add", t4, r3, r3), - - // For C - // z4 = 3 * t2 - 2 * z4 - c.call(f2mPrefix + "_sub", t2, x4, r4), - c.call(f2mPrefix + "_add", r4, r4, r4), - c.call(f2mPrefix + "_add", t2, r4, r4), - // z5 = 3 * t3 + 2 * z5 - c.call(f2mPrefix + "_add", t3, x5, r5), - c.call(f2mPrefix + "_add", r5, r5, r5), - c.call(f2mPrefix + "_add", t3, r5, r5), - - ); - } - - - function buildCyclotomicExp(exponent, fnName) { - const exponentNafBytes = naf(exponent).map( (b) => (b==-1 ? 0xFF: b) ); - const pExponentNafBytes = module.alloc(exponentNafBytes); - - const f = module.addFunction(prefix+ "__cyclotomicExp_"+fnName); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - f.addLocal("bit", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const x = c.getLocal("x"); - - const res = c.getLocal("r"); - - const inverse = c.i32_const(module.alloc(ftsize)); - - - f.addCode( - c.call(ftmPrefix + "_conjugate", x, inverse), - c.call(ftmPrefix + "_one", res), - - c.if( - c.teeLocal("bit", c.i32_load8_s(c.i32_const(exponentNafBytes.length-1), pExponentNafBytes)), - c.if( - c.i32_eq( - c.getLocal("bit"), - c.i32_const(1) - ), - c.call(ftmPrefix + "_mul", res, x, res), - c.call(ftmPrefix + "_mul", res, inverse, res), - ) - ), - - c.setLocal("i", c.i32_const(exponentNafBytes.length-2)), - c.block(c.loop( - c.call(prefix + "__cyclotomicSquare", res, res), - c.if( - c.teeLocal("bit", c.i32_load8_s(c.getLocal("i"), pExponentNafBytes)), - c.if( - c.i32_eq( - c.getLocal("bit"), - c.i32_const(1) - ), - c.call(ftmPrefix + "_mul", res, x, res), - c.call(ftmPrefix + "_mul", res, inverse, res), - ) - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - - function buildFinalExponentiationLastChunk() { - buildCyclotomicSquare(); - buildCyclotomicExp(finalExpZ, "w0"); - - const f = module.addFunction(prefix+ "__finalExponentiationLastChunk"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const elt = c.getLocal("x"); - const result = c.getLocal("r"); - const A = c.i32_const(module.alloc(ftsize)); - const B = c.i32_const(module.alloc(ftsize)); - const C = c.i32_const(module.alloc(ftsize)); - const D = c.i32_const(module.alloc(ftsize)); - const E = c.i32_const(module.alloc(ftsize)); - const F = c.i32_const(module.alloc(ftsize)); - const G = c.i32_const(module.alloc(ftsize)); - const H = c.i32_const(module.alloc(ftsize)); - const I = c.i32_const(module.alloc(ftsize)); - const J = c.i32_const(module.alloc(ftsize)); - const K = c.i32_const(module.alloc(ftsize)); - const L = c.i32_const(module.alloc(ftsize)); - const M = c.i32_const(module.alloc(ftsize)); - const N = c.i32_const(module.alloc(ftsize)); - const O = c.i32_const(module.alloc(ftsize)); - const P = c.i32_const(module.alloc(ftsize)); - const Q = c.i32_const(module.alloc(ftsize)); - const R = c.i32_const(module.alloc(ftsize)); - const S = c.i32_const(module.alloc(ftsize)); - const T = c.i32_const(module.alloc(ftsize)); - const U = c.i32_const(module.alloc(ftsize)); - - f.addCode( - - - // A = exp_by_neg_z(elt) // = elt^(-z) - c.call(prefix + "__cyclotomicExp_w0", elt, A), - c.call(ftmPrefix + "_conjugate", A, A), - // B = A^2 // = elt^(-2*z) - c.call(prefix + "__cyclotomicSquare", A, B), - // C = B^2 // = elt^(-4*z) - c.call(prefix + "__cyclotomicSquare", B, C), - // D = C * B // = elt^(-6*z) - c.call(ftmPrefix + "_mul", C, B, D), - // E = exp_by_neg_z(D) // = elt^(6*z^2) - c.call(prefix + "__cyclotomicExp_w0", D, E), - c.call(ftmPrefix + "_conjugate", E, E), - // F = E^2 // = elt^(12*z^2) - c.call(prefix + "__cyclotomicSquare", E, F), - // G = epx_by_neg_z(F) // = elt^(-12*z^3) - c.call(prefix + "__cyclotomicExp_w0", F, G), - c.call(ftmPrefix + "_conjugate", G, G), - // H = conj(D) // = elt^(6*z) - c.call(ftmPrefix + "_conjugate", D, H), - // I = conj(G) // = elt^(12*z^3) - c.call(ftmPrefix + "_conjugate", G, I), - // J = I * E // = elt^(12*z^3 + 6*z^2) - c.call(ftmPrefix + "_mul", I, E, J), - // K = J * H // = elt^(12*z^3 + 6*z^2 + 6*z) - c.call(ftmPrefix + "_mul", J, H, K), - // L = K * B // = elt^(12*z^3 + 6*z^2 + 4*z) - c.call(ftmPrefix + "_mul", K, B, L), - // M = K * E // = elt^(12*z^3 + 12*z^2 + 6*z) - c.call(ftmPrefix + "_mul", K, E, M), - - // N = M * elt // = elt^(12*z^3 + 12*z^2 + 6*z + 1) - c.call(ftmPrefix + "_mul", M, elt, N), - - // O = L.Frobenius_map(1) // = elt^(q*(12*z^3 + 6*z^2 + 4*z)) - c.call(prefix + "__frobeniusMap1", L, O), - // P = O * N // = elt^(q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1)) - c.call(ftmPrefix + "_mul", O, N, P), - // Q = K.Frobenius_map(2) // = elt^(q^2 * (12*z^3 + 6*z^2 + 6*z)) - c.call(prefix + "__frobeniusMap2", K, Q), - // R = Q * P // = elt^(q^2 * (12*z^3 + 6*z^2 + 6*z) + q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1)) - c.call(ftmPrefix + "_mul", Q, P, R), - // S = conj(elt) // = elt^(-1) - c.call(ftmPrefix + "_conjugate", elt, S), - // T = S * L // = elt^(12*z^3 + 6*z^2 + 4*z - 1) - c.call(ftmPrefix + "_mul", S, L, T), - // U = T.Frobenius_map(3) // = elt^(q^3(12*z^3 + 6*z^2 + 4*z - 1)) - c.call(prefix + "__frobeniusMap3", T, U), - // V = U * R // = elt^(q^3(12*z^3 + 6*z^2 + 4*z - 1) + q^2 * (12*z^3 + 6*z^2 + 6*z) + q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1)) - c.call(ftmPrefix + "_mul", U, R, result), - // result = V - ); - } - - - function buildFinalExponentiation() { - buildFinalExponentiationFirstChunk(); - buildFinalExponentiationLastChunk(); - const f = module.addFunction(prefix+ "_finalExponentiation"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const elt = c.getLocal("x"); - const result = c.getLocal("r"); - const eltToFirstChunk = c.i32_const(module.alloc(ftsize)); - - f.addCode( - c.call(prefix + "__finalExponentiationFirstChunk", elt, eltToFirstChunk ), - c.call(prefix + "__finalExponentiationLastChunk", eltToFirstChunk, result ) - ); - } - - - function buildFinalExponentiationOld() { - const f = module.addFunction(prefix+ "_finalExponentiationOld"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const exponent = 552484233613224096312617126783173147097382103762957654188882734314196910839907541213974502761540629817009608548654680343627701153829446747810907373256841551006201639677726139946029199968412598804882391702273019083653272047566316584365559776493027495458238373902875937659943504873220554161550525926302303331747463515644711876653177129578303191095900909191624817826566688241804408081892785725967931714097716709526092261278071952560171111444072049229123565057483750161460024353346284167282452756217662335528813519139808291170539072125381230815729071544861602750936964829313608137325426383735122175229541155376346436093930287402089517426973178917569713384748081827255472576937471496195752727188261435633271238710131736096299798168852925540549342330775279877006784354801422249722573783561685179618816480037695005515426162362431072245638324744480n; - - const pExponent = module.alloc(utils$1.bigInt2BytesLE( exponent, 352 )); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(ftmPrefix + "_exp", c.getLocal("x"), c.i32_const(pExponent), c.i32_const(352), c.getLocal("r")), - ); - } - - - - - const pPreP = module.alloc(prePSize); - const pPreQ = module.alloc(preQSize); - - function buildPairingEquation(nPairings) { - - const f = module.addFunction(prefix+ "_pairingEq"+nPairings); - for (let i=0; i acc + ( b!=0 ? 1 : 0) ,0); - const ateNCoefs = ateNAddCoefs + ateNDblCoefs + 1; - const prePSize = 3*2*n8q; - const preQSize = 3*n8q*2 + ateNCoefs*ateCoefSize; - const finalExpIsNegative = true; - - const finalExpZ = 15132376222941642752n; - - - module.modules[prefix] = { - n64q: n64q, - n64r: n64r, - n8q: n8q, - n8r: n8r, - pG1gen: pG1gen, - pG1zero: pG1zero, - pG1b: pG1b, - pG2gen: pG2gen, - pG2zero: pG2zero, - pG2b: pG2b, - pq: module.modules["f1m"].pq, - pr: pr, - pOneT: pOneT, - r: r, - q: q, - prePSize: prePSize, - preQSize: preQSize - }; - - - function naf(n) { - let E = n; - const res = []; - while (E > 0n) { - if (isOdd(E)) { - const z = 2 - Number(E % 4n); - res.push( z ); - E = E - BigInt(z); - } else { - res.push( 0 ); - } - E = E >> 1n; - } - return res; - } - - function bits(n) { - let E = n; - const res = []; - while (E > 0n) { - if (isOdd(E)) { - res.push( 1 ); - } else { - res.push( 0 ); - } - E = E >> 1n; - } - return res; - } - - function buildPrepareG1() { - const f = module.addFunction(prefix+ "_prepareG1"); - f.addParam("pP", "i32"); - f.addParam("ppreP", "i32"); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(g1mPrefix + "_normalize", c.getLocal("pP"), c.getLocal("ppreP")), // TODO Remove if already in affine - ); - } - - - - function buildPrepDoubleStep() { - const f = module.addFunction(prefix+ "_prepDblStep"); - f.addParam("R", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const Rx = c.getLocal("R"); - const Ry = c.i32_add(c.getLocal("R"), c.i32_const(2*n8q)); - const Rz = c.i32_add(c.getLocal("R"), c.i32_const(4*n8q)); - - const t0 = c.getLocal("r"); - const t3 = c.i32_add(c.getLocal("r"), c.i32_const(2*n8q)); - const t6 = c.i32_add(c.getLocal("r"), c.i32_const(4*n8q)); - - - const zsquared = c.i32_const(module.alloc(f2size)); - const t1 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const t4 = c.i32_const(module.alloc(f2size)); - const t5 = c.i32_const(module.alloc(f2size)); - - f.addCode( - - // tmp0 = r.x.square(); - c.call(f2mPrefix + "_square", Rx, t0), - - // tmp1 = r.y.square(); - c.call(f2mPrefix + "_square", Ry, t1), - - // tmp2 = tmp1.square(); - c.call(f2mPrefix + "_square", t1, t2), - - // tmp3 = (tmp1 + r.x).square() - tmp0 - tmp2; - c.call(f2mPrefix + "_add", t1, Rx, t3), - c.call(f2mPrefix + "_square", t3, t3), - c.call(f2mPrefix + "_sub", t3, t0, t3), - c.call(f2mPrefix + "_sub", t3, t2, t3), - - // tmp3 = tmp3 + tmp3; - c.call(f2mPrefix + "_add", t3, t3, t3), - - // tmp4 = tmp0 + tmp0 + tmp0; - c.call(f2mPrefix + "_add", t0, t0, t4), - c.call(f2mPrefix + "_add", t4, t0, t4), - - // tmp6 = r.x + tmp4; - c.call(f2mPrefix + "_add", Rx, t4, t6), - - // tmp5 = tmp4.square(); - c.call(f2mPrefix + "_square", t4, t5), - - // zsquared = r.z.square(); - c.call(f2mPrefix + "_square", Rz, zsquared), - - // r.x = tmp5 - tmp3 - tmp3; - c.call(f2mPrefix + "_sub", t5, t3, Rx), - c.call(f2mPrefix + "_sub", Rx, t3, Rx), - - // r.z = (r.z + r.y).square() - tmp1 - zsquared; - c.call(f2mPrefix + "_add", Rz, Ry, Rz), - c.call(f2mPrefix + "_square", Rz, Rz), - c.call(f2mPrefix + "_sub", Rz, t1, Rz), - c.call(f2mPrefix + "_sub", Rz, zsquared, Rz), - - // r.y = (tmp3 - r.x) * tmp4; - c.call(f2mPrefix + "_sub", t3, Rx, Ry), - c.call(f2mPrefix + "_mul", Ry, t4, Ry), - - // tmp2 = tmp2 + tmp2; - c.call(f2mPrefix + "_add", t2, t2, t2), - - // tmp2 = tmp2 + tmp2; - c.call(f2mPrefix + "_add", t2, t2, t2), - - // tmp2 = tmp2 + tmp2; - c.call(f2mPrefix + "_add", t2, t2, t2), - - // r.y -= tmp2; - c.call(f2mPrefix + "_sub", Ry, t2, Ry), - - // tmp3 = tmp4 * zsquared; - c.call(f2mPrefix + "_mul", t4, zsquared, t3), - - // tmp3 = tmp3 + tmp3; - c.call(f2mPrefix + "_add", t3, t3, t3), - - // tmp3 = -tmp3; - c.call(f2mPrefix + "_neg", t3, t3), - - // tmp6 = tmp6.square() - tmp0 - tmp5; - c.call(f2mPrefix + "_square", t6, t6), - c.call(f2mPrefix + "_sub", t6, t0, t6), - c.call(f2mPrefix + "_sub", t6, t5, t6), - - // tmp1 = tmp1 + tmp1; - c.call(f2mPrefix + "_add", t1, t1, t1), - - // tmp1 = tmp1 + tmp1; - c.call(f2mPrefix + "_add", t1, t1, t1), - - // tmp6 = tmp6 - tmp1; - c.call(f2mPrefix + "_sub", t6, t1, t6), - - // tmp0 = r.z * zsquared; - c.call(f2mPrefix + "_mul", Rz, zsquared, t0), - - // tmp0 = tmp0 + tmp0; - c.call(f2mPrefix + "_add", t0, t0, t0), - - ); - } - - function buildPrepAddStep() { - const f = module.addFunction(prefix+ "_prepAddStep"); - f.addParam("R", "i32"); - f.addParam("Q", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const Rx = c.getLocal("R"); - const Ry = c.i32_add(c.getLocal("R"), c.i32_const(2*n8q)); - const Rz = c.i32_add(c.getLocal("R"), c.i32_const(4*n8q)); - - const Qx = c.getLocal("Q"); - const Qy = c.i32_add(c.getLocal("Q"), c.i32_const(2*n8q)); - - const t10 = c.getLocal("r"); - const t1 = c.i32_add(c.getLocal("r"), c.i32_const(2*n8q)); - const t9 = c.i32_add(c.getLocal("r"), c.i32_const(4*n8q)); - - const zsquared = c.i32_const(module.alloc(f2size)); - const ysquared = c.i32_const(module.alloc(f2size)); - const ztsquared = c.i32_const(module.alloc(f2size)); - const t0 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const t3 = c.i32_const(module.alloc(f2size)); - const t4 = c.i32_const(module.alloc(f2size)); - const t5 = c.i32_const(module.alloc(f2size)); - const t6 = c.i32_const(module.alloc(f2size)); - const t7 = c.i32_const(module.alloc(f2size)); - const t8 = c.i32_const(module.alloc(f2size)); - - f.addCode( - - // zsquared = r.z.square(); - c.call(f2mPrefix + "_square", Rz, zsquared), - - // ysquared = q.y.square(); - c.call(f2mPrefix + "_square", Qy, ysquared), - - // t0 = zsquared * q.x; - c.call(f2mPrefix + "_mul", zsquared, Qx, t0), - - // t1 = ((q.y + r.z).square() - ysquared - zsquared) * zsquared; - c.call(f2mPrefix + "_add", Qy, Rz, t1), - c.call(f2mPrefix + "_square", t1, t1), - c.call(f2mPrefix + "_sub", t1, ysquared, t1), - c.call(f2mPrefix + "_sub", t1, zsquared, t1), - c.call(f2mPrefix + "_mul", t1, zsquared, t1), - - // t2 = t0 - r.x; - c.call(f2mPrefix + "_sub", t0, Rx, t2), - - // t3 = t2.square(); - c.call(f2mPrefix + "_square", t2, t3), - - // t4 = t3 + t3; - c.call(f2mPrefix + "_add", t3, t3, t4), - - // t4 = t4 + t4; - c.call(f2mPrefix + "_add", t4, t4, t4), - - // t5 = t4 * t2; - c.call(f2mPrefix + "_mul", t4, t2, t5), - - // t6 = t1 - r.y - r.y; - c.call(f2mPrefix + "_sub", t1, Ry, t6), - c.call(f2mPrefix + "_sub", t6, Ry, t6), - - // t9 = t6 * q.x; - c.call(f2mPrefix + "_mul", t6, Qx, t9), - - // t7 = t4 * r.x; - c.call(f2mPrefix + "_mul", t4, Rx, t7), - - // r.x = t6.square() - t5 - t7 - t7; - c.call(f2mPrefix + "_square", t6, Rx), - c.call(f2mPrefix + "_sub", Rx, t5, Rx), - c.call(f2mPrefix + "_sub", Rx, t7, Rx), - c.call(f2mPrefix + "_sub", Rx, t7, Rx), - - // r.z = (r.z + t2).square() - zsquared - t3; - c.call(f2mPrefix + "_add", Rz, t2, Rz), - c.call(f2mPrefix + "_square", Rz, Rz), - c.call(f2mPrefix + "_sub", Rz, zsquared, Rz), - c.call(f2mPrefix + "_sub", Rz, t3, Rz), - - // t10 = q.y + r.z; - c.call(f2mPrefix + "_add", Qy, Rz, t10), - - // t8 = (t7 - r.x) * t6; - c.call(f2mPrefix + "_sub", t7, Rx, t8), - c.call(f2mPrefix + "_mul", t8, t6, t8), - - // t0 = r.y * t5; - c.call(f2mPrefix + "_mul", Ry, t5, t0), - - // t0 = t0 + t0; - c.call(f2mPrefix + "_add", t0, t0, t0), - - // r.y = t8 - t0; - c.call(f2mPrefix + "_sub", t8, t0, Ry), - - // t10 = t10.square() - ysquared; - c.call(f2mPrefix + "_square", t10, t10), - c.call(f2mPrefix + "_sub", t10, ysquared, t10), - - // ztsquared = r.z.square(); - c.call(f2mPrefix + "_square", Rz, ztsquared), - - // t10 = t10 - ztsquared; - c.call(f2mPrefix + "_sub", t10, ztsquared, t10), - - // t9 = t9 + t9 - t10; - c.call(f2mPrefix + "_add", t9, t9, t9), - c.call(f2mPrefix + "_sub", t9, t10, t9), - - // t10 = r.z + r.z; - c.call(f2mPrefix + "_add", Rz, Rz, t10), - - // t6 = -t6; - c.call(f2mPrefix + "_neg", t6, t6), - - // t1 = t6 + t6; - c.call(f2mPrefix + "_add", t6, t6, t1), - ); - } - - - function buildPrepareG2() { - const f = module.addFunction(prefix+ "_prepareG2"); - f.addParam("pQ", "i32"); - f.addParam("ppreQ", "i32"); - f.addLocal("pCoef", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - - const Q = c.getLocal("pQ"); - - const pR = module.alloc(f2size*3); - const R = c.i32_const(pR); - - const base = c.getLocal("ppreQ"); - - f.addCode( - c.call(g2mPrefix + "_normalize", Q, base), - c.if( - c.call(g2mPrefix + "_isZero", base), - c.ret([]) - ), - c.call(g2mPrefix + "_copy", base, R), - c.setLocal("pCoef", c.i32_add(c.getLocal("ppreQ"), c.i32_const(f2size*3))), - ); - - f.addCode( - c.setLocal("i", c.i32_const(ateLoopBitBytes.length-2)), - c.block(c.loop( - - c.call(prefix + "_prepDblStep", R, c.getLocal("pCoef")), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.if( - c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), - [ - ...c.call(prefix + "_prepAddStep", R, base, c.getLocal("pCoef")), - ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - ] - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - } - - - function buildF6Mul1() { - const f = module.addFunction(f6mPrefix+ "_mul1"); - f.addParam("pA", "i32"); // F6 - f.addParam("pC1", "i32"); // F2 - f.addParam("pR", "i32"); // F6 - - const c = f.getCodeBuilder(); - - const A_c0 = c.getLocal("pA"); - const A_c1 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*2)); - const A_c2 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*4)); - - const c1 = c.getLocal("pC1"); - - const t1 = c.getLocal("pR"); - const t2 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*2)); - const b_b = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*4)); - - const Ac0_Ac1 = c.i32_const(module.alloc(f1size*2)); - const Ac1_Ac2 = c.i32_const(module.alloc(f1size*2)); - - f.addCode( - - c.call(f2mPrefix + "_add", A_c0, A_c1, Ac0_Ac1), - c.call(f2mPrefix + "_add", A_c1, A_c2, Ac1_Ac2), - - // let b_b = self.c1 * c1; - c.call(f2mPrefix + "_mul", A_c1, c1, b_b), - - // let t1 = (self.c1 + self.c2) * c1 - b_b; - c.call(f2mPrefix + "_mul", Ac1_Ac2, c1, t1), - c.call(f2mPrefix + "_sub", t1, b_b, t1), - - // let t1 = t1.mul_by_nonresidue(); - c.call(f2mPrefix + "_mulNR", t1, t1), - - // let t2 = (self.c0 + self.c1) * c1 - b_b; - c.call(f2mPrefix + "_mul", Ac0_Ac1, c1, t2), - c.call(f2mPrefix + "_sub", t2, b_b, t2), - ); - } - buildF6Mul1(); - - function buildF6Mul01() { - const f = module.addFunction(f6mPrefix+ "_mul01"); - f.addParam("pA", "i32"); // F6 - f.addParam("pC0", "i32"); // F2 - f.addParam("pC1", "i32"); // F2 - f.addParam("pR", "i32"); // F6 - - const c = f.getCodeBuilder(); - - const A_c0 = c.getLocal("pA"); - const A_c1 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*2)); - const A_c2 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*4)); - - const c0 = c.getLocal("pC0"); - const c1 = c.getLocal("pC1"); - - const t1 = c.getLocal("pR"); - const t2 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*2)); - const t3 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*4)); - - const a_a = c.i32_const(module.alloc(f1size*2)); - const b_b = c.i32_const(module.alloc(f1size*2)); - const Ac0_Ac1 = c.i32_const(module.alloc(f1size*2)); - const Ac0_Ac2 = c.i32_const(module.alloc(f1size*2)); - - f.addCode( - // let a_a = self.c0 * c0; - c.call(f2mPrefix + "_mul", A_c0, c0, a_a), - - // let b_b = self.c1 * c1; - c.call(f2mPrefix + "_mul", A_c1, c1, b_b), - - - c.call(f2mPrefix + "_add", A_c0, A_c1, Ac0_Ac1), - c.call(f2mPrefix + "_add", A_c0, A_c2, Ac0_Ac2), - - // let t1 = (self.c1 + self.c2) * c1 - b_b; - c.call(f2mPrefix + "_add", A_c1, A_c2, t1), - c.call(f2mPrefix + "_mul", t1, c1, t1), - c.call(f2mPrefix + "_sub", t1, b_b, t1), - - // let t1 = t1.mul_by_nonresidue() + a_a; - c.call(f2mPrefix + "_mulNR", t1, t1), - c.call(f2mPrefix + "_add", t1, a_a, t1), - - // let t2 = (c0 + c1) * (self.c0 + self.c1) - a_a - b_b; - c.call(f2mPrefix + "_add", c0, c1, t2), - c.call(f2mPrefix + "_mul", t2, Ac0_Ac1, t2), - c.call(f2mPrefix + "_sub", t2, a_a, t2), - c.call(f2mPrefix + "_sub", t2, b_b, t2), - - // let t3 = (self.c0 + self.c2) * c0 - a_a + b_b; - c.call(f2mPrefix + "_mul", Ac0_Ac2, c0, t3), - c.call(f2mPrefix + "_sub", t3, a_a, t3), - c.call(f2mPrefix + "_add", t3, b_b, t3), - - - ); - } - buildF6Mul01(); - - - function buildF12Mul014() { - - const f = module.addFunction(ftmPrefix+ "_mul014"); - f.addParam("pA", "i32"); // F12 - f.addParam("pC0", "i32"); // F2 - f.addParam("pC1", "i32"); // F2 - f.addParam("pC4", "i32"); // F2 - f.addParam("pR", "i32"); // F12 - - const c = f.getCodeBuilder(); - - - const A_c0 = c.getLocal("pA"); - const A_c1 = c.i32_add(c.getLocal("pA"), c.i32_const(f1size*6)); - - const c0 = c.getLocal("pC0"); - const c1 = c.getLocal("pC1"); - const c4 = c.getLocal("pC4"); - - const aa = c.i32_const(module.alloc(f1size*6)); - const bb = c.i32_const(module.alloc(f1size*6)); - const o = c.i32_const(module.alloc(f1size*2)); - - const R_c0 = c.getLocal("pR"); - const R_c1 = c.i32_add(c.getLocal("pR"), c.i32_const(f1size*6)); - - f.addCode( - // let aa = self.c0.mul_by_01(c0, c1); - c.call(f6mPrefix + "_mul01", A_c0, c0, c1, aa), - - // let bb = self.c1.mul_by_1(c4); - c.call(f6mPrefix + "_mul1", A_c1, c4, bb), - - // let o = c1 + c4; - c.call(f2mPrefix + "_add", c1, c4, o), - - // let c1 = self.c1 + self.c0; - c.call(f6mPrefix + "_add", A_c1, A_c0, R_c1), - - // let c1 = c1.mul_by_01(c0, &o); - c.call(f6mPrefix + "_mul01", R_c1, c0, o, R_c1), - - // let c1 = c1 - aa - bb; - c.call(f6mPrefix + "_sub", R_c1, aa, R_c1), - c.call(f6mPrefix + "_sub", R_c1, bb, R_c1), - - // let c0 = bb; - c.call(f6mPrefix + "_copy", bb, R_c0), - - // let c0 = c0.mul_by_nonresidue(); - c.call(f6mPrefix + "_mulNR", R_c0, R_c0), - - // let c0 = c0 + aa; - c.call(f6mPrefix + "_add", R_c0, aa, R_c0), - ); - } - buildF12Mul014(); - - - function buildELL() { - const f = module.addFunction(prefix+ "_ell"); - f.addParam("pP", "i32"); - f.addParam("pCoefs", "i32"); - f.addParam("pF", "i32"); - - const c = f.getCodeBuilder(); - - const Px = c.getLocal("pP"); - const Py = c.i32_add(c.getLocal("pP"), c.i32_const(n8q)); - - const F = c.getLocal("pF"); - - const coef0_0 = c.getLocal("pCoefs"); - const coef0_1 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size)); - const coef1_0 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size*2)); - const coef1_1 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size*3)); - const coef2 = c.i32_add(c.getLocal("pCoefs"), c.i32_const(f1size*4)); - - const pc0 = module.alloc(f1size*2); - const c0 = c.i32_const(pc0); - const c0_c0 = c.i32_const(pc0); - const c0_c1 = c.i32_const(pc0+f1size); - - const pc1 = module.alloc(f1size*2); - const c1 = c.i32_const(pc1); - const c1_c0 = c.i32_const(pc1); - const c1_c1 = c.i32_const(pc1+f1size); - f.addCode( - // let mut c0 = coeffs.0; - // let mut c1 = coeffs.1; - // - // c0.c0 *= p.y; - // c0.c1 *= p.y; - // - // c1.c0 *= p.x; - // c1.c1 *= p.x; - // - // f.mul_by_014(&coeffs.2, &c1, &c0) - - c.call(f1mPrefix + "_mul", coef0_0, Py, c0_c0), - c.call(f1mPrefix + "_mul", coef0_1, Py, c0_c1), - c.call(f1mPrefix + "_mul", coef1_0, Px, c1_c0), - c.call(f1mPrefix + "_mul", coef1_1, Px, c1_c1), - - c.call(ftmPrefix + "_mul014", F, coef2, c1, c0, F), - - ); - - } - buildELL(); - - function buildMillerLoop() { - const f = module.addFunction(prefix+ "_millerLoop"); - f.addParam("ppreP", "i32"); - f.addParam("ppreQ", "i32"); - f.addParam("r", "i32"); - f.addLocal("pCoef", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const preP = c.getLocal("ppreP"); - - const coefs = c.getLocal("pCoef"); - - const F = c.getLocal("r"); - - - f.addCode( - c.call(ftmPrefix + "_one", F), - - c.if( - c.call(g1mPrefix + "_isZero", preP), - c.ret([]) - ), - c.if( - c.call(g1mPrefix + "_isZero", c.getLocal("ppreQ")), - c.ret([]) - ), - c.setLocal("pCoef", c.i32_add( c.getLocal("ppreQ"), c.i32_const(f2size*3))), - - c.setLocal("i", c.i32_const(ateLoopBitBytes.length-2)), - c.block(c.loop( - - - c.call(prefix + "_ell", preP, coefs, F), - c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - - c.if( - c.i32_load8_s(c.getLocal("i"), pAteLoopBitBytes), - [ - ...c.call(prefix + "_ell", preP, coefs, F), - ...c.setLocal("pCoef", c.i32_add(c.getLocal("pCoef"), c.i32_const(ateCoefSize))), - ] - ), - c.call(ftmPrefix + "_square", F, F), - - c.br_if(1, c.i32_eq ( c.getLocal("i"), c.i32_const(1) )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )), - c.call(prefix + "_ell", preP, coefs, F), - - ); - - - { - f.addCode( - c.call(ftmPrefix + "_conjugate", F, F), - ); - } - } - - - function buildFrobeniusMap(n) { - const F12 = [ - [ - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - ], - [ - [1n, 0n], - [3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n, 151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n, 0n], - [2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n, 1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n], - [3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n, 877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n], - [4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n, 0n], - [151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n, 3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n], - [1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n, 2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n, 0n], - [877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n, 3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n], - ] - ]; - - const F6 = [ - [ - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - [1n, 0n], - ], - [ - [1n, 0n], - [0n, 4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n], - [0n, 1n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n], - [0n, 793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n], - ], - [ - [1n, 0n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n, 0n], - [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n], - [4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n, 0n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n], - [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n, 0n], - ] - ]; - - const f = module.addFunction(ftmPrefix + "_frobeniusMap"+n); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - for (let i=0; i<6; i++) { - const X = (i==0) ? c.getLocal("x") : c.i32_add(c.getLocal("x"), c.i32_const(i*f2size)); - const Xc0 = X; - const Xc1 = c.i32_add(c.getLocal("x"), c.i32_const(i*f2size + f1size)); - const R = (i==0) ? c.getLocal("r") : c.i32_add(c.getLocal("r"), c.i32_const(i*f2size)); - const Rc0 = R; - const Rc1 = c.i32_add(c.getLocal("r"), c.i32_const(i*f2size + f1size)); - const coef = mul2(F12[Math.floor(i/3)][n%12] , F6[i%3][n%6]); - const pCoef = module.alloc([ - ...utils.bigInt2BytesLE(toMontgomery(coef[0]), n8q), - ...utils.bigInt2BytesLE(toMontgomery(coef[1]), n8q), - ]); - if (n%2 == 1) { - f.addCode( - c.call(f1mPrefix + "_copy", Xc0, Rc0), - c.call(f1mPrefix + "_neg", Xc1, Rc1), - c.call(f2mPrefix + "_mul", R, c.i32_const(pCoef), R), - ); - } else { - f.addCode(c.call(f2mPrefix + "_mul", X, c.i32_const(pCoef), R)); - } - } - - function mul2(a, b) { - const ac0 = a[0]; - const ac1 = a[1]; - const bc0 = b[0]; - const bc1 = b[1]; - const res = [ - (ac0 * bc0 - (ac1 * bc1)) % q, - (ac0 * bc1 + (ac1 * bc0)) % q, - ]; - if (isNegative$1(res[0])) res[0] = res[0] + q; - return res; - } - - } - - - function buildCyclotomicSquare() { - const f = module.addFunction(prefix+ "__cyclotomicSquare"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const x0 = c.getLocal("x"); - const x4 = c.i32_add(c.getLocal("x"), c.i32_const(f2size)); - const x3 = c.i32_add(c.getLocal("x"), c.i32_const(2*f2size)); - const x2 = c.i32_add(c.getLocal("x"), c.i32_const(3*f2size)); - const x1 = c.i32_add(c.getLocal("x"), c.i32_const(4*f2size)); - const x5 = c.i32_add(c.getLocal("x"), c.i32_const(5*f2size)); - - const r0 = c.getLocal("r"); - const r4 = c.i32_add(c.getLocal("r"), c.i32_const(f2size)); - const r3 = c.i32_add(c.getLocal("r"), c.i32_const(2*f2size)); - const r2 = c.i32_add(c.getLocal("r"), c.i32_const(3*f2size)); - const r1 = c.i32_add(c.getLocal("r"), c.i32_const(4*f2size)); - const r5 = c.i32_add(c.getLocal("r"), c.i32_const(5*f2size)); - - const t0 = c.i32_const(module.alloc(f2size)); - const t1 = c.i32_const(module.alloc(f2size)); - const t2 = c.i32_const(module.alloc(f2size)); - const t3 = c.i32_const(module.alloc(f2size)); - const t4 = c.i32_const(module.alloc(f2size)); - const t5 = c.i32_const(module.alloc(f2size)); - const tmp = c.i32_const(module.alloc(f2size)); - const AUX = c.i32_const(module.alloc(f2size)); - - - f.addCode( - // // t0 + t1*y = (z0 + z1*y)^2 = a^2 - // tmp = z0 * z1; - // t0 = (z0 + z1) * (z0 + my_Fp6::non_residue * z1) - tmp - my_Fp6::non_residue * tmp; - // t1 = tmp + tmp; - c.call(f2mPrefix + "_mul", x0, x1, tmp), - c.call(f2mPrefix + "_mulNR", x1, t0), - c.call(f2mPrefix + "_add", x0, t0, t0), - c.call(f2mPrefix + "_add", x0, x1, AUX), - c.call(f2mPrefix + "_mul", AUX, t0, t0), - c.call(f2mPrefix + "_mulNR", tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t0, AUX, t0), - c.call(f2mPrefix + "_add", tmp, tmp, t1), - - // // t2 + t3*y = (z2 + z3*y)^2 = b^2 - // tmp = z2 * z3; - // t2 = (z2 + z3) * (z2 + my_Fp6::non_residue * z3) - tmp - my_Fp6::non_residue * tmp; - // t3 = tmp + tmp; - c.call(f2mPrefix + "_mul", x2, x3, tmp), - c.call(f2mPrefix + "_mulNR", x3, t2), - c.call(f2mPrefix + "_add", x2, t2, t2), - c.call(f2mPrefix + "_add", x2, x3, AUX), - c.call(f2mPrefix + "_mul", AUX, t2, t2), - c.call(f2mPrefix + "_mulNR", tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t2, AUX, t2), - c.call(f2mPrefix + "_add", tmp, tmp, t3), - - // // t4 + t5*y = (z4 + z5*y)^2 = c^2 - // tmp = z4 * z5; - // t4 = (z4 + z5) * (z4 + my_Fp6::non_residue * z5) - tmp - my_Fp6::non_residue * tmp; - // t5 = tmp + tmp; - c.call(f2mPrefix + "_mul", x4, x5, tmp), - c.call(f2mPrefix + "_mulNR", x5, t4), - c.call(f2mPrefix + "_add", x4, t4, t4), - c.call(f2mPrefix + "_add", x4, x5, AUX), - c.call(f2mPrefix + "_mul", AUX, t4, t4), - c.call(f2mPrefix + "_mulNR", tmp, AUX), - c.call(f2mPrefix + "_add", tmp, AUX, AUX), - c.call(f2mPrefix + "_sub", t4, AUX, t4), - c.call(f2mPrefix + "_add", tmp, tmp, t5), - - // For A - // z0 = 3 * t0 - 2 * z0 - c.call(f2mPrefix + "_sub", t0, x0, r0), - c.call(f2mPrefix + "_add", r0, r0, r0), - c.call(f2mPrefix + "_add", t0, r0, r0), - // z1 = 3 * t1 + 2 * z1 - c.call(f2mPrefix + "_add", t1, x1, r1), - c.call(f2mPrefix + "_add", r1, r1, r1), - c.call(f2mPrefix + "_add", t1, r1, r1), - - // For B - // z2 = 3 * (xi * t5) + 2 * z2 - c.call(f2mPrefix + "_mul", t5, c.i32_const(pBls12381Twist), AUX), - c.call(f2mPrefix + "_add", AUX, x2, r2), - c.call(f2mPrefix + "_add", r2, r2, r2), - c.call(f2mPrefix + "_add", AUX, r2, r2), - // z3 = 3 * t4 - 2 * z3 - c.call(f2mPrefix + "_sub", t4, x3, r3), - c.call(f2mPrefix + "_add", r3, r3, r3), - c.call(f2mPrefix + "_add", t4, r3, r3), - - // For C - // z4 = 3 * t2 - 2 * z4 - c.call(f2mPrefix + "_sub", t2, x4, r4), - c.call(f2mPrefix + "_add", r4, r4, r4), - c.call(f2mPrefix + "_add", t2, r4, r4), - // z5 = 3 * t3 + 2 * z5 - c.call(f2mPrefix + "_add", t3, x5, r5), - c.call(f2mPrefix + "_add", r5, r5, r5), - c.call(f2mPrefix + "_add", t3, r5, r5), - - ); - } - - - function buildCyclotomicExp(exponent, isExpNegative, fnName) { - const exponentNafBytes = naf(exponent).map( (b) => (b==-1 ? 0xFF: b) ); - const pExponentNafBytes = module.alloc(exponentNafBytes); - // const pExponent = module.alloc(utils.bigInt2BytesLE(exponent, n8)); - - const f = module.addFunction(prefix+ "__cyclotomicExp_"+fnName); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - f.addLocal("bit", "i32"); - f.addLocal("i", "i32"); - - const c = f.getCodeBuilder(); - - const x = c.getLocal("x"); - - const res = c.getLocal("r"); - - const inverse = c.i32_const(module.alloc(ftsize)); - - - f.addCode( - c.call(ftmPrefix + "_conjugate", x, inverse), - c.call(ftmPrefix + "_one", res), - - c.if( - c.teeLocal("bit", c.i32_load8_s(c.i32_const(exponentNafBytes.length-1), pExponentNafBytes)), - c.if( - c.i32_eq( - c.getLocal("bit"), - c.i32_const(1) - ), - c.call(ftmPrefix + "_mul", res, x, res), - c.call(ftmPrefix + "_mul", res, inverse, res), - ) - ), - - c.setLocal("i", c.i32_const(exponentNafBytes.length-2)), - c.block(c.loop( - c.call(prefix + "__cyclotomicSquare", res, res), - c.if( - c.teeLocal("bit", c.i32_load8_s(c.getLocal("i"), pExponentNafBytes)), - c.if( - c.i32_eq( - c.getLocal("bit"), - c.i32_const(1) - ), - c.call(ftmPrefix + "_mul", res, x, res), - c.call(ftmPrefix + "_mul", res, inverse, res), - ) - ), - c.br_if(1, c.i32_eqz ( c.getLocal("i") )), - c.setLocal("i", c.i32_sub(c.getLocal("i"), c.i32_const(1))), - c.br(0) - )) - ); - - if (isExpNegative) { - f.addCode( - c.call(ftmPrefix + "_conjugate", res, res), - ); - } - - } - - function buildFinalExponentiation() { - buildCyclotomicSquare(); - buildCyclotomicExp(finalExpZ, finalExpIsNegative, "w0"); - - const f = module.addFunction(prefix+ "_finalExponentiation"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const c = f.getCodeBuilder(); - - const elt = c.getLocal("x"); - const res = c.getLocal("r"); - const t0 = c.i32_const(module.alloc(ftsize)); - const t1 = c.i32_const(module.alloc(ftsize)); - const t2 = c.i32_const(module.alloc(ftsize)); - const t3 = c.i32_const(module.alloc(ftsize)); - const t4 = c.i32_const(module.alloc(ftsize)); - const t5 = c.i32_const(module.alloc(ftsize)); - const t6 = c.i32_const(module.alloc(ftsize)); - - f.addCode( - - // let mut t0 = f.frobenius_map(6) - c.call(ftmPrefix + "_frobeniusMap6", elt, t0), - - // let t1 = f.invert() - c.call(ftmPrefix + "_inverse", elt, t1), - - // let mut t2 = t0 * t1; - c.call(ftmPrefix + "_mul", t0, t1, t2), - - // t1 = t2.clone(); - c.call(ftmPrefix + "_copy", t2, t1), - - // t2 = t2.frobenius_map().frobenius_map(); - c.call(ftmPrefix + "_frobeniusMap2", t2, t2), - - // t2 *= t1; - c.call(ftmPrefix + "_mul", t2, t1, t2), - - - // t1 = cyclotomic_square(t2).conjugate(); - c.call(prefix + "__cyclotomicSquare", t2, t1), - c.call(ftmPrefix + "_conjugate", t1, t1), - - // let mut t3 = cycolotomic_exp(t2); - c.call(prefix + "__cyclotomicExp_w0", t2, t3), - - // let mut t4 = cyclotomic_square(t3); - c.call(prefix + "__cyclotomicSquare", t3, t4), - - // let mut t5 = t1 * t3; - c.call(ftmPrefix + "_mul", t1, t3, t5), - - // t1 = cycolotomic_exp(t5); - c.call(prefix + "__cyclotomicExp_w0", t5, t1), - - // t0 = cycolotomic_exp(t1); - c.call(prefix + "__cyclotomicExp_w0", t1, t0), - - // let mut t6 = cycolotomic_exp(t0); - c.call(prefix + "__cyclotomicExp_w0", t0, t6), - - // t6 *= t4; - c.call(ftmPrefix + "_mul", t6, t4, t6), - - // t4 = cycolotomic_exp(t6); - c.call(prefix + "__cyclotomicExp_w0", t6, t4), - - // t5 = t5.conjugate(); - c.call(ftmPrefix + "_conjugate", t5, t5), - - // t4 *= t5 * t2; - c.call(ftmPrefix + "_mul", t4, t5, t4), - c.call(ftmPrefix + "_mul", t4, t2, t4), - - // t5 = t2.conjugate(); - c.call(ftmPrefix + "_conjugate", t2, t5), - - // t1 *= t2; - c.call(ftmPrefix + "_mul", t1, t2, t1), - - // t1 = t1.frobenius_map().frobenius_map().frobenius_map(); - c.call(ftmPrefix + "_frobeniusMap3", t1, t1), - - // t6 *= t5; - c.call(ftmPrefix + "_mul", t6, t5, t6), - - // t6 = t6.frobenius_map(); - c.call(ftmPrefix + "_frobeniusMap1", t6, t6), - - // t3 *= t0; - c.call(ftmPrefix + "_mul", t3, t0, t3), - - // t3 = t3.frobenius_map().frobenius_map(); - c.call(ftmPrefix + "_frobeniusMap2", t3, t3), - - // t3 *= t1; - c.call(ftmPrefix + "_mul", t3, t1, t3), - - // t3 *= t6; - c.call(ftmPrefix + "_mul", t3, t6, t3), - - // f = t3 * t4; - c.call(ftmPrefix + "_mul", t3, t4, res), - - ); - } - - - function buildFinalExponentiationOld() { - const f = module.addFunction(prefix+ "_finalExponentiationOld"); - f.addParam("x", "i32"); - f.addParam("r", "i32"); - - const exponent = 322277361516934140462891564586510139908379969514828494218366688025288661041104682794998680497580008899973249814104447692778988208376779573819485263026159588510513834876303014016798809919343532899164848730280942609956670917565618115867287399623286813270357901731510188149934363360381614501334086825442271920079363289954510565375378443704372994881406797882676971082200626541916413184642520269678897559532260949334760604962086348898118982248842634379637598665468817769075878555493752214492790122785850202957575200176084204422751485957336465472324810982833638490904279282696134323072515220044451592646885410572234451732790590013479358343841220074174848221722017083597872017638514103174122784843925578370430843522959600095676285723737049438346544753168912974976791528535276317256904336520179281145394686565050419250614107803233314658825463117900250701199181529205942363159325765991819433914303908860460720581408201373164047773794825411011922305820065611121544561808414055302212057471395719432072209245600258134364584636810093520285711072578721435517884103526483832733289802426157301542744476740008494780363354305116978805620671467071400711358839553375340724899735460480144599782014906586543813292157922220645089192130209334926661588737007768565838519456601560804957985667880395221049249803753582637708560n; - - const pExponent = module.alloc(utils.bigInt2BytesLE( exponent, 544 )); - - const c = f.getCodeBuilder(); - - f.addCode( - c.call(ftmPrefix + "_exp", c.getLocal("x"), c.i32_const(pExponent), c.i32_const(544), c.getLocal("r")), - ); - } - - - const pPreP = module.alloc(prePSize); - const pPreQ = module.alloc(preQSize); - - function buildPairingEquation(nPairings) { - - const f = module.addFunction(prefix+ "_pairingEq"+nPairings); - for (let i=0; i. -*/ - -// module.exports.bn128_wasm = require("./build/bn128_wasm.js"); -var bn128_wasm_gzip = bn128_wasm_gzip$1; -// module.exports.bls12381_wasm = require("./build/bls12381_wasm.js"); -// module.exports.mnt6753_wasm = require("./build/mnt6753_wasm.js"); - -var buildBn128 = build_bn128; -var buildBls12381 = build_bls12381; - -var index = /*#__PURE__*/Object.freeze({ - __proto__: null, - bn128_wasm_gzip: bn128_wasm_gzip, - buildBls12381: buildBls12381, - buildBn128: buildBn128 -}); - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmbuilder - - wasmbuilder is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmbuilder is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmbuilder. If not, see . -*/ - -function toNumber(n) { - return BigInt(n); -} - -function isNegative(n) { - return n < 0n; -} - -function isZero(n) { - return n === 0n; -} - -function bitLength(n) { - if (isNegative(n)) { - return n.toString(2).length - 1; // discard the - sign - } else { - return n.toString(2).length; - } -} - -function u32(n) { - const b = []; - const v = toNumber(n); - b.push(Number(v & 0xFFn)); - b.push(Number(v >> 8n & 0xFFn)); - b.push(Number(v >> 16n & 0xFFn)); - b.push(Number(v >> 24n & 0xFFn)); - return b; -} - -function toUTF8Array(str) { - var utf8 = []; - for (var i=0; i < str.length; i++) { - var charcode = str.charCodeAt(i); - if (charcode < 0x80) utf8.push(charcode); - else if (charcode < 0x800) { - utf8.push(0xc0 | (charcode >> 6), - 0x80 | (charcode & 0x3f)); - } - else if (charcode < 0xd800 || charcode >= 0xe000) { - utf8.push(0xe0 | (charcode >> 12), - 0x80 | ((charcode>>6) & 0x3f), - 0x80 | (charcode & 0x3f)); - } - // surrogate pair - else { - i++; - // UTF-16 encodes 0x10000-0x10FFFF by - // subtracting 0x10000 and splitting the - // 20 bits of 0x0-0xFFFFF into two halves - charcode = 0x10000 + (((charcode & 0x3ff)<<10) - | (str.charCodeAt(i) & 0x3ff)); - utf8.push(0xf0 | (charcode >>18), - 0x80 | ((charcode>>12) & 0x3f), - 0x80 | ((charcode>>6) & 0x3f), - 0x80 | (charcode & 0x3f)); - } - } - return utf8; -} - -function string(str) { - const bytes = toUTF8Array(str); - return [ ...varuint32(bytes.length), ...bytes ]; -} - -function varuint(n) { - const code = []; - let v = toNumber(n); - if (isNegative(v)) throw new Error("Number cannot be negative"); - while (!isZero(v)) { - code.push(Number(v & 0x7Fn)); - v = v >> 7n; - } - if (code.length==0) code.push(0); - for (let i=0; i 0xFFFFFFFFn) throw new Error("Number too big"); - if (v > 0x7FFFFFFFn) v = v - 0x100000000n; - // bigInt("-80000000", 16) as base10 - if (v < -2147483648n) throw new Error("Number too small"); - return varint(v); -} - -function varint64(n) { - let v = toNumber(n); - if (v > 0xFFFFFFFFFFFFFFFFn) throw new Error("Number too big"); - if (v > 0x7FFFFFFFFFFFFFFFn) v = v - 0x10000000000000000n; - // bigInt("-8000000000000000", 16) as base10 - if (v < -9223372036854775808n) throw new Error("Number too small"); - return varint(v); -} - -function varuint32(n) { - let v = toNumber(n); - if (v > 0xFFFFFFFFn) throw new Error("Number too big"); - return varuint(v); -} - -function toHexString(byteArray) { - return Array.from(byteArray, function(byte) { - return ("0" + (byte & 0xFF).toString(16)).slice(-2); - }).join(""); -} - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmbuilder - - wasmbuilder is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmbuilder is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmbuilder. If not, see . -*/ - - -class CodeBuilder { - constructor(func) { - this.func = func; - this.functionName = func.functionName; - this.module = func.module; - } - - setLocal(localName, valCode) { - const idx = this.func.localIdxByName[localName]; - if (idx === undefined) - throw new Error(`Local Variable not defined: Function: ${this.functionName} local: ${localName} `); - return [...valCode, 0x21, ...varuint32( idx )]; - } - - teeLocal(localName, valCode) { - const idx = this.func.localIdxByName[localName]; - if (idx === undefined) - throw new Error(`Local Variable not defined: Function: ${this.functionName} local: ${localName} `); - return [...valCode, 0x22, ...varuint32( idx )]; - } - - getLocal(localName) { - const idx = this.func.localIdxByName[localName]; - if (idx === undefined) - throw new Error(`Local Variable not defined: Function: ${this.functionName} local: ${localName} `); - return [0x20, ...varuint32( idx )]; - } - - i64_load8_s(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 0 : _align; // 8 bits alignment by default - return [...idxCode, 0x30, align, ...varuint32(offset)]; - } - - i64_load8_u(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 0 : _align; // 8 bits alignment by default - return [...idxCode, 0x31, align, ...varuint32(offset)]; - } - - i64_load16_s(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 1 : _align; // 16 bits alignment by default - return [...idxCode, 0x32, align, ...varuint32(offset)]; - } - - i64_load16_u(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 1 : _align; // 16 bits alignment by default - return [...idxCode, 0x33, align, ...varuint32(offset)]; - } - - i64_load32_s(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 2 : _align; // 32 bits alignment by default - return [...idxCode, 0x34, align, ...varuint32(offset)]; - } - - i64_load32_u(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 2 : _align; // 32 bits alignment by default - return [...idxCode, 0x35, align, ...varuint32(offset)]; - } - - i64_load(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 3 : _align; // 64 bits alignment by default - return [...idxCode, 0x29, align, ...varuint32(offset)]; - } - - - i64_store(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 3; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 3; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x37, align, ...varuint32(offset)]; - } - - i64_store32(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 2; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 2; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x3e, align, ...varuint32(offset)]; - } - - - i64_store16(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 1; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 1; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x3d, align, ...varuint32(offset)]; - } - - - i64_store8(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 0; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 0; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x3c, align, ...varuint32(offset)]; - } - - i32_load8_s(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 0 : _align; // 32 bits alignment by default - return [...idxCode, 0x2c, align, ...varuint32(offset)]; - } - - i32_load8_u(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 0 : _align; // 32 bits alignment by default - return [...idxCode, 0x2d, align, ...varuint32(offset)]; - } - - i32_load16_s(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 1 : _align; // 32 bits alignment by default - return [...idxCode, 0x2e, align, ...varuint32(offset)]; - } - - i32_load16_u(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 1 : _align; // 32 bits alignment by default - return [...idxCode, 0x2f, align, ...varuint32(offset)]; - } - - i32_load(idxCode, _offset, _align) { - const offset = _offset || 0; - const align = (_align === undefined) ? 2 : _align; // 32 bits alignment by default - return [...idxCode, 0x28, align, ...varuint32(offset)]; - } - - i32_store(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 2; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 2; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x36, align, ...varuint32(offset)]; - } - - - i32_store16(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 1; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 1; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x3b, align, ...varuint32(offset)]; - } - - i32_store8(idxCode, _offset, _align, _codeVal) { - let offset, align, codeVal; - if (Array.isArray(_offset)) { - offset = 0; - align = 0; - codeVal = _offset; - } else if (Array.isArray(_align)) { - offset = _offset; - align = 0; - codeVal = _align; - } else if (Array.isArray(_codeVal)) { - offset = _offset; - align = _align; - codeVal = _codeVal; - } - return [...idxCode, ...codeVal, 0x3a, align, ...varuint32(offset)]; - } - - call(fnName, ...args) { - const idx = this.module.functionIdxByName[fnName]; - if (idx === undefined) - throw new Error(`Function not defined: Function: ${fnName}`); - return [...[].concat(...args), 0x10, ...varuint32(idx)]; - } - - call_indirect(fnIdx, ...args) { - return [...[].concat(...args), ...fnIdx, 0x11, 0, 0]; - } - - if(condCode, thenCode, elseCode) { - if (elseCode) { - return [...condCode, 0x04, 0x40, ...thenCode, 0x05, ...elseCode, 0x0b]; - } else { - return [...condCode, 0x04, 0x40, ...thenCode, 0x0b]; - } - } - - block(bCode) { return [0x02, 0x40, ...bCode, 0x0b]; } - loop(...args) { - return [0x03, 0x40, ...[].concat(...[...args]), 0x0b]; - } - br_if(relPath, condCode) { return [...condCode, 0x0d, ...varuint32(relPath)]; } - br(relPath) { return [0x0c, ...varuint32(relPath)]; } - ret(rCode) { return [...rCode, 0x0f]; } - drop(dCode) { return [...dCode, 0x1a]; } - - i64_const(num) { return [0x42, ...varint64(num)]; } - i32_const(num) { return [0x41, ...varint32(num)]; } - - - i64_eqz(opcode) { return [...opcode, 0x50]; } - i64_eq(op1code, op2code) { return [...op1code, ...op2code, 0x51]; } - i64_ne(op1code, op2code) { return [...op1code, ...op2code, 0x52]; } - i64_lt_s(op1code, op2code) { return [...op1code, ...op2code, 0x53]; } - i64_lt_u(op1code, op2code) { return [...op1code, ...op2code, 0x54]; } - i64_gt_s(op1code, op2code) { return [...op1code, ...op2code, 0x55]; } - i64_gt_u(op1code, op2code) { return [...op1code, ...op2code, 0x56]; } - i64_le_s(op1code, op2code) { return [...op1code, ...op2code, 0x57]; } - i64_le_u(op1code, op2code) { return [...op1code, ...op2code, 0x58]; } - i64_ge_s(op1code, op2code) { return [...op1code, ...op2code, 0x59]; } - i64_ge_u(op1code, op2code) { return [...op1code, ...op2code, 0x5a]; } - i64_add(op1code, op2code) { return [...op1code, ...op2code, 0x7c]; } - i64_sub(op1code, op2code) { return [...op1code, ...op2code, 0x7d]; } - i64_mul(op1code, op2code) { return [...op1code, ...op2code, 0x7e]; } - i64_div_s(op1code, op2code) { return [...op1code, ...op2code, 0x7f]; } - i64_div_u(op1code, op2code) { return [...op1code, ...op2code, 0x80]; } - i64_rem_s(op1code, op2code) { return [...op1code, ...op2code, 0x81]; } - i64_rem_u(op1code, op2code) { return [...op1code, ...op2code, 0x82]; } - i64_and(op1code, op2code) { return [...op1code, ...op2code, 0x83]; } - i64_or(op1code, op2code) { return [...op1code, ...op2code, 0x84]; } - i64_xor(op1code, op2code) { return [...op1code, ...op2code, 0x85]; } - i64_shl(op1code, op2code) { return [...op1code, ...op2code, 0x86]; } - i64_shr_s(op1code, op2code) { return [...op1code, ...op2code, 0x87]; } - i64_shr_u(op1code, op2code) { return [...op1code, ...op2code, 0x88]; } - i64_extend_i32_s(op1code) { return [...op1code, 0xac]; } - i64_extend_i32_u(op1code) { return [...op1code, 0xad]; } - i64_clz(op1code) { return [...op1code, 0x79]; } - i64_ctz(op1code) { return [...op1code, 0x7a]; } - - i32_eqz(op1code) { return [...op1code, 0x45]; } - i32_eq(op1code, op2code) { return [...op1code, ...op2code, 0x46]; } - i32_ne(op1code, op2code) { return [...op1code, ...op2code, 0x47]; } - i32_lt_s(op1code, op2code) { return [...op1code, ...op2code, 0x48]; } - i32_lt_u(op1code, op2code) { return [...op1code, ...op2code, 0x49]; } - i32_gt_s(op1code, op2code) { return [...op1code, ...op2code, 0x4a]; } - i32_gt_u(op1code, op2code) { return [...op1code, ...op2code, 0x4b]; } - i32_le_s(op1code, op2code) { return [...op1code, ...op2code, 0x4c]; } - i32_le_u(op1code, op2code) { return [...op1code, ...op2code, 0x4d]; } - i32_ge_s(op1code, op2code) { return [...op1code, ...op2code, 0x4e]; } - i32_ge_u(op1code, op2code) { return [...op1code, ...op2code, 0x4f]; } - i32_add(op1code, op2code) { return [...op1code, ...op2code, 0x6a]; } - i32_sub(op1code, op2code) { return [...op1code, ...op2code, 0x6b]; } - i32_mul(op1code, op2code) { return [...op1code, ...op2code, 0x6c]; } - i32_div_s(op1code, op2code) { return [...op1code, ...op2code, 0x6d]; } - i32_div_u(op1code, op2code) { return [...op1code, ...op2code, 0x6e]; } - i32_rem_s(op1code, op2code) { return [...op1code, ...op2code, 0x6f]; } - i32_rem_u(op1code, op2code) { return [...op1code, ...op2code, 0x70]; } - i32_and(op1code, op2code) { return [...op1code, ...op2code, 0x71]; } - i32_or(op1code, op2code) { return [...op1code, ...op2code, 0x72]; } - i32_xor(op1code, op2code) { return [...op1code, ...op2code, 0x73]; } - i32_shl(op1code, op2code) { return [...op1code, ...op2code, 0x74]; } - i32_shr_s(op1code, op2code) { return [...op1code, ...op2code, 0x75]; } - i32_shr_u(op1code, op2code) { return [...op1code, ...op2code, 0x76]; } - i32_rotl(op1code, op2code) { return [...op1code, ...op2code, 0x77]; } - i32_rotr(op1code, op2code) { return [...op1code, ...op2code, 0x78]; } - i32_wrap_i64(op1code) { return [...op1code, 0xa7]; } - i32_clz(op1code) { return [...op1code, 0x67]; } - i32_ctz(op1code) { return [...op1code, 0x68]; } - - unreachable() { return [ 0x0 ]; } - - current_memory() { return [ 0x3f, 0]; } - - comment() { return []; } -} - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmbuilder - - wasmbuilder is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmbuilder is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmbuilder. If not, see . -*/ - - -const typeCodes = { - "i32": 0x7f, - "i64": 0x7e, - "f32": 0x7d, - "f64": 0x7c, - "anyfunc": 0x70, - "func": 0x60, - "emptyblock": 0x40 -}; - - -class FunctionBuilder { - - constructor (module, fnName, fnType, moduleName, fieldName) { - if (fnType == "import") { - this.fnType = "import"; - this.moduleName = moduleName; - this.fieldName = fieldName; - } else if (fnType == "internal") { - this.fnType = "internal"; - } else { - throw new Error("Invalid function fnType: " + fnType); - } - this.module = module; - this.fnName = fnName; - this.params = []; - this.locals = []; - this.localIdxByName = {}; - this.code = []; - this.returnType = null; - this.nextLocal =0; - } - - addParam(paramName, paramType) { - if (this.localIdxByName[paramName]) - throw new Error(`param already exists. Function: ${this.fnName}, Param: ${paramName} `); - const idx = this.nextLocal++; - this.localIdxByName[paramName] = idx; - this.params.push({ - type: paramType - }); - } - - addLocal(localName, localType, _length) { - const length = _length || 1; - if (this.localIdxByName[localName]) - throw new Error(`local already exists. Function: ${this.fnName}, Param: ${localName} `); - const idx = this.nextLocal++; - this.localIdxByName[localName] = idx; - this.locals.push({ - type: localType, - length: length - }); - } - - setReturnType(returnType) { - if (this.returnType) - throw new Error(`returnType already defined. Function: ${this.fnName}`); - this.returnType = returnType; - } - - getSignature() { - const params = [...varuint32(this.params.length), ...this.params.map((p) => typeCodes[p.type])]; - const returns = this.returnType ? [0x01, typeCodes[this.returnType]] : [0]; - return [0x60, ...params, ...returns]; - } - - getBody() { - const locals = this.locals.map((l) => [ - ...varuint32(l.length), - typeCodes[l.type] - ]); - - const body = [ - ...varuint32(this.locals.length), - ...[].concat(...locals), - ...this.code, - 0x0b - ]; - return [ - ...varuint32(body.length), - ...body - ]; - } - - addCode(...code) { - this.code.push(...[].concat(...[...code])); - } - - getCodeBuilder() { - return new CodeBuilder(this); - } -} - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmbuilder - - wasmbuilder is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmbuilder is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmbuilder. If not, see . -*/ - - -class ModuleBuilder { - - constructor() { - this.functions = []; - this.functionIdxByName = {}; - this.nImportFunctions = 0; - this.nInternalFunctions =0; - this.memory = { - pagesSize: 1, - moduleName: "env", - fieldName: "memory" - }; - this.free = 8; - this.datas = []; - this.modules = {}; - this.exports = []; - this.functionsTable = []; - } - - build() { - this._setSignatures(); - return new Uint8Array([ - ...u32(0x6d736100), - ...u32(1), - ...this._buildType(), - ...this._buildImport(), - ...this._buildFunctionDeclarations(), - ...this._buildFunctionsTable(), - ...this._buildExports(), - ...this._buildElements(), - ...this._buildCode(), - ...this._buildData() - ]); - } - - addFunction(fnName) { - if (typeof(this.functionIdxByName[fnName]) !== "undefined") - throw new Error(`Function already defined: ${fnName}`); - - const idx = this.functions.length; - this.functionIdxByName[fnName] = idx; - - this.functions.push(new FunctionBuilder(this, fnName, "internal")); - - this.nInternalFunctions++; - return this.functions[idx]; - } - - addIimportFunction(fnName, moduleName, _fieldName) { - if (typeof(this.functionIdxByName[fnName]) !== "undefined") - throw new Error(`Function already defined: ${fnName}`); - - if ( (this.functions.length>0) - &&(this.functions[this.functions.length-1].type == "internal")) - throw new Error(`Import functions must be declared before internal: ${fnName}`); - - let fieldName = _fieldName || fnName; - - const idx = this.functions.length; - this.functionIdxByName[fnName] = idx; - - this.functions.push(new FunctionBuilder(this, fnName, "import", moduleName, fieldName)); - - this.nImportFunctions ++; - return this.functions[idx]; - } - - setMemory(pagesSize, moduleName, fieldName) { - this.memory = { - pagesSize: pagesSize, - moduleName: moduleName || "env", - fieldName: fieldName || "memory" - }; - } - - exportFunction(fnName, _exportName) { - const exportName = _exportName || fnName; - if (typeof(this.functionIdxByName[fnName]) === "undefined") - throw new Error(`Function not defined: ${fnName}`); - const idx = this.functionIdxByName[fnName]; - if (exportName != fnName) { - this.functionIdxByName[exportName] = idx; - } - this.exports.push({ - exportName: exportName, - idx: idx - }); - } - - addFunctionToTable(fnName) { - const idx = this.functionIdxByName[fnName]; - this.functionsTable.push(idx); - } - - addData(offset, bytes) { - this.datas.push({ - offset: offset, - bytes: bytes - }); - } - - alloc(a, b) { - let size; - let bytes; - if ((Array.isArray(a) || ArrayBuffer.isView(a)) && (typeof(b) === "undefined")) { - size = a.length; - bytes = a; - } else { - size = a; - bytes = b; - } - size = (((size-1)>>3) +1)<<3; // Align to 64 bits. - const p = this.free; - this.free += size; - if (bytes) { - this.addData(p, bytes); - } - return p; - } - - allocString(s) { - const encoder = new globalThis.TextEncoder(); - const uint8array = encoder.encode(s); - return this.alloc([...uint8array, 0]); - } - - _setSignatures() { - this.signatures = []; - const signatureIdxByName = {}; - if (this.functionsTable.length>0) { - const signature = this.functions[this.functionsTable[0]].getSignature(); - const signatureName = "s_"+toHexString(signature); - signatureIdxByName[signatureName] = 0; - this.signatures.push(signature); - } - for (let i=0; i. -*/ - -var main = /*#__PURE__*/Object.freeze({ - __proto__: null, - ModuleBuilder: ModuleBuilder -}); - -export { BigBuffer, ChaCha, EC, ZqField as F1Field, F2Field, F3Field, PolField, Scalar, ZqField, buildBls12381$1 as buildBls12381, buildBn128$1 as buildBn128, getCurveFromName, getCurveFromQ, getCurveFromR, utils$6 as utils }; diff --git a/build/browser/browser.esm.js b/build/browser/browser.esm.js new file mode 100644 index 0000000..3cd5c2e --- /dev/null +++ b/build/browser/browser.esm.js @@ -0,0 +1,6505 @@ +console.log("browser esm"); +//#region \0rolldown/runtime.js +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports); +var __exportAll = (all, no_symbols) => { + let target = {}; + for (var name in all) __defProp(target, name, { + get: all[name], + enumerable: true + }); + if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" }); + return target; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) { + key = keys[i]; + if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { + get: ((k) => from[k]).bind(null, key), + enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable + }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { + value: mod, + enumerable: true +}) : target, mod)); +var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, { get: (a, b) => (typeof require !== "undefined" ? require : a)[b] }) : x)(function(x) { + if (typeof require !== "undefined") return require.apply(this, arguments); + throw Error("Calling `require` for \"" + x + "\" in an environment that doesn't expose the `require` function. See https://rolldown.rs/in-depth/bundling-cjs#require-external-modules for more details."); +}); +//#endregion +//#region src/scalar.js +var scalar_exports = /* @__PURE__ */ __exportAll({ + abs: () => abs, + add: () => add, + band: () => band, + bitLength: () => bitLength, + bits: () => bits, + bor: () => bor, + bxor: () => bxor, + div: () => div, + e: () => e, + eq: () => eq, + exp: () => exp$1, + fromArray: () => fromArray, + fromRprBE: () => fromRprBE, + fromRprLE: () => fromRprLE, + fromString: () => fromString, + geq: () => geq, + gt: () => gt, + isNegative: () => isNegative, + isOdd: () => isOdd, + isZero: () => isZero, + land: () => land, + leq: () => leq, + lnot: () => lnot, + lor: () => lor, + lt: () => lt, + mod: () => mod, + mul: () => mul, + naf: () => naf, + neg: () => neg, + neq: () => neq, + one: () => one, + pow: () => pow, + shiftLeft: () => shiftLeft, + shiftRight: () => shiftRight, + shl: () => shl, + shr: () => shr, + square: () => square, + sub: () => sub, + toArray: () => toArray, + toLEBuff: () => toLEBuff, + toNumber: () => toNumber, + toRprBE: () => toRprBE, + toRprLE: () => toRprLE, + toString: () => toString, + zero: () => zero +}); +var hexLen = [ + 0, + 1, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4 +]; +function fromString(s, radix) { + if (!radix || radix == 10) return BigInt(s); + else if (radix == 16) if (s.slice(0, 2) == "0x") return BigInt(s); + else return BigInt("0x" + s); +} +var e = fromString; +function fromArray(a, radix) { + let acc = BigInt(0); + radix = BigInt(radix); + for (let i = 0; i < a.length; i++) acc = acc * radix + BigInt(a[i]); + return acc; +} +function bitLength(a) { + const aS = a.toString(16); + return (aS.length - 1) * 4 + hexLen[parseInt(aS[0], 16)]; +} +function isNegative(a) { + return BigInt(a) < BigInt(0); +} +function isZero(a) { + return !a; +} +function shiftLeft(a, n) { + return BigInt(a) << BigInt(n); +} +function shiftRight(a, n) { + return BigInt(a) >> BigInt(n); +} +var shl = shiftLeft; +var shr = shiftRight; +function isOdd(a) { + return (BigInt(a) & BigInt(1)) == BigInt(1); +} +function naf(n) { + let E = BigInt(n); + const res = []; + while (E) { + if (E & BigInt(1)) { + const z = 2 - Number(E % BigInt(4)); + res.push(z); + E = E - BigInt(z); + } else res.push(0); + E = E >> BigInt(1); + } + return res; +} +function bits(n) { + let E = BigInt(n); + const res = []; + while (E) { + if (E & BigInt(1)) res.push(1); + else res.push(0); + E = E >> BigInt(1); + } + return res; +} +function toNumber(s) { + if (s > BigInt(Number.MAX_SAFE_INTEGER)) throw new Error("Number too big"); + return Number(s); +} +function toArray(s, radix) { + const res = []; + let rem = BigInt(s); + radix = BigInt(radix); + while (rem) { + res.unshift(Number(rem % radix)); + rem = rem / radix; + } + return res; +} +function add(a, b) { + return BigInt(a) + BigInt(b); +} +function sub(a, b) { + return BigInt(a) - BigInt(b); +} +function neg(a) { + return -BigInt(a); +} +function mul(a, b) { + return BigInt(a) * BigInt(b); +} +function square(a) { + return BigInt(a) * BigInt(a); +} +function pow(a, b) { + return BigInt(a) ** BigInt(b); +} +function exp$1(a, b) { + return BigInt(a) ** BigInt(b); +} +function abs(a) { + return BigInt(a) >= 0 ? BigInt(a) : -BigInt(a); +} +function div(a, b) { + return BigInt(a) / BigInt(b); +} +function mod(a, b) { + return BigInt(a) % BigInt(b); +} +function eq(a, b) { + return BigInt(a) == BigInt(b); +} +function neq(a, b) { + return BigInt(a) != BigInt(b); +} +function lt(a, b) { + return BigInt(a) < BigInt(b); +} +function gt(a, b) { + return BigInt(a) > BigInt(b); +} +function leq(a, b) { + return BigInt(a) <= BigInt(b); +} +function geq(a, b) { + return BigInt(a) >= BigInt(b); +} +function band(a, b) { + return BigInt(a) & BigInt(b); +} +function bor(a, b) { + return BigInt(a) | BigInt(b); +} +function bxor(a, b) { + return BigInt(a) ^ BigInt(b); +} +function land(a, b) { + return BigInt(a) && BigInt(b); +} +function lor(a, b) { + return BigInt(a) || BigInt(b); +} +function lnot(a) { + return !BigInt(a); +} +function toRprLE(buff, o, e, n8) { + const s = "0000000" + e.toString(16); + const v = new Uint32Array(buff.buffer, buff.byteOffset + o, n8 / 4); + const l = ((s.length - 7) * 4 - 1 >> 5) + 1; + for (let i = 0; i < l; i++) v[i] = parseInt(s.substring(s.length - 8 * i - 8, s.length - 8 * i), 16); + for (let i = l; i < v.length; i++) v[i] = 0; + for (let i = v.length * 4; i < n8; i++) buff[i] = toNumber(band(shiftRight(e, i * 8), 255)); +} +function toRprBE(buff, o, e, n8) { + const s = "0000000" + e.toString(16); + const v = new DataView(buff.buffer, buff.byteOffset + o, n8); + const l = ((s.length - 7) * 4 - 1 >> 5) + 1; + for (let i = 0; i < l; i++) v.setUint32(n8 - i * 4 - 4, parseInt(s.substring(s.length - 8 * i - 8, s.length - 8 * i), 16), false); + for (let i = 0; i < n8 / 4 - l; i++) v[i] = 0; +} +function fromRprLE(buff, o, n8) { + n8 = n8 || buff.byteLength; + o = o || 0; + const v = new Uint32Array(buff.buffer, buff.byteOffset + o, n8 / 4); + const a = new Array(n8 / 4); + v.forEach((ch, i) => a[a.length - i - 1] = ch.toString(16).padStart(8, "0")); + return fromString(a.join(""), 16); +} +function fromRprBE(buff, o, n8) { + n8 = n8 || buff.byteLength; + o = o || 0; + const v = new DataView(buff.buffer, buff.byteOffset + o, n8); + const a = new Array(n8 / 4); + for (let i = 0; i < n8 / 4; i++) a[i] = v.getUint32(i * 4, false).toString(16).padStart(8, "0"); + return fromString(a.join(""), 16); +} +function toString(a, radix) { + return a.toString(radix); +} +function toLEBuff(a) { + const buff = new Uint8Array(Math.floor((bitLength(a) - 1) / 8) + 1); + toRprLE(buff, 0, a, buff.byteLength); + return buff; +} +var zero = e(0); +var one = e(1); +//#endregion +//#region src/polfield.js +var PolField = class { + constructor(F) { + this.F = F; + let rem = F.sqrt_t; + let s = F.sqrt_s; + const five = this.F.add(this.F.add(this.F.two, this.F.two), this.F.one); + this.w = new Array(s + 1); + this.wi = new Array(s + 1); + this.w[s] = this.F.pow(five, rem); + this.wi[s] = this.F.inv(this.w[s]); + let n = s - 1; + while (n >= 0) { + this.w[n] = this.F.square(this.w[n + 1]); + this.wi[n] = this.F.square(this.wi[n + 1]); + n--; + } + this.roots = []; + this._setRoots(15); + } + _setRoots(n) { + if (n > this.F.sqrt_s) n = this.s; + for (let i = n; i >= 0 && !this.roots[i]; i--) { + let r = this.F.one; + const nroots = 1 << i; + const rootsi = new Array(nroots); + for (let j = 0; j < nroots; j++) { + rootsi[j] = r; + r = this.F.mul(r, this.w[i]); + } + this.roots[i] = rootsi; + } + } + add(a, b) { + const m = Math.max(a.length, b.length); + const res = new Array(m); + for (let i = 0; i < m; i++) res[i] = this.F.add(a[i] || this.F.zero, b[i] || this.F.zero); + return this.reduce(res); + } + double(a) { + return this.add(a, a); + } + sub(a, b) { + const m = Math.max(a.length, b.length); + const res = new Array(m); + for (let i = 0; i < m; i++) res[i] = this.F.sub(a[i] || this.F.zero, b[i] || this.F.zero); + return this.reduce(res); + } + mulScalar(p, b) { + if (this.F.eq(b, this.F.zero)) return []; + if (this.F.eq(b, this.F.one)) return p; + const res = new Array(p.length); + for (let i = 0; i < p.length; i++) res[i] = this.F.mul(p[i], b); + return res; + } + mul(a, b) { + if (a.length == 0) return []; + if (b.length == 0) return []; + if (a.length == 1) return this.mulScalar(b, a[0]); + if (b.length == 1) return this.mulScalar(a, b[0]); + if (b.length > a.length) [b, a] = [a, b]; + if (b.length <= 2 || b.length < log2$2(a.length)) return this.mulNormal(a, b); + else return this.mulFFT(a, b); + } + mulNormal(a, b) { + let res = []; + for (let i = 0; i < b.length; i++) res = this.add(res, this.scaleX(this.mulScalar(a, b[i]), i)); + return res; + } + mulFFT(a, b) { + const bitsResult = log2$2(Math.max(a.length, b.length) - 1) + 2; + this._setRoots(bitsResult); + const m = 1 << bitsResult; + const ea = this.extend(a, m); + const eb = this.extend(b, m); + const ta = __fft$1(this, ea, bitsResult, 0, 1, false); + const tb = __fft$1(this, eb, bitsResult, 0, 1, false); + const tres = new Array(m); + for (let i = 0; i < m; i++) tres[i] = this.F.mul(ta[i], tb[i]); + const res = __fft$1(this, tres, bitsResult, 0, 1, true); + const twoinvm = this.F.inv(this.F.mulScalar(this.F.one, m)); + const resn = new Array(m); + for (let i = 0; i < m; i++) resn[i] = this.F.mul(res[(m - i) % m], twoinvm); + return this.reduce(resn); + } + square(a) { + return this.mul(a, a); + } + scaleX(p, n) { + if (n == 0) return p; + else if (n > 0) return new Array(n).fill(this.F.zero).concat(p); + else { + if (-n >= p.length) return []; + return p.slice(-n); + } + } + eval2(p, x) { + let v = this.F.zero; + let ix = this.F.one; + for (let i = 0; i < p.length; i++) { + v = this.F.add(v, this.F.mul(p[i], ix)); + ix = this.F.mul(ix, x); + } + return v; + } + evaluate(p, x) { + const F = this.F; + if (p.length == 0) return F.zero; + const m = this._next2Power(p.length); + return _eval(this.extend(p, m), x, 0, 1, m); + function _eval(p, x, offset, step, n) { + if (n == 1) return p[offset]; + const newX = F.square(x); + return F.add(_eval(p, newX, offset, step << 1, n >> 1), F.mul(x, _eval(p, newX, offset + step, step << 1, n >> 1))); + } + } + lagrange(points) { + let roots = [this.F.one]; + for (let i = 0; i < points.length; i++) roots = this.mul(roots, [this.F.neg(points[i][0]), this.F.one]); + let sum = []; + for (let i = 0; i < points.length; i++) { + let mpol = this.ruffini(roots, points[i][0]); + const factor = this.F.mul(this.F.inv(this.evaluate(mpol, points[i][0])), points[i][1]); + mpol = this.mulScalar(mpol, factor); + sum = this.add(sum, mpol); + } + return sum; + } + fft(p) { + if (p.length <= 1) return p; + const bits = log2$2(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + const ep = this.extend(p, m); + return __fft$1(this, ep, bits, 0, 1); + } + fft2(p) { + if (p.length <= 1) return p; + const bits = log2$2(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + const ep = this.extend(p, m); + __bitReverse(ep, bits); + return __fft2(this, ep, bits); + } + ifft(p) { + if (p.length <= 1) return p; + const bits = log2$2(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + const ep = this.extend(p, m); + const res = __fft$1(this, ep, bits, 0, 1); + const twoinvm = this.F.inv(this.F.mulScalar(this.F.one, m)); + const resn = new Array(m); + for (let i = 0; i < m; i++) resn[i] = this.F.mul(res[(m - i) % m], twoinvm); + return resn; + } + ifft2(p) { + if (p.length <= 1) return p; + const bits = log2$2(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + const ep = this.extend(p, m); + __bitReverse(ep, bits); + const res = __fft2(this, ep, bits, 0, 1); + const twoinvm = this.F.inv(this.F.mulScalar(this.F.one, m)); + const resn = new Array(m); + for (let i = 0; i < m; i++) resn[i] = this.F.mul(res[(m - i) % m], twoinvm); + return resn; + } + _fft(pall, bits, offset, step) { + const n = 1 << bits; + if (n == 1) return [pall[offset]]; + const ndiv2 = n >> 1; + const p1 = this._fft(pall, bits - 1, offset, step * 2); + const p2 = this._fft(pall, bits - 1, offset + step, step * 2); + const out = new Array(n); + let m = this.F.one; + for (let i = 0; i < ndiv2; i++) { + out[i] = this.F.add(p1[i], this.F.mul(m, p2[i])); + out[i + ndiv2] = this.F.sub(p1[i], this.F.mul(m, p2[i])); + m = this.F.mul(m, this.w[bits]); + } + return out; + } + extend(p, e) { + if (e == p.length) return p; + const z = new Array(e - p.length).fill(this.F.zero); + return p.concat(z); + } + reduce(p) { + if (p.length == 0) return p; + if (!this.F.eq(p[p.length - 1], this.F.zero)) return p; + let i = p.length - 1; + while (i > 0 && this.F.eq(p[i], this.F.zero)) i--; + return p.slice(0, i + 1); + } + eq(a, b) { + const pa = this.reduce(a); + const pb = this.reduce(b); + if (pa.length != pb.length) return false; + for (let i = 0; i < pb.length; i++) if (!this.F.eq(pa[i], pb[i])) return false; + return true; + } + ruffini(p, r) { + const res = new Array(p.length - 1); + res[res.length - 1] = p[p.length - 1]; + for (let i = res.length - 2; i >= 0; i--) res[i] = this.F.add(this.F.mul(res[i + 1], r), p[i + 1]); + return res; + } + _next2Power(v) { + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; + } + toString(p) { + const ap = this.normalize(p); + let S = ""; + for (let i = ap.length - 1; i >= 0; i--) if (!this.F.eq(p[i], this.F.zero)) { + if (S != "") S += " + "; + S = S + p[i].toString(10); + if (i > 0) { + S = S + "x"; + if (i > 1) S = S + "^" + i; + } + } + return S; + } + normalize(p) { + const res = new Array(p.length); + for (let i = 0; i < p.length; i++) res[i] = this.F.normalize(p[i]); + return res; + } + _reciprocal(p, bits) { + const k = 1 << bits; + if (k == 1) return [this.F.inv(p[0])]; + const np = this.scaleX(p, -k / 2); + const q = this._reciprocal(np, bits - 1); + const a = this.scaleX(this.double(q), 3 * k / 2 - 2); + const b = this.mul(this.square(q), p); + return this.scaleX(this.sub(a, b), -(k - 2)); + } + _div2(m, v) { + const kbits = log2$2(v.length - 1) + 1; + const k = 1 << kbits; + const scaleV = k - v.length; + const rec = this._reciprocal(this.scaleX(v, scaleV), kbits); + return this.scaleX(rec, m - 2 * k + 2 + scaleV); + } + div(_u, _v) { + if (_u.length < _v.length) return []; + const kbits = log2$2(_v.length - 1) + 1; + const k = 1 << kbits; + const u = this.scaleX(_u, k - _v.length); + const v = this.scaleX(_v, k - _v.length); + const n = v.length - 1; + let m = u.length - 1; + const s = this._reciprocal(v, kbits); + let t; + if (m > 2 * n) t = this.sub(this.scaleX([this.F.one], 2 * n), this.mul(s, v)); + let q = []; + let rem = u; + let us, ut; + let finish = false; + while (!finish) { + us = this.mul(rem, s); + q = this.add(q, this.scaleX(us, -2 * n)); + if (m > 2 * n) { + ut = this.mul(rem, t); + rem = this.scaleX(ut, -2 * n); + m = rem.length - 1; + } else finish = true; + } + return q; + } + oneRoot(n, i) { + let nbits = log2$2(n - 1) + 1; + let res = this.F.one; + let r = i; + if (i >= n) throw new Error("Given 'i' should be lower than 'n'"); + else if (1 << nbits !== n) throw new Error(`Internal errlr: ${n} should equal ${1 << nbits}`); + while (r > 0) { + if (r & true) res = this.F.mul(res, this.w[nbits]); + r = r >> 1; + nbits--; + } + return res; + } + computeVanishingPolinomial(bits, t) { + const m = 1 << bits; + return this.F.sub(this.F.pow(t, m), this.F.one); + } + evaluateLagrangePolynomials(bits, t) { + const m = 1 << bits; + const tm = this.F.pow(t, m); + const u = new Array(m).fill(this.F.zero); + this._setRoots(bits); + const omega = this.w[bits]; + if (this.F.eq(tm, this.F.one)) { + for (let i = 0; i < m; i++) if (this.F.eq(this.roots[bits][0], t)) { + u[i] = this.F.one; + return u; + } + } + const z = this.F.sub(tm, this.F.one); + let l = this.F.mul(z, this.F.inv(this.F.e(m))); + for (let i = 0; i < m; i++) { + u[i] = this.F.mul(l, this.F.inv(this.F.sub(t, this.roots[bits][i]))); + l = this.F.mul(l, omega); + } + return u; + } + log2(V) { + return log2$2(V); + } +}; +function log2$2(V) { + return ((V & 4294901760) !== 0 ? (V &= 4294901760, 16) : 0) | ((V & 4278255360) !== 0 ? (V &= 4278255360, 8) : 0) | ((V & 4042322160) !== 0 ? (V &= 4042322160, 4) : 0) | ((V & 3435973836) !== 0 ? (V &= 3435973836, 2) : 0) | (V & 2863311530) !== 0; +} +function __fft$1(PF, pall, bits, offset, step) { + const n = 1 << bits; + if (n == 1) return [pall[offset]]; + else if (n == 2) return [PF.F.add(pall[offset], pall[offset + step]), PF.F.sub(pall[offset], pall[offset + step])]; + const ndiv2 = n >> 1; + const p1 = __fft$1(PF, pall, bits - 1, offset, step * 2); + const p2 = __fft$1(PF, pall, bits - 1, offset + step, step * 2); + const out = new Array(n); + for (let i = 0; i < ndiv2; i++) { + out[i] = PF.F.add(p1[i], PF.F.mul(PF.roots[bits][i], p2[i])); + out[i + ndiv2] = PF.F.sub(p1[i], PF.F.mul(PF.roots[bits][i], p2[i])); + } + return out; +} +function __fft2(PF, pall, bits) { + const n = 1 << bits; + if (n == 1) return [pall[0]]; + const ndiv2 = n >> 1; + const p1 = __fft2(PF, pall.slice(0, ndiv2), bits - 1); + const p2 = __fft2(PF, pall.slice(ndiv2), bits - 1); + const out = new Array(n); + for (let i = 0; i < ndiv2; i++) { + out[i] = PF.F.add(p1[i], PF.F.mul(PF.roots[bits][i], p2[i])); + out[i + ndiv2] = PF.F.sub(p1[i], PF.F.mul(PF.roots[bits][i], p2[i])); + } + return out; +} +var _revTable$1 = []; +for (let i = 0; i < 256; i++) _revTable$1[i] = _revSlow$1(i, 8); +function _revSlow$1(idx, bits) { + let res = 0; + let a = idx; + for (let i = 0; i < bits; i++) { + res <<= 1; + res = res | a & 1; + a >>= 1; + } + return res; +} +function rev(idx, bits) { + return (_revTable$1[idx >>> 24] | _revTable$1[idx >>> 16 & 255] << 8 | _revTable$1[idx >>> 8 & 255] << 16 | _revTable$1[idx & 255] << 24) >>> 32 - bits; +} +function __bitReverse(p, bits) { + for (let k = 0; k < p.length; k++) { + const r = rev(k, bits); + if (r > k) { + const tmp = p[k]; + p[k] = p[r]; + p[r] = tmp; + } + } +} +//#endregion +//#region src/futils.js +function mulScalar(F, base, e) { + let res; + if (isZero(e)) return F.zero; + const n = naf(e); + if (n[n.length - 1] == 1) res = base; + else if (n[n.length - 1] == -1) res = F.neg(base); + else throw new Error("invlaud NAF"); + for (let i = n.length - 2; i >= 0; i--) { + res = F.double(res); + if (n[i] == 1) res = F.add(res, base); + else if (n[i] == -1) res = F.sub(res, base); + } + return res; +} +function exp(F, base, e) { + if (isZero(e)) return F.one; + const n = bits(e); + if (n.length == 0) return F.one; + let res = base; + for (let i = n.length - 2; i >= 0; i--) { + res = F.square(res); + if (n[i]) res = F.mul(res, base); + } + return res; +} +//#endregion +//#region src/fsqrt.js +function buildSqrt(F) { + if (F.m % 2 == 1) { + if (eq(mod(F.p, 4), 1)) if (eq(mod(F.p, 8), 1)) if (eq(mod(F.p, 16), 1)) alg5_tonelliShanks(F); + else if (eq(mod(F.p, 16), 9)) alg4_kong(F); + else throw new Error("Field withot sqrt"); + else if (eq(mod(F.p, 8), 5)) alg3_atkin(F); + else throw new Error("Field withot sqrt"); + else if (eq(mod(F.p, 4), 3)) alg2_shanks(F); + } else { + const pm2mod4 = mod(pow(F.p, F.m / 2), 4); + if (pm2mod4 == 1) alg10_adj(F); + else if (pm2mod4 == 3) alg9_adj(F); + else alg8_complex(F); + } +} +function alg5_tonelliShanks(F) { + F.sqrt_q = pow(F.p, F.m); + F.sqrt_s = 0; + F.sqrt_t = sub(F.sqrt_q, 1); + while (!isOdd(F.sqrt_t)) { + F.sqrt_s = F.sqrt_s + 1; + F.sqrt_t = div(F.sqrt_t, 2); + } + let c0 = F.one; + while (F.eq(c0, F.one)) { + const c = F.random(); + F.sqrt_z = F.pow(c, F.sqrt_t); + c0 = F.pow(F.sqrt_z, 2 ** (F.sqrt_s - 1)); + } + F.sqrt_tm1d2 = div(sub(F.sqrt_t, 1), 2); + F.sqrt = function(a) { + const F = this; + if (F.isZero(a)) return F.zero; + let w = F.pow(a, F.sqrt_tm1d2); + const a0 = F.pow(F.mul(F.square(w), a), 2 ** (F.sqrt_s - 1)); + if (F.eq(a0, F.negone)) return null; + let v = F.sqrt_s; + let x = F.mul(a, w); + let b = F.mul(x, w); + let z = F.sqrt_z; + while (!F.eq(b, F.one)) { + let b2k = F.square(b); + let k = 1; + while (!F.eq(b2k, F.one)) { + b2k = F.square(b2k); + k++; + } + w = z; + for (let i = 0; i < v - k - 1; i++) w = F.square(w); + z = F.square(w); + b = F.mul(b, z); + x = F.mul(x, w); + v = k; + } + return F.geq(x, F.zero) ? x : F.neg(x); + }; +} +function alg4_kong(F) { + F.sqrt = function() { + throw new Error("Sqrt alg 4 not implemented"); + }; +} +function alg3_atkin(F) { + F.sqrt = function() { + throw new Error("Sqrt alg 3 not implemented"); + }; +} +function alg2_shanks(F) { + F.sqrt_q = pow(F.p, F.m); + F.sqrt_e1 = div(sub(F.sqrt_q, 3), 4); + F.sqrt = function(a) { + if (this.isZero(a)) return this.zero; + const a1 = this.pow(a, this.sqrt_e1); + const a0 = this.mul(this.square(a1), a); + if (this.eq(a0, this.negone)) return null; + const x = this.mul(a1, a); + return F.geq(x, F.zero) ? x : F.neg(x); + }; +} +function alg10_adj(F) { + F.sqrt = function() { + throw new Error("Sqrt alg 10 not implemented"); + }; +} +function alg9_adj(F) { + F.sqrt_q = pow(F.p, F.m / 2); + F.sqrt_e34 = div(sub(F.sqrt_q, 3), 4); + F.sqrt_e12 = div(sub(F.sqrt_q, 1), 2); + F.frobenius = function(n, x) { + if (n % 2 == 1) return F.conjugate(x); + else return x; + }; + F.sqrt = function(a) { + const F = this; + const a1 = F.pow(a, F.sqrt_e34); + const alfa = F.mul(F.square(a1), a); + const a0 = F.mul(F.frobenius(1, alfa), alfa); + if (F.eq(a0, F.negone)) return null; + const x0 = F.mul(a1, a); + let x; + if (F.eq(alfa, F.negone)) x = F.mul(x0, [F.F.zero, F.F.one]); + else { + const b = F.pow(F.add(F.one, alfa), F.sqrt_e12); + x = F.mul(b, x0); + } + return F.geq(x, F.zero) ? x : F.neg(x); + }; +} +function alg8_complex(F) { + F.sqrt = function() { + throw new Error("Sqrt alg 8 not implemented"); + }; +} +//#endregion +//#region src/chacha.js +function quarterRound(st, a, b, c, d) { + st[a] = st[a] + st[b] >>> 0; + st[d] = (st[d] ^ st[a]) >>> 0; + st[d] = (st[d] << 16 | st[d] >>> 16 & 65535) >>> 0; + st[c] = st[c] + st[d] >>> 0; + st[b] = (st[b] ^ st[c]) >>> 0; + st[b] = (st[b] << 12 | st[b] >>> 20 & 4095) >>> 0; + st[a] = st[a] + st[b] >>> 0; + st[d] = (st[d] ^ st[a]) >>> 0; + st[d] = (st[d] << 8 | st[d] >>> 24 & 255) >>> 0; + st[c] = st[c] + st[d] >>> 0; + st[b] = (st[b] ^ st[c]) >>> 0; + st[b] = (st[b] << 7 | st[b] >>> 25 & 127) >>> 0; +} +function doubleRound(st) { + quarterRound(st, 0, 4, 8, 12); + quarterRound(st, 1, 5, 9, 13); + quarterRound(st, 2, 6, 10, 14); + quarterRound(st, 3, 7, 11, 15); + quarterRound(st, 0, 5, 10, 15); + quarterRound(st, 1, 6, 11, 12); + quarterRound(st, 2, 7, 8, 13); + quarterRound(st, 3, 4, 9, 14); +} +var ChaCha = class { + constructor(seed) { + seed = seed || [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + this.state = [ + 1634760805, + 857760878, + 2036477234, + 1797285236, + seed[0], + seed[1], + seed[2], + seed[3], + seed[4], + seed[5], + seed[6], + seed[7], + 0, + 0, + 0, + 0 + ]; + this.idx = 16; + this.buff = new Array(16); + } + nextU32() { + if (this.idx == 16) this.update(); + return this.buff[this.idx++]; + } + nextU64() { + return add(mul(this.nextU32(), 4294967296), this.nextU32()); + } + nextBool() { + return (this.nextU32() & 1) == 1; + } + update() { + for (let i = 0; i < 16; i++) this.buff[i] = this.state[i]; + for (let i = 0; i < 10; i++) doubleRound(this.buff); + for (let i = 0; i < 16; i++) this.buff[i] = this.buff[i] + this.state[i] >>> 0; + this.idx = 0; + this.state[12] = this.state[12] + 1 >>> 0; + if (this.state[12] != 0) return; + this.state[13] = this.state[13] + 1 >>> 0; + if (this.state[13] != 0) return; + this.state[14] = this.state[14] + 1 >>> 0; + if (this.state[14] != 0) return; + this.state[15] = this.state[15] + 1 >>> 0; + } +}; +//#endregion +//#region __vite-browser-external +var require___vite_browser_external = /* @__PURE__ */ __commonJSMin(((exports, module) => { + module.exports = {}; +})); +//#endregion +//#region src/random.js +function getRandomBytes(n) { + let array = new Uint8Array(n); + if (typeof globalThis.crypto !== "undefined") globalThis.crypto.getRandomValues(array); + else if (typeof __require === "function") require___vite_browser_external().randomFillSync(array); + else throw new Error("No cryptographically secure random source available."); + return array; +} +function getRandomSeed() { + const arr = getRandomBytes(32); + const arrV = new Uint32Array(arr.buffer); + const seed = []; + for (let i = 0; i < 8; i++) seed.push(arrV[i]); + return seed; +} +var threadRng = null; +function getThreadRng() { + if (threadRng) return threadRng; + threadRng = new ChaCha(getRandomSeed()); + return threadRng; +} +//#endregion +//#region src/fft.js +var FFT = class { + constructor(G, F, opMulGF) { + this.F = F; + this.G = G; + this.opMulGF = opMulGF; + let rem = F.sqrt_t || F.t; + let s = F.sqrt_s || F.s; + let nqr = F.one; + while (F.eq(F.pow(nqr, F.half), F.one)) nqr = F.add(nqr, F.one); + this.w = new Array(s + 1); + this.wi = new Array(s + 1); + this.w[s] = this.F.pow(nqr, rem); + this.wi[s] = this.F.inv(this.w[s]); + let n = s - 1; + while (n >= 0) { + this.w[n] = this.F.square(this.w[n + 1]); + this.wi[n] = this.F.square(this.wi[n + 1]); + n--; + } + this.roots = []; + this._setRoots(Math.min(s, 15)); + } + _setRoots(n) { + for (let i = n; i >= 0 && !this.roots[i]; i--) { + let r = this.F.one; + const nroots = 1 << i; + const rootsi = new Array(nroots); + for (let j = 0; j < nroots; j++) { + rootsi[j] = r; + r = this.F.mul(r, this.w[i]); + } + this.roots[i] = rootsi; + } + } + fft(p) { + if (p.length <= 1) return p; + const bits = log2$1(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + if (p.length != m) throw new Error("Size must be multiple of 2"); + return __fft(this, p, bits, 0, 1); + } + ifft(p) { + if (p.length <= 1) return p; + const bits = log2$1(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + if (p.length != m) throw new Error("Size must be multiple of 2"); + const res = __fft(this, p, bits, 0, 1); + const twoinvm = this.F.inv(this.F.mulScalar(this.F.one, m)); + const resn = new Array(m); + for (let i = 0; i < m; i++) resn[i] = this.opMulGF(res[(m - i) % m], twoinvm); + return resn; + } +}; +function log2$1(V) { + return ((V & 4294901760) !== 0 ? (V &= 4294901760, 16) : 0) | ((V & 4278255360) !== 0 ? (V &= 4278255360, 8) : 0) | ((V & 4042322160) !== 0 ? (V &= 4042322160, 4) : 0) | ((V & 3435973836) !== 0 ? (V &= 3435973836, 2) : 0) | (V & 2863311530) !== 0; +} +function __fft(PF, pall, bits, offset, step) { + const n = 1 << bits; + if (n == 1) return [pall[offset]]; + else if (n == 2) return [PF.G.add(pall[offset], pall[offset + step]), PF.G.sub(pall[offset], pall[offset + step])]; + const ndiv2 = n >> 1; + const p1 = __fft(PF, pall, bits - 1, offset, step * 2); + const p2 = __fft(PF, pall, bits - 1, offset + step, step * 2); + const out = new Array(n); + for (let i = 0; i < ndiv2; i++) { + out[i] = PF.G.add(p1[i], PF.opMulGF(p2[i], PF.roots[bits][i])); + out[i + ndiv2] = PF.G.sub(p1[i], PF.opMulGF(p2[i], PF.roots[bits][i])); + } + return out; +} +//#endregion +//#region src/f1field.js +var ZqField = class { + constructor(p) { + this.type = "F1"; + this.one = BigInt(1); + this.zero = BigInt(0); + this.p = BigInt(p); + this.m = 1; + this.negone = this.p - this.one; + this.two = BigInt(2); + this.half = this.p >> this.one; + this.bitLength = bitLength(this.p); + this.mask = (this.one << BigInt(this.bitLength)) - this.one; + this.n64 = Math.floor((this.bitLength - 1) / 64) + 1; + this.n32 = this.n64 * 2; + this.n8 = this.n64 * 8; + this.R = this.e(this.one << BigInt(this.n64 * 64)); + this.Ri = this.inv(this.R); + const e = this.negone >> this.one; + this.nqr = this.two; + let r = this.pow(this.nqr, e); + while (!this.eq(r, this.negone)) { + this.nqr = this.nqr + this.one; + r = this.pow(this.nqr, e); + } + this.s = 0; + this.t = this.negone; + while ((this.t & this.one) == this.zero) { + this.s = this.s + 1; + this.t = this.t >> this.one; + } + this.nqr_to_t = this.pow(this.nqr, this.t); + buildSqrt(this); + this.FFT = new FFT(this, this, this.mul.bind(this)); + this.fft = this.FFT.fft.bind(this.FFT); + this.ifft = this.FFT.ifft.bind(this.FFT); + this.w = this.FFT.w; + this.wi = this.FFT.wi; + this.shift = this.square(this.nqr); + this.k = this.exp(this.nqr, 2 ** this.s); + } + e(a, b) { + let res; + if (!b) res = BigInt(a); + else if (b == 16) res = BigInt("0x" + a); + if (res < 0) { + let nres = -res; + if (nres >= this.p) nres = nres % this.p; + return this.p - nres; + } else return res >= this.p ? res % this.p : res; + } + add(a, b) { + const res = a + b; + return res >= this.p ? res - this.p : res; + } + sub(a, b) { + return a >= b ? a - b : this.p - b + a; + } + neg(a) { + return a ? this.p - a : a; + } + mul(a, b) { + return a * b % this.p; + } + mulScalar(base, s) { + return base * this.e(s) % this.p; + } + square(a) { + return a * a % this.p; + } + eq(a, b) { + return a == b; + } + neq(a, b) { + return a != b; + } + lt(a, b) { + return (a > this.half ? a - this.p : a) < (b > this.half ? b - this.p : b); + } + gt(a, b) { + return (a > this.half ? a - this.p : a) > (b > this.half ? b - this.p : b); + } + leq(a, b) { + return (a > this.half ? a - this.p : a) <= (b > this.half ? b - this.p : b); + } + geq(a, b) { + return (a > this.half ? a - this.p : a) >= (b > this.half ? b - this.p : b); + } + div(a, b) { + return this.mul(a, this.inv(b)); + } + idiv(a, b) { + if (!b) throw new Error("Division by zero"); + return a / b; + } + inv(a) { + if (!a) throw new Error("Division by zero"); + let t = this.zero; + let r = this.p; + let newt = this.one; + let newr = a % this.p; + while (newr) { + let q = r / newr; + [t, newt] = [newt, t - q * newt]; + [r, newr] = [newr, r - q * newr]; + } + if (t < this.zero) t += this.p; + return t; + } + mod(a, b) { + return a % b; + } + pow(b, e) { + return exp(this, b, e); + } + exp(b, e) { + return exp(this, b, e); + } + band(a, b) { + const res = a & b & this.mask; + return res >= this.p ? res - this.p : res; + } + bor(a, b) { + const res = (a | b) & this.mask; + return res >= this.p ? res - this.p : res; + } + bxor(a, b) { + const res = (a ^ b) & this.mask; + return res >= this.p ? res - this.p : res; + } + bnot(a) { + const res = a ^ this.mask; + return res >= this.p ? res - this.p : res; + } + shl(a, b) { + if (Number(b) < this.bitLength) { + const res = a << b & this.mask; + return res >= this.p ? res - this.p : res; + } else { + const nb = this.p - b; + if (Number(nb) < this.bitLength) return a >> nb; + else return this.zero; + } + } + shr(a, b) { + if (Number(b) < this.bitLength) return a >> b; + else { + const nb = this.p - b; + if (Number(nb) < this.bitLength) { + const res = a << nb & this.mask; + return res >= this.p ? res - this.p : res; + } else return 0; + } + } + land(a, b) { + return a && b ? this.one : this.zero; + } + lor(a, b) { + return a || b ? this.one : this.zero; + } + lnot(a) { + return a ? this.zero : this.one; + } + sqrt_old(n) { + if (n == this.zero) return this.zero; + if (this.pow(n, this.negone >> this.one) != this.one) return null; + let m = this.s; + let c = this.nqr_to_t; + let t = this.pow(n, this.t); + let r = this.pow(n, this.add(this.t, this.one) >> this.one); + while (t != this.one) { + let sq = this.square(t); + let i = 1; + while (sq != this.one) { + i++; + sq = this.square(sq); + } + let b = c; + for (let j = 0; j < m - i - 1; j++) b = this.square(b); + m = i; + c = this.square(b); + t = this.mul(t, c); + r = this.mul(r, b); + } + if (r > this.p >> this.one) r = this.neg(r); + return r; + } + normalize(a, b) { + a = BigInt(a, b); + if (a < 0) { + let na = -a; + if (na >= this.p) na = na % this.p; + return this.p - na; + } else return a >= this.p ? a % this.p : a; + } + random() { + const nBytes = this.bitLength * 2 / 8; + let res = this.zero; + for (let i = 0; i < nBytes; i++) res = (res << BigInt(8)) + BigInt(getRandomBytes(1)[0]); + return res % this.p; + } + toString(a, base) { + base = base || 10; + let vs; + if (a > this.half && base == 10) vs = "-" + (this.p - a).toString(base); + else vs = a.toString(base); + return vs; + } + isZero(a) { + return a == this.zero; + } + fromRng(rng) { + let v; + do { + v = this.zero; + for (let i = 0; i < this.n64; i++) v += rng.nextU64() << BigInt(64 * i); + v &= this.mask; + } while (v >= this.p); + v = v * this.Ri % this.p; + return v; + } + fft(a) { + return this.FFT.fft(a); + } + ifft(a) { + return this.FFT.ifft(a); + } + toRprLE(buff, o, e) { + toRprLE(buff, o, e, this.n64 * 8); + } + toRprBE(buff, o, e) { + toRprBE(buff, o, e, this.n64 * 8); + } + toRprBEM(buff, o, e) { + return this.toRprBE(buff, o, this.mul(this.R, e)); + } + toRprLEM(buff, o, e) { + return this.toRprLE(buff, o, this.mul(this.R, e)); + } + fromRprLE(buff, o) { + return fromRprLE(buff, o, this.n8); + } + fromRprBE(buff, o) { + return fromRprBE(buff, o, this.n8); + } + fromRprLEM(buff, o) { + return this.mul(this.fromRprLE(buff, o), this.Ri); + } + fromRprBEM(buff, o) { + return this.mul(this.fromRprBE(buff, o), this.Ri); + } + toObject(a) { + return a; + } +}; +//#endregion +//#region src/f2field.js +var F2Field = class { + constructor(F, nonResidue) { + this.type = "F2"; + this.F = F; + this.zero = [this.F.zero, this.F.zero]; + this.one = [this.F.one, this.F.zero]; + this.negone = this.neg(this.one); + this.nonResidue = nonResidue; + this.m = F.m * 2; + this.p = F.p; + this.n64 = F.n64 * 2; + this.n32 = this.n64 * 2; + this.n8 = this.n64 * 8; + buildSqrt(this); + } + _mulByNonResidue(a) { + return this.F.mul(this.nonResidue, a); + } + copy(a) { + return [this.F.copy(a[0]), this.F.copy(a[1])]; + } + add(a, b) { + return [this.F.add(a[0], b[0]), this.F.add(a[1], b[1])]; + } + double(a) { + return this.add(a, a); + } + sub(a, b) { + return [this.F.sub(a[0], b[0]), this.F.sub(a[1], b[1])]; + } + neg(a) { + return this.sub(this.zero, a); + } + conjugate(a) { + return [a[0], this.F.neg(a[1])]; + } + mul(a, b) { + const aA = this.F.mul(a[0], b[0]); + const bB = this.F.mul(a[1], b[1]); + return [this.F.add(aA, this._mulByNonResidue(bB)), this.F.sub(this.F.mul(this.F.add(a[0], a[1]), this.F.add(b[0], b[1])), this.F.add(aA, bB))]; + } + inv(a) { + const t0 = this.F.square(a[0]); + const t1 = this.F.square(a[1]); + const t2 = this.F.sub(t0, this._mulByNonResidue(t1)); + const t3 = this.F.inv(t2); + return [this.F.mul(a[0], t3), this.F.neg(this.F.mul(a[1], t3))]; + } + div(a, b) { + return this.mul(a, this.inv(b)); + } + square(a) { + const ab = this.F.mul(a[0], a[1]); + return [this.F.sub(this.F.mul(this.F.add(a[0], a[1]), this.F.add(a[0], this._mulByNonResidue(a[1]))), this.F.add(ab, this._mulByNonResidue(ab))), this.F.add(ab, ab)]; + } + isZero(a) { + return this.F.isZero(a[0]) && this.F.isZero(a[1]); + } + eq(a, b) { + return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]); + } + mulScalar(base, e) { + return mulScalar(this, base, e); + } + pow(base, e) { + return exp(this, base, e); + } + exp(base, e) { + return exp(this, base, e); + } + toString(a) { + return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])} ]`; + } + fromRng(rng) { + return [this.F.fromRng(rng), this.F.fromRng(rng)]; + } + gt(a, b) { + if (this.F.gt(a[0], b[0])) return true; + if (this.F.gt(b[0], a[0])) return false; + if (this.F.gt(a[1], b[1])) return true; + return false; + } + geq(a, b) { + return this.gt(a, b) || this.eq(a, b); + } + lt(a, b) { + return !this.geq(a, b); + } + leq(a, b) { + return !this.gt(a, b); + } + neq(a, b) { + return !this.eq(a, b); + } + random() { + return [this.F.random(), this.F.random()]; + } + toRprLE(buff, o, e) { + this.F.toRprLE(buff, o, e[0]); + this.F.toRprLE(buff, o + this.F.n8, e[1]); + } + toRprBE(buff, o, e) { + this.F.toRprBE(buff, o, e[1]); + this.F.toRprBE(buff, o + this.F.n8, e[0]); + } + toRprLEM(buff, o, e) { + this.F.toRprLEM(buff, o, e[0]); + this.F.toRprLEM(buff, o + this.F.n8, e[1]); + } + toRprBEM(buff, o, e) { + this.F.toRprBEM(buff, o, e[1]); + this.F.toRprBEM(buff, o + this.F.n8, e[0]); + } + fromRprLE(buff, o) { + o = o || 0; + return [this.F.fromRprLE(buff, o), this.F.fromRprLE(buff, o + this.F.n8)]; + } + fromRprBE(buff, o) { + o = o || 0; + const c1 = this.F.fromRprBE(buff, o); + return [this.F.fromRprBE(buff, o + this.F.n8), c1]; + } + fromRprLEM(buff, o) { + o = o || 0; + return [this.F.fromRprLEM(buff, o), this.F.fromRprLEM(buff, o + this.F.n8)]; + } + fromRprBEM(buff, o) { + o = o || 0; + const c1 = this.F.fromRprBEM(buff, o); + return [this.F.fromRprBEM(buff, o + this.F.n8), c1]; + } + toObject(a) { + return a; + } +}; +//#endregion +//#region src/f3field.js +var F3Field = class { + constructor(F, nonResidue) { + this.type = "F3"; + this.F = F; + this.zero = [ + this.F.zero, + this.F.zero, + this.F.zero + ]; + this.one = [ + this.F.one, + this.F.zero, + this.F.zero + ]; + this.negone = this.neg(this.one); + this.nonResidue = nonResidue; + this.m = F.m * 3; + this.p = F.p; + this.n64 = F.n64 * 3; + this.n32 = this.n64 * 2; + this.n8 = this.n64 * 8; + } + _mulByNonResidue(a) { + return this.F.mul(this.nonResidue, a); + } + copy(a) { + return [ + this.F.copy(a[0]), + this.F.copy(a[1]), + this.F.copy(a[2]) + ]; + } + add(a, b) { + return [ + this.F.add(a[0], b[0]), + this.F.add(a[1], b[1]), + this.F.add(a[2], b[2]) + ]; + } + double(a) { + return this.add(a, a); + } + sub(a, b) { + return [ + this.F.sub(a[0], b[0]), + this.F.sub(a[1], b[1]), + this.F.sub(a[2], b[2]) + ]; + } + neg(a) { + return this.sub(this.zero, a); + } + mul(a, b) { + const aA = this.F.mul(a[0], b[0]); + const bB = this.F.mul(a[1], b[1]); + const cC = this.F.mul(a[2], b[2]); + return [ + this.F.add(aA, this._mulByNonResidue(this.F.sub(this.F.mul(this.F.add(a[1], a[2]), this.F.add(b[1], b[2])), this.F.add(bB, cC)))), + this.F.add(this.F.sub(this.F.mul(this.F.add(a[0], a[1]), this.F.add(b[0], b[1])), this.F.add(aA, bB)), this._mulByNonResidue(cC)), + this.F.add(this.F.sub(this.F.mul(this.F.add(a[0], a[2]), this.F.add(b[0], b[2])), this.F.add(aA, cC)), bB) + ]; + } + inv(a) { + const t0 = this.F.square(a[0]); + const t1 = this.F.square(a[1]); + const t2 = this.F.square(a[2]); + const t3 = this.F.mul(a[0], a[1]); + const t4 = this.F.mul(a[0], a[2]); + const t5 = this.F.mul(a[1], a[2]); + const c0 = this.F.sub(t0, this._mulByNonResidue(t5)); + const c1 = this.F.sub(this._mulByNonResidue(t2), t3); + const c2 = this.F.sub(t1, t4); + const t6 = this.F.inv(this.F.add(this.F.mul(a[0], c0), this._mulByNonResidue(this.F.add(this.F.mul(a[2], c1), this.F.mul(a[1], c2))))); + return [ + this.F.mul(t6, c0), + this.F.mul(t6, c1), + this.F.mul(t6, c2) + ]; + } + div(a, b) { + return this.mul(a, this.inv(b)); + } + square(a) { + const s0 = this.F.square(a[0]); + const ab = this.F.mul(a[0], a[1]); + const s1 = this.F.add(ab, ab); + const s2 = this.F.square(this.F.add(this.F.sub(a[0], a[1]), a[2])); + const bc = this.F.mul(a[1], a[2]); + const s3 = this.F.add(bc, bc); + const s4 = this.F.square(a[2]); + return [ + this.F.add(s0, this._mulByNonResidue(s3)), + this.F.add(s1, this._mulByNonResidue(s4)), + this.F.sub(this.F.add(this.F.add(s1, s2), s3), this.F.add(s0, s4)) + ]; + } + isZero(a) { + return this.F.isZero(a[0]) && this.F.isZero(a[1]) && this.F.isZero(a[2]); + } + eq(a, b) { + return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]) && this.F.eq(a[2], b[2]); + } + affine(a) { + return [ + this.F.affine(a[0]), + this.F.affine(a[1]), + this.F.affine(a[2]) + ]; + } + mulScalar(base, e) { + return mulScalar(this, base, e); + } + pow(base, e) { + return exp(this, base, e); + } + exp(base, e) { + return exp(this, base, e); + } + toString(a) { + return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])}, ${this.F.toString(a[2])} ]`; + } + fromRng(rng) { + return [ + this.F.fromRng(rng), + this.F.fromRng(rng), + this.F.fromRng(rng) + ]; + } + gt(a, b) { + if (this.F.gt(a[0], b[0])) return true; + if (this.F.gt(b[0], a[0])) return false; + if (this.F.gt(a[1], b[1])) return true; + if (this.F.gt(b[1], a[1])) return false; + if (this.F.gt(a[2], b[2])) return true; + return false; + } + geq(a, b) { + return this.gt(a, b) || this.eq(a, b); + } + lt(a, b) { + return !this.geq(a, b); + } + leq(a, b) { + return !this.gt(a, b); + } + neq(a, b) { + return !this.eq(a, b); + } + random() { + return [ + this.F.random(), + this.F.random(), + this.F.random() + ]; + } + toRprLE(buff, o, e) { + this.F.toRprLE(buff, o, e[0]); + this.F.toRprLE(buff, o + this.F.n8, e[1]); + this.F.toRprLE(buff, o + this.F.n8 * 2, e[2]); + } + toRprBE(buff, o, e) { + this.F.toRprBE(buff, o, e[2]); + this.F.toRprBE(buff, o + this.F.n8, e[1]); + this.F.toRprBE(buff, o + this.F.n8 * 2, e[0]); + } + toRprLEM(buff, o, e) { + this.F.toRprLEM(buff, o, e[0]); + this.F.toRprLEM(buff, o + this.F.n8, e[1]); + this.F.toRprLEM(buff, o + this.F.n8 * 2, e[2]); + } + toRprBEM(buff, o, e) { + this.F.toRprBEM(buff, o, e[2]); + this.F.toRprBEM(buff, o + this.F.n8, e[1]); + this.F.toRprBEM(buff, o + this.F.n8 * 2, e[0]); + } + fromRprLE(buff, o) { + o = o || 0; + return [ + this.F.fromRprLE(buff, o), + this.F.fromRprLE(buff, o + this.n8), + this.F.fromRprLE(buff, o + this.n8 * 2) + ]; + } + fromRprBE(buff, o) { + o = o || 0; + const c2 = this.F.fromRprBE(buff, o); + const c1 = this.F.fromRprBE(buff, o + this.n8); + return [ + this.F.fromRprBE(buff, o + this.n8 * 2), + c1, + c2 + ]; + } + fromRprLEM(buff, o) { + o = o || 0; + return [ + this.F.fromRprLEM(buff, o), + this.F.fromRprLEM(buff, o + this.n8), + this.F.fromRprLEM(buff, o + this.n8 * 2) + ]; + } + fromRprBEM(buff, o) { + o = o || 0; + const c2 = this.F.fromRprBEM(buff, o); + const c1 = this.F.fromRprBEM(buff, o + this.n8); + return [ + this.F.fromRprBEM(buff, o + this.n8 * 2), + c1, + c2 + ]; + } + toObject(a) { + return a; + } +}; +//#endregion +//#region src/ec.js +function isGreatest(F, a) { + if (Array.isArray(a)) { + for (let i = a.length - 1; i >= 0; i--) if (!F.F.isZero(a[i])) return isGreatest(F.F, a[i]); + return 0; + } else return gt(a, F.neg(a)); +} +var EC = class { + constructor(F, g) { + this.F = F; + this.g = g; + if (this.g.length == 2) this.g[2] = this.F.one; + this.zero = [ + this.F.zero, + this.F.one, + this.F.zero + ]; + } + add(p1, p2) { + const F = this.F; + if (this.eq(p1, this.zero)) return p2; + if (this.eq(p2, this.zero)) return p1; + const res = new Array(3); + const Z1Z1 = F.square(p1[2]); + const Z2Z2 = F.square(p2[2]); + const U1 = F.mul(p1[0], Z2Z2); + const U2 = F.mul(p2[0], Z1Z1); + const Z1_cubed = F.mul(p1[2], Z1Z1); + const Z2_cubed = F.mul(p2[2], Z2Z2); + const S1 = F.mul(p1[1], Z2_cubed); + const S2 = F.mul(p2[1], Z1_cubed); + if (F.eq(U1, U2) && F.eq(S1, S2)) return this.double(p1); + const H = F.sub(U2, U1); + const S2_minus_S1 = F.sub(S2, S1); + const I = F.square(F.add(H, H)); + const J = F.mul(H, I); + const r = F.add(S2_minus_S1, S2_minus_S1); + const V = F.mul(U1, I); + res[0] = F.sub(F.sub(F.square(r), J), F.add(V, V)); + const S1_J = F.mul(S1, J); + res[1] = F.sub(F.mul(r, F.sub(V, res[0])), F.add(S1_J, S1_J)); + res[2] = F.mul(H, F.sub(F.square(F.add(p1[2], p2[2])), F.add(Z1Z1, Z2Z2))); + return res; + } + neg(p) { + return [ + p[0], + this.F.neg(p[1]), + p[2] + ]; + } + sub(a, b) { + return this.add(a, this.neg(b)); + } + double(p) { + const F = this.F; + const res = new Array(3); + if (this.eq(p, this.zero)) return p; + const A = F.square(p[0]); + const B = F.square(p[1]); + const C = F.square(B); + let D = F.sub(F.square(F.add(p[0], B)), F.add(A, C)); + D = F.add(D, D); + const E = F.add(F.add(A, A), A); + const FF = F.square(E); + res[0] = F.sub(FF, F.add(D, D)); + let eightC = F.add(C, C); + eightC = F.add(eightC, eightC); + eightC = F.add(eightC, eightC); + res[1] = F.sub(F.mul(E, F.sub(D, res[0])), eightC); + const Y1Z1 = F.mul(p[1], p[2]); + res[2] = F.add(Y1Z1, Y1Z1); + return res; + } + timesScalar(base, e) { + return mulScalar(this, base, e); + } + mulScalar(base, e) { + return mulScalar(this, base, e); + } + affine(p) { + const F = this.F; + if (this.isZero(p)) return this.zero; + else if (F.eq(p[2], F.one)) return p; + else { + const Z_inv = F.inv(p[2]); + const Z2_inv = F.square(Z_inv); + const Z3_inv = F.mul(Z2_inv, Z_inv); + const res = new Array(3); + res[0] = F.mul(p[0], Z2_inv); + res[1] = F.mul(p[1], Z3_inv); + res[2] = F.one; + return res; + } + } + multiAffine(arr) { + const keys = Object.keys(arr); + const F = this.F; + const accMul = new Array(keys.length + 1); + accMul[0] = F.one; + for (let i = 0; i < keys.length; i++) if (F.eq(arr[keys[i]][2], F.zero)) accMul[i + 1] = accMul[i]; + else accMul[i + 1] = F.mul(accMul[i], arr[keys[i]][2]); + accMul[keys.length] = F.inv(accMul[keys.length]); + for (let i = keys.length - 1; i >= 0; i--) if (F.eq(arr[keys[i]][2], F.zero)) { + accMul[i] = accMul[i + 1]; + arr[keys[i]] = this.zero; + } else { + const Z_inv = F.mul(accMul[i], accMul[i + 1]); + accMul[i] = F.mul(arr[keys[i]][2], accMul[i + 1]); + const Z2_inv = F.square(Z_inv); + const Z3_inv = F.mul(Z2_inv, Z_inv); + arr[keys[i]][0] = F.mul(arr[keys[i]][0], Z2_inv); + arr[keys[i]][1] = F.mul(arr[keys[i]][1], Z3_inv); + arr[keys[i]][2] = F.one; + } + } + eq(p1, p2) { + const F = this.F; + if (this.F.eq(p1[2], this.F.zero)) return this.F.eq(p2[2], this.F.zero); + if (this.F.eq(p2[2], this.F.zero)) return false; + const Z1Z1 = F.square(p1[2]); + const Z2Z2 = F.square(p2[2]); + const U1 = F.mul(p1[0], Z2Z2); + const U2 = F.mul(p2[0], Z1Z1); + const Z1_cubed = F.mul(p1[2], Z1Z1); + const Z2_cubed = F.mul(p2[2], Z2Z2); + const S1 = F.mul(p1[1], Z2_cubed); + const S2 = F.mul(p2[1], Z1_cubed); + return F.eq(U1, U2) && F.eq(S1, S2); + } + isZero(p) { + return this.F.isZero(p[2]); + } + toString(p) { + const cp = this.affine(p); + return `[ ${this.F.toString(cp[0])} , ${this.F.toString(cp[1])} ]`; + } + fromRng(rng) { + const F = this.F; + let P = []; + let greatest; + do { + P[0] = F.fromRng(rng); + greatest = rng.nextBool(); + const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); + P[1] = F.sqrt(x3b); + } while (P[1] == null || F.isZero[P]); + const s = isGreatest(F, P[1]); + if (greatest ^ s) P[1] = F.neg(P[1]); + P[2] = F.one; + if (this.cofactor) P = this.mulScalar(P, this.cofactor); + P = this.affine(P); + return P; + } + toRprLE(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprLE(buff, o, p[0]); + this.F.toRprLE(buff, o + this.F.n8, p[1]); + } + toRprBE(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprBE(buff, o, p[0]); + this.F.toRprBE(buff, o + this.F.n8, p[1]); + } + toRprLEM(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprLEM(buff, o, p[0]); + this.F.toRprLEM(buff, o + this.F.n8, p[1]); + } + toRprLEJM(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprLEM(buff, o, p[0]); + this.F.toRprLEM(buff, o + this.F.n8, p[1]); + this.F.toRprLEM(buff, o + 2 * this.F.n8, p[2]); + } + toRprBEM(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprBEM(buff, o, p[0]); + this.F.toRprBEM(buff, o + this.F.n8, p[1]); + } + fromRprLE(buff, o) { + o = o || 0; + const x = this.F.fromRprLE(buff, o); + const y = this.F.fromRprLE(buff, o + this.F.n8); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + this.F.one + ]; + } + fromRprBE(buff, o) { + o = o || 0; + const x = this.F.fromRprBE(buff, o); + const y = this.F.fromRprBE(buff, o + this.F.n8); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + this.F.one + ]; + } + fromRprLEM(buff, o) { + o = o || 0; + const x = this.F.fromRprLEM(buff, o); + const y = this.F.fromRprLEM(buff, o + this.F.n8); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + this.F.one + ]; + } + fromRprLEJM(buff, o) { + o = o || 0; + const x = this.F.fromRprLEM(buff, o); + const y = this.F.fromRprLEM(buff, o + this.F.n8); + const z = this.F.fromRprLEM(buff, o + this.F.n8 * 2); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + z + ]; + } + fromRprBEM(buff, o) { + o = o || 0; + const x = this.F.fromRprBEM(buff, o); + const y = this.F.fromRprBEM(buff, o + this.F.n8); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + this.F.one + ]; + } + fromRprCompressed(buff, o) { + const F = this.F; + const v = new Uint8Array(buff.buffer, o, F.n8); + if (v[0] & 64) return this.zero; + const P = new Array(3); + const greatest = (v[0] & 128) != 0; + v[0] = v[0] & 127; + P[0] = F.fromRprBE(buff, o); + if (greatest) v[0] = v[0] | 128; + const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); + P[1] = F.sqrt(x3b); + if (P[1] === null) throw new Error("Invalid Point!"); + if (greatest ^ isGreatest(F, P[1])) P[1] = F.neg(P[1]); + P[2] = F.one; + return P; + } + toRprCompressed(buff, o, p) { + p = this.affine(p); + const v = new Uint8Array(buff.buffer, o, this.F.n8); + if (this.isZero(p)) { + v.fill(0); + v[0] = 64; + return; + } + this.F.toRprBE(buff, o, p[0]); + if (isGreatest(this.F, p[1])) v[0] = v[0] | 128; + } + fromRprUncompressed(buff, o) { + if (buff[0] & 64) return this.zero; + return this.fromRprBE(buff, o); + } + toRprUncompressed(buff, o, p) { + this.toRprBE(buff, o, p); + if (this.isZero(p)) buff[o] = buff[o] | 64; + } +}; +//#endregion +//#region src/utils.js +var utils_exports = /* @__PURE__ */ __exportAll({ + array2buffer: () => array2buffer, + beBuff2int: () => beBuff2int, + beInt2Buff: () => beInt2Buff, + bitReverse: () => bitReverse, + buffReverseBits: () => buffReverseBits, + buffer2array: () => buffer2array, + leBuff2int: () => leBuff2int, + leInt2Buff: () => leInt2Buff, + log2: () => log2, + stringifyBigInts: () => stringifyBigInts, + stringifyFElements: () => stringifyFElements, + unstringifyBigInts: () => unstringifyBigInts, + unstringifyFElements: () => unstringifyFElements +}); +function stringifyBigInts(o) { + if (typeof o == "bigint" || o.eq !== void 0) return o.toString(10); + else if (o instanceof Uint8Array) return fromRprLE(o, 0); + else if (Array.isArray(o)) return o.map(stringifyBigInts); + else if (typeof o == "object") { + const res = {}; + Object.keys(o).forEach((k) => { + res[k] = stringifyBigInts(o[k]); + }); + return res; + } else return o; +} +function unstringifyBigInts(o) { + if (typeof o == "string" && /^[0-9]+$/.test(o)) return BigInt(o); + else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) return BigInt(o); + else if (Array.isArray(o)) return o.map(unstringifyBigInts); + else if (typeof o == "object") { + if (o === null) return null; + const res = {}; + Object.keys(o).forEach((k) => { + res[k] = unstringifyBigInts(o[k]); + }); + return res; + } else return o; +} +function beBuff2int(buff) { + let res = BigInt(0); + let i = buff.length; + let offset = 0; + const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); + while (i > 0) if (i >= 4) { + i -= 4; + res += BigInt(buffV.getUint32(i)) << BigInt(offset * 8); + offset += 4; + } else if (i >= 2) { + i -= 2; + res += BigInt(buffV.getUint16(i)) << BigInt(offset * 8); + offset += 2; + } else { + i -= 1; + res += BigInt(buffV.getUint8(i)) << BigInt(offset * 8); + offset += 1; + } + return res; +} +function beInt2Buff(n, len) { + let r = n; + const buff = new Uint8Array(len); + const buffV = new DataView(buff.buffer); + let o = len; + while (o > 0) if (o - 4 >= 0) { + o -= 4; + buffV.setUint32(o, Number(r & BigInt(4294967295))); + r = r >> BigInt(32); + } else if (o - 2 >= 0) { + o -= 2; + buffV.setUint16(o, Number(r & BigInt(65535))); + r = r >> BigInt(16); + } else { + o -= 1; + buffV.setUint8(o, Number(r & BigInt(255))); + r = r >> BigInt(8); + } + if (r) throw new Error("Number does not fit in this length"); + return buff; +} +function leBuff2int(buff) { + let res = BigInt(0); + let i = 0; + const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); + while (i < buff.length) if (i + 4 <= buff.length) { + res += BigInt(buffV.getUint32(i, true)) << BigInt(i * 8); + i += 4; + } else if (i + 2 <= buff.length) { + res += BigInt(buffV.getUint16(i, true)) << BigInt(i * 8); + i += 2; + } else { + res += BigInt(buffV.getUint8(i, true)) << BigInt(i * 8); + i += 1; + } + return res; +} +function leInt2Buff(n, len) { + let r = n; + if (typeof len === "undefined") { + len = Math.floor((bitLength(n) - 1) / 8) + 1; + if (len == 0) len = 1; + } + const buff = new Uint8Array(len); + const buffV = new DataView(buff.buffer); + let o = 0; + while (o < len) if (o + 4 <= len) { + buffV.setUint32(o, Number(r & BigInt(4294967295)), true); + o += 4; + r = r >> BigInt(32); + } else if (o + 2 <= len) { + buffV.setUint16(o, Number(r & BigInt(65535)), true); + o += 2; + r = r >> BigInt(16); + } else { + buffV.setUint8(o, Number(r & BigInt(255)), true); + o += 1; + r = r >> BigInt(8); + } + if (r) throw new Error("Number does not fit in this length"); + return buff; +} +function stringifyFElements(F, o) { + if (typeof o == "bigint" || o.eq !== void 0) return o.toString(10); + else if (o instanceof Uint8Array) return F.toString(F.e(o)); + else if (Array.isArray(o)) return o.map(stringifyFElements.bind(this, F)); + else if (typeof o == "object") { + const res = {}; + Object.keys(o).forEach((k) => { + res[k] = stringifyFElements(F, o[k]); + }); + return res; + } else return o; +} +function unstringifyFElements(F, o) { + if (typeof o == "string" && /^[0-9]+$/.test(o)) return F.e(o); + else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) return F.e(o); + else if (Array.isArray(o)) return o.map(unstringifyFElements.bind(this, F)); + else if (typeof o == "object") { + if (o === null) return null; + const res = {}; + Object.keys(o).forEach((k) => { + res[k] = unstringifyFElements(F, o[k]); + }); + return res; + } else return o; +} +var _revTable = []; +for (let i = 0; i < 256; i++) _revTable[i] = _revSlow(i, 8); +function _revSlow(idx, bits) { + let res = 0; + let a = idx; + for (let i = 0; i < bits; i++) { + res <<= 1; + res = res | a & 1; + a >>= 1; + } + return res; +} +function bitReverse(idx, bits) { + return (_revTable[idx >>> 24] | _revTable[idx >>> 16 & 255] << 8 | _revTable[idx >>> 8 & 255] << 16 | _revTable[idx & 255] << 24) >>> 32 - bits; +} +function log2(V) { + return ((V & 4294901760) !== 0 ? (V &= 4294901760, 16) : 0) | ((V & 4278255360) !== 0 ? (V &= 4278255360, 8) : 0) | ((V & 4042322160) !== 0 ? (V &= 4042322160, 4) : 0) | ((V & 3435973836) !== 0 ? (V &= 3435973836, 2) : 0) | (V & 2863311530) !== 0; +} +function buffReverseBits(buff, eSize) { + const n = buff.byteLength / eSize; + const bits = log2(n); + if (n != 1 << bits) throw new Error("Invalid number of pointers"); + for (let i = 0; i < n; i++) { + const r = bitReverse(i, bits); + if (i > r) { + const tmp = buff.slice(i * eSize, (i + 1) * eSize); + buff.set(buff.slice(r * eSize, (r + 1) * eSize), i * eSize); + buff.set(tmp, r * eSize); + } + } +} +function array2buffer(arr, sG) { + const buff = new Uint8Array(sG * arr.length); + for (let i = 0; i < arr.length; i++) buff.set(arr[i], i * sG); + return buff; +} +function buffer2array(buff, sG) { + const n = buff.byteLength / sG; + const arr = new Array(n); + for (let i = 0; i < n; i++) arr[i] = buff.slice(i * sG, i * sG + sG); + return arr; +} +//#endregion +//#region src/bigbuffer.js +var PAGE_SIZE = typeof Buffer !== "undefined" && Buffer.constants && Buffer.constants.MAX_LENGTH ? Buffer.constants.MAX_LENGTH : 1 << 30; +var BigBuffer = class BigBuffer { + constructor(size) { + this.buffers = []; + this.byteLength = size; + for (let i = 0; i < size; i += PAGE_SIZE) { + const n = Math.min(size - i, PAGE_SIZE); + this.buffers.push(new Uint8Array(n)); + } + } + slice(fr, to) { + if (to === void 0) to = this.byteLength; + if (fr === void 0) fr = 0; + const len = to - fr; + const firstPage = Math.floor(fr / PAGE_SIZE); + if (firstPage == Math.floor((fr + len - 1) / PAGE_SIZE) || len == 0) return this.buffers[firstPage].slice(fr % PAGE_SIZE, fr % PAGE_SIZE + len); + let buff; + let p = firstPage; + let o = fr % PAGE_SIZE; + let r = len; + while (r > 0) { + const l = o + r > PAGE_SIZE ? PAGE_SIZE - o : r; + const srcView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset + o, l); + if (l == len) return srcView.slice(); + if (!buff) if (len <= PAGE_SIZE) buff = new Uint8Array(len); + else buff = new BigBuffer(len); + buff.set(srcView, len - r); + r = r - l; + p++; + o = 0; + } + return buff; + } + set(buff, offset) { + if (offset === void 0) offset = 0; + const len = buff.byteLength; + if (len == 0) return; + const firstPage = Math.floor(offset / PAGE_SIZE); + if (firstPage == Math.floor((offset + len - 1) / PAGE_SIZE)) if (buff instanceof BigBuffer && buff.buffers.length == 1) return this.buffers[firstPage].set(buff.buffers[0], offset % PAGE_SIZE); + else return this.buffers[firstPage].set(buff, offset % PAGE_SIZE); + let p = firstPage; + let o = offset % PAGE_SIZE; + let r = len; + while (r > 0) { + const l = o + r > PAGE_SIZE ? PAGE_SIZE - o : r; + const srcView = buff.slice(len - r, len - r + l); + new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset + o, l).set(srcView); + r = r - l; + p++; + o = 0; + } + } +}; +//#endregion +//#region src/engine_batchconvert.js +function buildBatchConvert(tm, fnName, sIn, sOut) { + return async function batchConvert(buffIn) { + const nPoints = Math.floor(buffIn.byteLength / sIn); + if (nPoints * sIn !== buffIn.byteLength) throw new Error("Invalid buffer size"); + const pointsPerChunk = Math.floor(nPoints / tm.concurrency); + const opPromises = []; + for (let i = 0; i < tm.concurrency; i++) { + let n; + if (i < tm.concurrency - 1) n = pointsPerChunk; + else n = nPoints - i * pointsPerChunk; + if (n == 0) continue; + const buffChunk = buffIn.slice(i * pointsPerChunk * sIn, i * pointsPerChunk * sIn + n * sIn); + const task = [ + { + cmd: "ALLOCSET", + var: 0, + buff: buffChunk + }, + { + cmd: "ALLOC", + var: 1, + len: sOut * n + }, + { + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { val: n }, + { var: 1 } + ] + }, + { + cmd: "GET", + out: 0, + var: 1, + len: sOut * n + } + ]; + opPromises.push(tm.queueAction(task, [buffChunk.buffer])); + } + const result = await Promise.all(opPromises); + let fullBuffOut; + if (buffIn instanceof BigBuffer) fullBuffOut = new BigBuffer(nPoints * sOut); + else fullBuffOut = new Uint8Array(nPoints * sOut); + let p = 0; + for (let i = 0; i < result.length; i++) { + fullBuffOut.set(result[i][0], p); + p += result[i][0].byteLength; + } + return fullBuffOut; + }; +} +//#endregion +//#region src/wasm_field1.js +var WasmField1 = class { + constructor(tm, prefix, n8, p) { + this.tm = tm; + this.prefix = prefix; + this.p = p; + this.n8 = n8; + this.type = "F1"; + this.m = 1; + this.half = shiftRight(p, one); + this.bitLength = bitLength(p); + this.mask = sub(shiftLeft(one, this.bitLength), one); + this.pOp1 = tm.alloc(n8); + this.pOp2 = tm.alloc(n8); + this.pOp3 = tm.alloc(n8); + this.tm.instance.exports[prefix + "_zero"](this.pOp1); + this.zero = this.tm.getBuff(this.pOp1, this.n8); + this.tm.instance.exports[prefix + "_one"](this.pOp1); + this.one = this.tm.getBuff(this.pOp1, this.n8); + this.negone = this.neg(this.one); + this.two = this.add(this.one, this.one); + this.n64 = Math.floor(n8 / 8); + this.n32 = Math.floor(n8 / 4); + if (this.n64 * 8 != this.n8) throw new Error("n8 must be a multiple of 8"); + this.half = shiftRight(this.p, one); + this.nqr = this.two; + let r = this.exp(this.nqr, this.half); + while (!this.eq(r, this.negone)) { + this.nqr = this.add(this.nqr, this.one); + r = this.exp(this.nqr, this.half); + } + this.shift = this.mul(this.nqr, this.nqr); + this.shiftInv = this.inv(this.shift); + this.s = 0; + let t = sub(this.p, one); + while (!isOdd(t)) { + this.s = this.s + 1; + t = shiftRight(t, one); + } + this.w = []; + this.w[this.s] = this.exp(this.nqr, t); + for (let i = this.s - 1; i >= 0; i--) this.w[i] = this.square(this.w[i + 1]); + if (!this.eq(this.w[0], this.one)) throw new Error("Error calculating roots of unity"); + this.batchToMontgomery = buildBatchConvert(tm, prefix + "_batchToMontgomery", this.n8, this.n8); + this.batchFromMontgomery = buildBatchConvert(tm, prefix + "_batchFromMontgomery", this.n8, this.n8); + } + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op2Bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); + } + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } + add(a, b) { + return this.op2("_add", a, b); + } + eq(a, b) { + return this.op2Bool("_eq", a, b); + } + isZero(a) { + return this.op1Bool("_isZero", a); + } + sub(a, b) { + return this.op2("_sub", a, b); + } + neg(a) { + return this.op1("_neg", a); + } + inv(a) { + return this.op1("_inverse", a); + } + toMontgomery(a) { + return this.op1("_toMontgomery", a); + } + fromMontgomery(a) { + return this.op1("_fromMontgomery", a); + } + mul(a, b) { + return this.op2("_mul", a, b); + } + div(a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); + this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + square(a) { + return this.op1("_square", a); + } + isSquare(a) { + return this.op1Bool("_isSquare", a); + } + sqrt(a) { + return this.op1("_sqrt", a); + } + exp(a, b) { + if (!(b instanceof Uint8Array)) b = toLEBuff(e(b)); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_exp"](this.pOp1, this.pOp2, b.byteLength, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + isNegative(a) { + return this.op1Bool("_isNegative", a); + } + e(a, b) { + if (a instanceof Uint8Array) return a; + let ra = e(a, b); + if (isNegative(ra)) { + ra = neg(ra); + if (gt(ra, this.p)) ra = mod(ra, this.p); + ra = sub(this.p, ra); + } else if (gt(ra, this.p)) ra = mod(ra, this.p); + const buff = leInt2Buff(ra, this.n8); + return this.toMontgomery(buff); + } + toString(a, radix) { + return toString(fromRprLE(this.fromMontgomery(a), 0), radix); + } + fromRng(rng) { + let v; + const buff = new Uint8Array(this.n8); + do { + v = zero; + for (let i = 0; i < this.n64; i++) v = add(v, shiftLeft(rng.nextU64(), 64 * i)); + v = band(v, this.mask); + } while (geq(v, this.p)); + toRprLE(buff, 0, v, this.n8); + return buff; + } + random() { + return this.fromRng(getThreadRng()); + } + toObject(a) { + return fromRprLE(this.fromMontgomery(a), 0); + } + fromObject(a) { + const buff = new Uint8Array(this.n8); + toRprLE(buff, 0, a, this.n8); + return this.toMontgomery(buff); + } + toRprLE(buff, offset, a) { + buff.set(this.fromMontgomery(a), offset); + } + toRprBE(buff, offset, a) { + const buff2 = this.fromMontgomery(a); + for (let i = 0; i < this.n8 / 2; i++) { + const aux = buff2[i]; + buff2[i] = buff2[this.n8 - 1 - i]; + buff2[this.n8 - 1 - i] = aux; + } + buff.set(buff2, offset); + } + fromRprLE(buff, offset) { + offset = offset || 0; + const res = buff.slice(offset, offset + this.n8); + return this.toMontgomery(res); + } + async batchInverse(buffIn) { + let returnArray = false; + const sIn = this.n8; + const sOut = this.n8; + if (Array.isArray(buffIn)) { + buffIn = array2buffer(buffIn, sIn); + returnArray = true; + } else buffIn = buffIn.slice(0, buffIn.byteLength); + const nPoints = Math.floor(buffIn.byteLength / sIn); + if (nPoints * sIn !== buffIn.byteLength) throw new Error("Invalid buffer size"); + const pointsPerChunk = Math.floor(nPoints / this.tm.concurrency); + const opPromises = []; + for (let i = 0; i < this.tm.concurrency; i++) { + let n; + if (i < this.tm.concurrency - 1) n = pointsPerChunk; + else n = nPoints - i * pointsPerChunk; + if (n == 0) continue; + const buffChunk = buffIn.slice(i * pointsPerChunk * sIn, i * pointsPerChunk * sIn + n * sIn); + const task = [ + { + cmd: "ALLOCSET", + var: 0, + buff: buffChunk + }, + { + cmd: "ALLOC", + var: 1, + len: sOut * n + }, + { + cmd: "CALL", + fnName: this.prefix + "_batchInverse", + params: [ + { var: 0 }, + { val: sIn }, + { val: n }, + { var: 1 }, + { val: sOut } + ] + }, + { + cmd: "GET", + out: 0, + var: 1, + len: sOut * n + } + ]; + opPromises.push(this.tm.queueAction(task, [buffChunk.buffer])); + } + const result = await Promise.all(opPromises); + let fullBuffOut; + if (buffIn instanceof BigBuffer) fullBuffOut = new BigBuffer(nPoints * sOut); + else fullBuffOut = new Uint8Array(nPoints * sOut); + let p = 0; + for (let i = 0; i < result.length; i++) { + fullBuffOut.set(result[i][0], p); + p += result[i][0].byteLength; + } + if (returnArray) return buffer2array(fullBuffOut, sOut); + else return fullBuffOut; + } +}; +//#endregion +//#region src/wasm_field2.js +var WasmField2 = class { + constructor(tm, prefix, F) { + this.tm = tm; + this.prefix = prefix; + this.F = F; + this.type = "F2"; + this.m = F.m * 2; + this.n8 = this.F.n8 * 2; + this.n32 = this.F.n32 * 2; + this.n64 = this.F.n64 * 2; + this.pOp1 = tm.alloc(F.n8 * 2); + this.pOp2 = tm.alloc(F.n8 * 2); + this.pOp3 = tm.alloc(F.n8 * 2); + this.tm.instance.exports[prefix + "_zero"](this.pOp1); + this.zero = tm.getBuff(this.pOp1, this.n8); + this.tm.instance.exports[prefix + "_one"](this.pOp1); + this.one = tm.getBuff(this.pOp1, this.n8); + this.negone = this.neg(this.one); + this.two = this.add(this.one, this.one); + } + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op2Bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); + } + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } + add(a, b) { + return this.op2("_add", a, b); + } + eq(a, b) { + return this.op2Bool("_eq", a, b); + } + isZero(a) { + return this.op1Bool("_isZero", a); + } + sub(a, b) { + return this.op2("_sub", a, b); + } + neg(a) { + return this.op1("_neg", a); + } + inv(a) { + return this.op1("_inverse", a); + } + isNegative(a) { + return this.op1Bool("_isNegative", a); + } + toMontgomery(a) { + return this.op1("_toMontgomery", a); + } + fromMontgomery(a) { + return this.op1("_fromMontgomery", a); + } + mul(a, b) { + return this.op2("_mul", a, b); + } + mul1(a, b) { + return this.op2("_mul1", a, b); + } + div(a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); + this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + square(a) { + return this.op1("_square", a); + } + isSquare(a) { + return this.op1Bool("_isSquare", a); + } + sqrt(a) { + return this.op1("_sqrt", a); + } + exp(a, b) { + if (!(b instanceof Uint8Array)) b = toLEBuff(e(b)); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_exp"](this.pOp1, this.pOp2, b.byteLength, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + e(a, b) { + if (a instanceof Uint8Array) return a; + if (Array.isArray(a) && a.length == 2) { + const c1 = this.F.e(a[0], b); + const c2 = this.F.e(a[1], b); + const res = new Uint8Array(this.F.n8 * 2); + res.set(c1); + res.set(c2, this.F.n8 * 2); + return res; + } else throw new Error("invalid F2"); + } + toString(a, radix) { + return `[${this.F.toString(a.slice(0, this.F.n8), radix)}, ${this.F.toString(a.slice(this.F.n8), radix)}]`; + } + fromRng(rng) { + const c1 = this.F.fromRng(rng); + const c2 = this.F.fromRng(rng); + const res = new Uint8Array(this.F.n8 * 2); + res.set(c1); + res.set(c2, this.F.n8); + return res; + } + random() { + return this.fromRng(getThreadRng()); + } + toObject(a) { + return [this.F.toObject(a.slice(0, this.F.n8)), this.F.toObject(a.slice(this.F.n8, this.F.n8 * 2))]; + } + fromObject(a) { + const buff = new Uint8Array(this.F.n8 * 2); + const b1 = this.F.fromObject(a[0]); + const b2 = this.F.fromObject(a[1]); + buff.set(b1); + buff.set(b2, this.F.n8); + return buff; + } + c1(a) { + return a.slice(0, this.F.n8); + } + c2(a) { + return a.slice(this.F.n8); + } +}; +//#endregion +//#region src/wasm_field3.js +var WasmField3 = class { + constructor(tm, prefix, F) { + this.tm = tm; + this.prefix = prefix; + this.F = F; + this.type = "F3"; + this.m = F.m * 3; + this.n8 = this.F.n8 * 3; + this.n32 = this.F.n32 * 3; + this.n64 = this.F.n64 * 3; + this.pOp1 = tm.alloc(F.n8 * 3); + this.pOp2 = tm.alloc(F.n8 * 3); + this.pOp3 = tm.alloc(F.n8 * 3); + this.tm.instance.exports[prefix + "_zero"](this.pOp1); + this.zero = tm.getBuff(this.pOp1, this.n8); + this.tm.instance.exports[prefix + "_one"](this.pOp1); + this.one = tm.getBuff(this.pOp1, this.n8); + this.negone = this.neg(this.one); + this.two = this.add(this.one, this.one); + } + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op2Bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); + } + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } + eq(a, b) { + return this.op2Bool("_eq", a, b); + } + isZero(a) { + return this.op1Bool("_isZero", a); + } + add(a, b) { + return this.op2("_add", a, b); + } + sub(a, b) { + return this.op2("_sub", a, b); + } + neg(a) { + return this.op1("_neg", a); + } + inv(a) { + return this.op1("_inverse", a); + } + isNegative(a) { + return this.op1Bool("_isNegative", a); + } + toMontgomery(a) { + return this.op1("_toMontgomery", a); + } + fromMontgomery(a) { + return this.op1("_fromMontgomery", a); + } + mul(a, b) { + return this.op2("_mul", a, b); + } + div(a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); + this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + square(a) { + return this.op1("_square", a); + } + isSquare(a) { + return this.op1Bool("_isSquare", a); + } + sqrt(a) { + return this.op1("_sqrt", a); + } + exp(a, b) { + if (!(b instanceof Uint8Array)) b = toLEBuff(e(b)); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_exp"](this.pOp1, this.pOp2, b.byteLength, this.pOp3); + return this.getBuff(this.pOp3, this.n8); + } + e(a, b) { + if (a instanceof Uint8Array) return a; + if (Array.isArray(a) && a.length == 3) { + const c1 = this.F.e(a[0], b); + const c2 = this.F.e(a[1], b); + const c3 = this.F.e(a[2], b); + const res = new Uint8Array(this.F.n8 * 3); + res.set(c1); + res.set(c2, this.F.n8); + res.set(c3, this.F.n8 * 2); + return res; + } else throw new Error("invalid F3"); + } + toString(a, radix) { + return `[${this.F.toString(a.slice(0, this.F.n8), radix)}, ${this.F.toString(a.slice(this.F.n8, this.F.n8 * 2), radix)}, ${this.F.toString(a.slice(this.F.n8 * 2), radix)}]`; + } + fromRng(rng) { + const c1 = this.F.fromRng(rng); + const c2 = this.F.fromRng(rng); + const c3 = this.F.fromRng(rng); + const res = new Uint8Array(this.F.n8 * 3); + res.set(c1); + res.set(c2, this.F.n8); + res.set(c3, this.F.n8 * 2); + return res; + } + random() { + return this.fromRng(getThreadRng()); + } + toObject(a) { + return [ + this.F.toObject(a.slice(0, this.F.n8)), + this.F.toObject(a.slice(this.F.n8, this.F.n8 * 2)), + this.F.toObject(a.slice(this.F.n8 * 2, this.F.n8 * 3)) + ]; + } + fromObject(a) { + const buff = new Uint8Array(this.F.n8 * 3); + const b1 = this.F.fromObject(a[0]); + const b2 = this.F.fromObject(a[1]); + const b3 = this.F.fromObject(a[2]); + buff.set(b1); + buff.set(b2, this.F.n8); + buff.set(b3, this.F.n8 * 2); + return buff; + } + c1(a) { + return a.slice(0, this.F.n8); + } + c2(a) { + return a.slice(this.F.n8, this.F.n8 * 2); + } + c3(a) { + return a.slice(this.F.n8 * 2); + } +}; +//#endregion +//#region src/wasm_curve.js +var WasmCurve = class { + constructor(tm, prefix, F, pGen, pGb, cofactor) { + this.tm = tm; + this.prefix = prefix; + this.F = F; + this.pOp1 = tm.alloc(F.n8 * 3); + this.pOp2 = tm.alloc(F.n8 * 3); + this.pOp3 = tm.alloc(F.n8 * 3); + this.tm.instance.exports[prefix + "_zero"](this.pOp1); + this.zero = this.tm.getBuff(this.pOp1, F.n8 * 3); + this.tm.instance.exports[prefix + "_zeroAffine"](this.pOp1); + this.zeroAffine = this.tm.getBuff(this.pOp1, F.n8 * 2); + this.one = this.tm.getBuff(pGen, F.n8 * 3); + this.g = this.one; + this.oneAffine = this.tm.getBuff(pGen, F.n8 * 2); + this.gAffine = this.oneAffine; + this.b = this.tm.getBuff(pGb, F.n8); + if (cofactor) this.cofactor = toLEBuff(cofactor); + this.negone = this.neg(this.one); + this.two = this.add(this.one, this.one); + this.batchLEMtoC = buildBatchConvert(tm, prefix + "_batchLEMtoC", F.n8 * 2, F.n8); + this.batchLEMtoU = buildBatchConvert(tm, prefix + "_batchLEMtoU", F.n8 * 2, F.n8 * 2); + this.batchCtoLEM = buildBatchConvert(tm, prefix + "_batchCtoLEM", F.n8, F.n8 * 2); + this.batchUtoLEM = buildBatchConvert(tm, prefix + "_batchUtoLEM", F.n8 * 2, F.n8 * 2); + this.batchToJacobian = buildBatchConvert(tm, prefix + "_batchToJacobian", F.n8 * 2, F.n8 * 3); + this.batchToAffine = buildBatchConvert(tm, prefix + "_batchToAffine", F.n8 * 3, F.n8 * 2); + } + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 3); + } + op2bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + } + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 3); + } + op1Affine(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 2); + } + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } + add(a, b) { + if (a.byteLength == this.F.n8 * 3) if (b.byteLength == this.F.n8 * 3) return this.op2("_add", a, b); + else if (b.byteLength == this.F.n8 * 2) return this.op2("_addMixed", a, b); + else throw new Error("invalid point size"); + else if (a.byteLength == this.F.n8 * 2) if (b.byteLength == this.F.n8 * 3) return this.op2("_addMixed", b, a); + else if (b.byteLength == this.F.n8 * 2) return this.op2("_addAffine", a, b); + else throw new Error("invalid point size"); + else throw new Error("invalid point size"); + } + sub(a, b) { + if (a.byteLength == this.F.n8 * 3) if (b.byteLength == this.F.n8 * 3) return this.op2("_sub", a, b); + else if (b.byteLength == this.F.n8 * 2) return this.op2("_subMixed", a, b); + else throw new Error("invalid point size"); + else if (a.byteLength == this.F.n8 * 2) if (b.byteLength == this.F.n8 * 3) return this.op2("_subMixed", b, a); + else if (b.byteLength == this.F.n8 * 2) return this.op2("_subAffine", a, b); + else throw new Error("invalid point size"); + else throw new Error("invalid point size"); + } + neg(a) { + if (a.byteLength == this.F.n8 * 3) return this.op1("_neg", a); + else if (a.byteLength == this.F.n8 * 2) return this.op1Affine("_negAffine", a); + else throw new Error("invalid point size"); + } + double(a) { + if (a.byteLength == this.F.n8 * 3) return this.op1("_double", a); + else if (a.byteLength == this.F.n8 * 2) return this.op1("_doubleAffine", a); + else throw new Error("invalid point size"); + } + isZero(a) { + if (a.byteLength == this.F.n8 * 3) return this.op1Bool("_isZero", a); + else if (a.byteLength == this.F.n8 * 2) return this.op1Bool("_isZeroAffine", a); + else throw new Error("invalid point size"); + } + timesScalar(a, s) { + if (!(s instanceof Uint8Array)) s = toLEBuff(e(s)); + let fnName; + if (a.byteLength == this.F.n8 * 3) fnName = this.prefix + "_timesScalar"; + else if (a.byteLength == this.F.n8 * 2) fnName = this.prefix + "_timesScalarAffine"; + else throw new Error("invalid point size"); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, s); + this.tm.instance.exports[fnName](this.pOp1, this.pOp2, s.byteLength, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 3); + } + timesFr(a, s) { + let fnName; + if (a.byteLength == this.F.n8 * 3) fnName = this.prefix + "_timesFr"; + else if (a.byteLength == this.F.n8 * 2) fnName = this.prefix + "_timesFrAffine"; + else throw new Error("invalid point size"); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, s); + this.tm.instance.exports[fnName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 3); + } + eq(a, b) { + if (a.byteLength == this.F.n8 * 3) if (b.byteLength == this.F.n8 * 3) return this.op2bool("_eq", a, b); + else if (b.byteLength == this.F.n8 * 2) return this.op2bool("_eqMixed", a, b); + else throw new Error("invalid point size"); + else if (a.byteLength == this.F.n8 * 2) if (b.byteLength == this.F.n8 * 3) return this.op2bool("_eqMixed", b, a); + else if (b.byteLength == this.F.n8 * 2) return this.op2bool("_eqAffine", a, b); + else throw new Error("invalid point size"); + else throw new Error("invalid point size"); + } + toAffine(a) { + if (a.byteLength == this.F.n8 * 3) return this.op1Affine("_toAffine", a); + else if (a.byteLength == this.F.n8 * 2) return a; + else throw new Error("invalid point size"); + } + toJacobian(a) { + if (a.byteLength == this.F.n8 * 3) return a; + else if (a.byteLength == this.F.n8 * 2) return this.op1("_toJacobian", a); + else throw new Error("invalid point size"); + } + toRprUncompressed(arr, offset, a) { + this.tm.setBuff(this.pOp1, a); + if (a.byteLength == this.F.n8 * 3) this.tm.instance.exports[this.prefix + "_toAffine"](this.pOp1, this.pOp1); + else if (a.byteLength != this.F.n8 * 2) throw new Error("invalid point size"); + this.tm.instance.exports[this.prefix + "_LEMtoU"](this.pOp1, this.pOp1); + const res = this.tm.getBuff(this.pOp1, this.F.n8 * 2); + arr.set(res, offset); + } + fromRprUncompressed(arr, offset) { + const buff = arr.slice(offset, offset + this.F.n8 * 2); + this.tm.setBuff(this.pOp1, buff); + this.tm.instance.exports[this.prefix + "_UtoLEM"](this.pOp1, this.pOp1); + return this.tm.getBuff(this.pOp1, this.F.n8 * 2); + } + toRprCompressed(arr, offset, a) { + this.tm.setBuff(this.pOp1, a); + if (a.byteLength == this.F.n8 * 3) this.tm.instance.exports[this.prefix + "_toAffine"](this.pOp1, this.pOp1); + else if (a.byteLength != this.F.n8 * 2) throw new Error("invalid point size"); + this.tm.instance.exports[this.prefix + "_LEMtoC"](this.pOp1, this.pOp1); + const res = this.tm.getBuff(this.pOp1, this.F.n8); + arr.set(res, offset); + } + fromRprCompressed(arr, offset) { + const buff = arr.slice(offset, offset + this.F.n8); + this.tm.setBuff(this.pOp1, buff); + this.tm.instance.exports[this.prefix + "_CtoLEM"](this.pOp1, this.pOp2); + return this.tm.getBuff(this.pOp2, this.F.n8 * 2); + } + toUncompressed(a) { + const buff = new Uint8Array(this.F.n8 * 2); + this.toRprUncompressed(buff, 0, a); + return buff; + } + toRprLEM(arr, offset, a) { + if (a.byteLength == this.F.n8 * 2) { + arr.set(a, offset); + return; + } else if (a.byteLength == this.F.n8 * 3) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + "_toAffine"](this.pOp1, this.pOp1); + const res = this.tm.getBuff(this.pOp1, this.F.n8 * 2); + arr.set(res, offset); + } else throw new Error("invalid point size"); + } + fromRprLEM(arr, offset) { + offset = offset || 0; + return arr.slice(offset, offset + this.F.n8 * 2); + } + toString(a, radix) { + if (a.byteLength == this.F.n8 * 3) return `[ ${this.F.toString(a.slice(0, this.F.n8), radix)}, ${this.F.toString(a.slice(this.F.n8, this.F.n8 * 2), radix)}, ${this.F.toString(a.slice(this.F.n8 * 2), radix)} ]`; + else if (a.byteLength == this.F.n8 * 2) return `[ ${this.F.toString(a.slice(0, this.F.n8), radix)}, ${this.F.toString(a.slice(this.F.n8), radix)} ]`; + else throw new Error("invalid point size"); + } + isValid(a) { + if (this.isZero(a)) return true; + const F = this.F; + const aa = this.toAffine(a); + const x = aa.slice(0, this.F.n8); + const y = aa.slice(this.F.n8, this.F.n8 * 2); + const x3b = F.add(F.mul(F.square(x), x), this.b); + const y2 = F.square(y); + return F.eq(x3b, y2); + } + fromRng(rng) { + const F = this.F; + let P = []; + let greatest; + let x3b; + do { + P[0] = F.fromRng(rng); + greatest = rng.nextBool(); + x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); + } while (!F.isSquare(x3b)); + P[1] = F.sqrt(x3b); + const s = F.isNegative(P[1]); + if (greatest ^ s) P[1] = F.neg(P[1]); + let Pbuff = new Uint8Array(this.F.n8 * 2); + Pbuff.set(P[0]); + Pbuff.set(P[1], this.F.n8); + if (this.cofactor) Pbuff = this.timesScalar(Pbuff, this.cofactor); + return Pbuff; + } + toObject(a) { + if (this.isZero(a)) return [ + this.F.toObject(this.F.zero), + this.F.toObject(this.F.one), + this.F.toObject(this.F.zero) + ]; + const x = this.F.toObject(a.slice(0, this.F.n8)); + const y = this.F.toObject(a.slice(this.F.n8, this.F.n8 * 2)); + let z; + if (a.byteLength == this.F.n8 * 3) z = this.F.toObject(a.slice(this.F.n8 * 2, this.F.n8 * 3)); + else z = this.F.toObject(this.F.one); + return [ + x, + y, + z + ]; + } + fromObject(a) { + const x = this.F.fromObject(a[0]); + const y = this.F.fromObject(a[1]); + let z; + if (a.length == 3) z = this.F.fromObject(a[2]); + else z = this.F.one; + if (this.F.isZero(z, this.F.one)) return this.zeroAffine; + else if (this.F.eq(z, this.F.one)) { + const buff = new Uint8Array(this.F.n8 * 2); + buff.set(x); + buff.set(y, this.F.n8); + return buff; + } else { + const buff = new Uint8Array(this.F.n8 * 3); + buff.set(x); + buff.set(y, this.F.n8); + buff.set(z, this.F.n8 * 2); + return buff; + } + } + e(a) { + if (a instanceof Uint8Array) return a; + return this.fromObject(a); + } + x(a) { + return this.toAffine(a).slice(0, this.F.n8); + } + y(a) { + return this.toAffine(a).slice(this.F.n8); + } +}; +//#endregion +//#region src/threadman_thread.js +/** +* Worker task logic used by workerpool. +* +* This module exports a plain function that encapsulates all wasm helper +* utilities (alloc, runTask, init). The function can be: +* 1. Called directly in single-thread mode (returns the runTask function). +* 2. Stringified and embedded into a workerpool worker script for +* multi-thread mode (browser or Node.js). +* +* The exported function accepts no arguments when used as factory and returns +* the runTask function, which can then be registered with workerpool.worker(). +*/ +function thread() { + const MAXMEM = 32767; + let instance; + let memory; + let _u32 = null; + let _u8 = null; + function getU32() { + if (_u32 === null || _u32.buffer !== memory.buffer) _u32 = new Uint32Array(memory.buffer, 0, 1); + return _u32; + } + function getU8() { + if (_u8 === null || _u8.buffer !== memory.buffer) _u8 = new Uint8Array(memory.buffer); + return _u8; + } + async function init(data) { + let wasmModule; + if (data.code instanceof WebAssembly.Module) wasmModule = data.code; + else wasmModule = await WebAssembly.compile(new Uint8Array(data.code)); + memory = new WebAssembly.Memory({ + initial: data.init, + maximum: MAXMEM + }); + _u32 = null; + _u8 = null; + instance = await WebAssembly.instantiate(wasmModule, { env: { memory } }); + } + function alloc(length) { + const u32 = getU32(); + u32[0] = u32[0] + 3 & -4; + const res = u32[0]; + u32[0] += length; + if (u32[0] + length > memory.buffer.byteLength) { + const currentPages = memory.buffer.byteLength / 65536; + let requiredPages = Math.floor((u32[0] + length) / 65536) + 1; + if (requiredPages > MAXMEM) requiredPages = MAXMEM; + memory.grow(requiredPages - currentPages); + } + return res; + } + function allocBuffer(buffer) { + const src = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer); + const p = alloc(src.byteLength); + getU8().set(src, p); + return p; + } + function getBuffer(pointer, length) { + return new Uint8Array(memory.buffer, pointer, length); + } + function setBuffer(pointer, buffer) { + getU8().set(buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer), pointer); + } + function runTask(task) { + if (task[0].cmd === "INIT") return init(task[0]); + const vars = []; + const out = []; + const oldAlloc = getU32()[0]; + for (let i = 0; i < task.length; i++) { + const step = task[i]; + switch (step.cmd) { + case "ALLOCSET": + vars[step.var] = allocBuffer(step.buff); + break; + case "ALLOC": + vars[step.var] = alloc(step.len); + break; + case "SET": + setBuffer(vars[step.var], step.buff); + break; + case "CALL": { + const paramDefs = step.params; + const params = new Array(paramDefs.length); + for (let j = 0; j < paramDefs.length; j++) { + const p = paramDefs[j]; + params[j] = p.var !== void 0 ? vars[p.var] + (p.offset || 0) : p.val; + } + instance.exports[step.fnName](...params); + break; + } + case "GET": + out[step.out] = getBuffer(vars[step.var], step.len).slice(); + break; + default: throw new Error("Invalid cmd: " + step.cmd); + } + } + getU32()[0] = oldAlloc; + return out; + } + return runTask; +} +//#endregion +//#region \0virtual:worker-script +var import_workerpool = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((exports, module) => { + /** + * workerpool.js + * https://github.com/josdejong/workerpool + * + * Offload tasks to a pool of workers on node.js and in the browser. + * + * @version 10.0.1 + * @date 2025-11-19 + * + * @license + * Copyright (C) 2014-2022 Jos de Jong + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + (function(global, factory) { + typeof exports === "object" && typeof module !== "undefined" ? factory(exports) : typeof define === "function" && define.amd ? define(["exports"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global.workerpool = {})); + })(exports, (function(exports$2) { + "use strict"; + var src = {}; + var environment$1 = { exports: {} }; + (function(module$1) { + var isNode = function isNode(nodeProcess) { + return typeof nodeProcess !== "undefined" && nodeProcess.versions != null && nodeProcess.versions.node != null && nodeProcess + "" === "[object process]"; + }; + module$1.exports.isNode = isNode; + module$1.exports.platform = typeof process !== "undefined" && isNode(process) ? "node" : "browser"; + var worker_threads = module$1.exports.platform === "node" && require___vite_browser_external(); + module$1.exports.isMainThread = module$1.exports.platform === "node" ? (!worker_threads || worker_threads.isMainThread) && !process.connected : typeof Window !== "undefined"; + module$1.exports.cpus = module$1.exports.platform === "browser" ? self.navigator.hardwareConcurrency : require___vite_browser_external().cpus().length; + })(environment$1); + var environmentExports = environment$1.exports; + function _arrayLikeToArray(r, a) { + (null == a || a > r.length) && (a = r.length); + for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; + return n; + } + function _assertThisInitialized(e) { + if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + return e; + } + function _callSuper(t, o, e) { + return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); + } + function _classCallCheck(a, n) { + if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); + } + function _construct(t, e, r) { + if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); + var o = [null]; + o.push.apply(o, e); + var p = new (t.bind.apply(t, o))(); + return r && _setPrototypeOf(p, r.prototype), p; + } + function _createClass(e, r, t) { + return Object.defineProperty(e, "prototype", { writable: false }), e; + } + function _createForOfIteratorHelper(r, e) { + var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; + if (!t) { + if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) { + t && (r = t); + var n = 0, F = function() {}; + return { + s: F, + n: function() { + return n >= r.length ? { done: true } : { + done: false, + value: r[n++] + }; + }, + e: function(r) { + throw r; + }, + f: F + }; + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + var o, a = true, u = false; + return { + s: function() { + t = t.call(r); + }, + n: function() { + var r = t.next(); + return a = r.done, r; + }, + e: function(r) { + u = true, o = r; + }, + f: function() { + try { + a || null == t.return || t.return(); + } finally { + if (u) throw o; + } + } + }; + } + function _defineProperty(e, r, t) { + return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { + value: t, + enumerable: true, + configurable: true, + writable: true + }) : e[r] = t, e; + } + function _getPrototypeOf(t) { + return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function(t) { + return t.__proto__ || Object.getPrototypeOf(t); + }, _getPrototypeOf(t); + } + function _inherits(t, e) { + if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); + t.prototype = Object.create(e && e.prototype, { constructor: { + value: t, + writable: true, + configurable: true + } }), Object.defineProperty(t, "prototype", { writable: false }), e && _setPrototypeOf(t, e); + } + function _isNativeFunction(t) { + try { + return -1 !== Function.toString.call(t).indexOf("[native code]"); + } catch (n) { + return "function" == typeof t; + } + } + function _isNativeReflectConstruct() { + try { + var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {})); + } catch (t) {} + return (_isNativeReflectConstruct = function() { + return !!t; + })(); + } + function ownKeys(e, r) { + var t = Object.keys(e); + if (Object.getOwnPropertySymbols) { + var o = Object.getOwnPropertySymbols(e); + r && (o = o.filter(function(r) { + return Object.getOwnPropertyDescriptor(e, r).enumerable; + })), t.push.apply(t, o); + } + return t; + } + function _objectSpread2(e) { + for (var r = 1; r < arguments.length; r++) { + var t = null != arguments[r] ? arguments[r] : {}; + r % 2 ? ownKeys(Object(t), true).forEach(function(r) { + _defineProperty(e, r, t[r]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r) { + Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); + }); + } + return e; + } + function _possibleConstructorReturn(t, e) { + if (e && ("object" == typeof e || "function" == typeof e)) return e; + if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); + return _assertThisInitialized(t); + } + function _setPrototypeOf(t, e) { + return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function(t, e) { + return t.__proto__ = e, t; + }, _setPrototypeOf(t, e); + } + function _toPrimitive(t, r) { + if ("object" != typeof t || !t) return t; + var e = t[Symbol.toPrimitive]; + if (void 0 !== e) { + var i = e.call(t, r); + if ("object" != typeof i) return i; + throw new TypeError("@@toPrimitive must return a primitive value."); + } + return ("string" === r ? String : Number)(t); + } + function _toPropertyKey(t) { + var i = _toPrimitive(t, "string"); + return "symbol" == typeof i ? i : i + ""; + } + function _typeof(o) { + "@babel/helpers - typeof"; + return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) { + return typeof o; + } : function(o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; + }, _typeof(o); + } + function _unsupportedIterableToArray(r, a) { + if (r) { + if ("string" == typeof r) return _arrayLikeToArray(r, a); + var t = {}.toString.call(r).slice(8, -1); + return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; + } + } + function _wrapNativeSuper(t) { + var r = "function" == typeof Map ? /* @__PURE__ */ new Map() : void 0; + return _wrapNativeSuper = function(t) { + if (null === t || !_isNativeFunction(t)) return t; + if ("function" != typeof t) throw new TypeError("Super expression must either be null or a function"); + if (void 0 !== r) { + if (r.has(t)) return r.get(t); + r.set(t, Wrapper); + } + function Wrapper() { + return _construct(t, arguments, _getPrototypeOf(this).constructor); + } + return Wrapper.prototype = Object.create(t.prototype, { constructor: { + value: Wrapper, + enumerable: false, + writable: true, + configurable: true + } }), _setPrototypeOf(Wrapper, t); + }, _wrapNativeSuper(t); + } + var WorkerHandler$1 = { exports: {} }; + var _Promise$1 = {}; + var hasRequired_Promise; + function require_Promise() { + if (hasRequired_Promise) return _Promise$1; + hasRequired_Promise = 1; + /** + * Promise + * + * Inspired by https://gist.github.com/RubaXa/8501359 from RubaXa + * @template T + * @template [E=Error] + * @param {Function} handler Called as handler(resolve: Function, reject: Function) + * @param {Promise} [parent] Parent promise for propagation of cancel and timeout + */ + function Promise(handler, parent) { + var me = this; + if (!(this instanceof Promise)) throw new SyntaxError("Constructor must be called with the new operator"); + if (typeof handler !== "function") throw new SyntaxError("Function parameter handler(resolve, reject) missing"); + var _onSuccess = []; + var _onFail = []; + /** + * @readonly + */ + this.resolved = false; + /** + * @readonly + */ + this.rejected = false; + /** + * @readonly + */ + this.pending = true; + /** + * @readonly + */ + this[Symbol.toStringTag] = "Promise"; + /** + * Process onSuccess and onFail callbacks: add them to the queue. + * Once the promise is resolved, the function _promise is replace. + * @param {Function} onSuccess + * @param {Function} onFail + * @private + */ + var _process = function _process(onSuccess, onFail) { + _onSuccess.push(onSuccess); + _onFail.push(onFail); + }; + /** + * Add an onSuccess callback and optionally an onFail callback to the Promise + * @template TT + * @template [TE=never] + * @param {(r: T) => TT | PromiseLike} onSuccess + * @param {(r: E) => TE | PromiseLike} [onFail] + * @returns {Promise} promise + */ + this.then = function(onSuccess, onFail) { + return new Promise(function(resolve, reject) { + var s = onSuccess ? _then(onSuccess, resolve, reject) : resolve; + var f = onFail ? _then(onFail, resolve, reject) : reject; + _process(s, f); + }, me); + }; + /** + * Resolve the promise + * @param {*} result + * @type {Function} + */ + var _resolve2 = function _resolve(result) { + me.resolved = true; + me.rejected = false; + me.pending = false; + _onSuccess.forEach(function(fn) { + fn(result); + }); + _process = function _process(onSuccess, onFail) { + onSuccess(result); + }; + _resolve2 = _reject2 = function _reject() {}; + return me; + }; + /** + * Reject the promise + * @param {Error} error + * @type {Function} + */ + var _reject2 = function _reject(error) { + me.resolved = false; + me.rejected = true; + me.pending = false; + _onFail.forEach(function(fn) { + fn(error); + }); + _process = function _process(onSuccess, onFail) { + onFail(error); + }; + _resolve2 = _reject2 = function _reject() {}; + return me; + }; + /** + * Cancel the promise. This will reject the promise with a CancellationError + * @returns {this} self + */ + this.cancel = function() { + if (parent) parent.cancel(); + else _reject2(new CancellationError()); + return me; + }; + /** + * Set a timeout for the promise. If the promise is not resolved within + * the time, the promise will be cancelled and a TimeoutError is thrown. + * If the promise is resolved in time, the timeout is removed. + * @param {number} delay Delay in milliseconds + * @returns {this} self + */ + this.timeout = function(delay) { + if (parent) parent.timeout(delay); + else { + var timer = setTimeout(function() { + _reject2(new TimeoutError("Promise timed out after " + delay + " ms")); + }, delay); + me.always(function() { + clearTimeout(timer); + }); + } + return me; + }; + handler(function(result) { + _resolve2(result); + }, function(error) { + _reject2(error); + }); + } + /** + * Execute given callback, then call resolve/reject based on the returned result + * @param {Function} callback + * @param {Function} resolve + * @param {Function} reject + * @returns {Function} + * @private + */ + function _then(callback, resolve, reject) { + return function(result) { + try { + var res = callback(result); + if (res && typeof res.then === "function" && typeof res["catch"] === "function") res.then(resolve, reject); + else resolve(res); + } catch (error) { + reject(error); + } + }; + } + /** + * Add an onFail callback to the Promise + * @template TT + * @param {(error: E) => TT | PromiseLike} onFail + * @returns {Promise} promise + */ + Promise.prototype["catch"] = function(onFail) { + return this.then(null, onFail); + }; + /** + * Execute given callback when the promise either resolves or rejects. + * @template TT + * @param {() => Promise} fn + * @returns {Promise} promise + */ + Promise.prototype.always = function(fn) { + return this.then(fn, fn); + }; + /** + * Execute given callback when the promise either resolves or rejects. + * Same semantics as Node's Promise.finally() + * @param {Function | null | undefined} [fn] + * @returns {Promise} promise + */ + Promise.prototype.finally = function(fn) { + var me = this; + var final = function final() { + return new Promise(function(resolve) { + return resolve(); + }).then(fn).then(function() { + return me; + }); + }; + return this.then(final, final); + }; + /** + * Create a promise which resolves when all provided promises are resolved, + * and fails when any of the promises resolves. + * @param {Promise[]} promises + * @returns {Promise} promise + */ + Promise.all = function(promises) { + return new Promise(function(resolve, reject) { + var remaining = promises.length, results = []; + if (remaining) promises.forEach(function(p, i) { + p.then(function(result) { + results[i] = result; + remaining--; + if (remaining == 0) resolve(results); + }, function(error) { + remaining = 0; + reject(error); + }); + }); + else resolve(results); + }); + }; + /** + * Create a promise resolver + * @returns {import('./types.js').Resolver} resolver + */ + Promise.defer = function() { + var resolver = {}; + resolver.promise = new Promise(function(resolve, reject) { + resolver.resolve = resolve; + resolver.reject = reject; + }); + return resolver; + }; + /** + * Create a cancellation error + * @param {String} [message] + * @extends Error + */ + function CancellationError(message) { + this.message = message || "promise cancelled"; + this.stack = (/* @__PURE__ */ new Error()).stack; + } + CancellationError.prototype = /* @__PURE__ */ new Error(); + CancellationError.prototype.constructor = Error; + CancellationError.prototype.name = "CancellationError"; + Promise.CancellationError = CancellationError; + /** + * Create a timeout error + * @param {String} [message] + * @extends Error + */ + function TimeoutError(message) { + this.message = message || "timeout exceeded"; + this.stack = (/* @__PURE__ */ new Error()).stack; + } + TimeoutError.prototype = /* @__PURE__ */ new Error(); + TimeoutError.prototype.constructor = Error; + TimeoutError.prototype.name = "TimeoutError"; + Promise.TimeoutError = TimeoutError; + _Promise$1.Promise = Promise; + return _Promise$1; + } + var validateOptions$1 = {}; + /** + * Validate that the object only contains known option names + * - Throws an error when unknown options are detected + * - Throws an error when some of the allowed options are attached + * @param {Object | undefined} options + * @param {string[]} allowedOptionNames + * @param {string} objectName + * @retrun {Object} Returns the original options + */ + validateOptions$1.validateOptions = function validateOptions(options, allowedOptionNames, objectName) { + if (!options) return; + var optionNames = options ? Object.keys(options) : []; + var unknownOptionName = optionNames.find(function(optionName) { + return !allowedOptionNames.includes(optionName); + }); + if (unknownOptionName) throw new Error("Object \"" + objectName + "\" contains an unknown option \"" + unknownOptionName + "\""); + var illegalOptionName = allowedOptionNames.find(function(allowedOptionName) { + return Object.prototype[allowedOptionName] && !optionNames.includes(allowedOptionName); + }); + if (illegalOptionName) throw new Error("Object \"" + objectName + "\" contains an inherited option \"" + illegalOptionName + "\" which is not defined in the object itself but in its prototype. Only plain objects are allowed. Please remove the option from the prototype or override it with a value \"undefined\"."); + return options; + }; + validateOptions$1.workerOptsNames = [ + "credentials", + "name", + "type" + ]; + validateOptions$1.forkOptsNames = [ + "cwd", + "detached", + "env", + "execPath", + "execArgv", + "gid", + "serialization", + "signal", + "killSignal", + "silent", + "stdio", + "uid", + "windowsVerbatimArguments", + "timeout" + ]; + validateOptions$1.workerThreadOptsNames = [ + "argv", + "env", + "eval", + "execArgv", + "stdin", + "stdout", + "stderr", + "workerData", + "trackUnmanagedFds", + "transferList", + "resourceLimits", + "name" + ]; + /** + * embeddedWorker.js contains an embedded version of worker.js. + * This file is automatically generated, + * changes made in this file will be overwritten. + */ + var embeddedWorker; + var hasRequiredEmbeddedWorker; + function requireEmbeddedWorker() { + if (hasRequiredEmbeddedWorker) return embeddedWorker; + hasRequiredEmbeddedWorker = 1; + embeddedWorker = "!function(e,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).worker=n()}(this,(function(){\"use strict\";function e(n){return e=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},e(n)}function n(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}var t={};var r=function(e,n){this.message=e,this.transfer=n},o={};function i(e,n){var t=this;if(!(this instanceof i))throw new SyntaxError(\"Constructor must be called with the new operator\");if(\"function\"!=typeof e)throw new SyntaxError(\"Function parameter handler(resolve, reject) missing\");var r=[],o=[];this.resolved=!1,this.rejected=!1,this.pending=!0,this[Symbol.toStringTag]=\"Promise\";var a=function(e,n){r.push(e),o.push(n)};this.then=function(e,n){return new i((function(t,r){var o=e?s(e,t,r):t,i=n?s(n,t,r):r;a(o,i)}),t)};var f=function(e){return t.resolved=!0,t.rejected=!1,t.pending=!1,r.forEach((function(n){n(e)})),a=function(n,t){n(e)},f=d=function(){},t},d=function(e){return t.resolved=!1,t.rejected=!0,t.pending=!1,o.forEach((function(n){n(e)})),a=function(n,t){t(e)},f=d=function(){},t};this.cancel=function(){return n?n.cancel():d(new u),t},this.timeout=function(e){if(n)n.timeout(e);else{var r=setTimeout((function(){d(new c(\"Promise timed out after \"+e+\" ms\"))}),e);t.always((function(){clearTimeout(r)}))}return t},e((function(e){f(e)}),(function(e){d(e)}))}function s(e,n,t){return function(r){try{var o=e(r);o&&\"function\"==typeof o.then&&\"function\"==typeof o.catch?o.then(n,t):n(o)}catch(e){t(e)}}}function u(e){this.message=e||\"promise cancelled\",this.stack=(new Error).stack}function c(e){this.message=e||\"timeout exceeded\",this.stack=(new Error).stack}return i.prototype.catch=function(e){return this.then(null,e)},i.prototype.always=function(e){return this.then(e,e)},i.prototype.finally=function(e){var n=this,t=function(){return new i((function(e){return e()})).then(e).then((function(){return n}))};return this.then(t,t)},i.all=function(e){return new i((function(n,t){var r=e.length,o=[];r?e.forEach((function(e,i){e.then((function(e){o[i]=e,0==--r&&n(o)}),(function(e){r=0,t(e)}))})):n(o)}))},i.defer=function(){var e={};return e.promise=new i((function(n,t){e.resolve=n,e.reject=t})),e},u.prototype=new Error,u.prototype.constructor=Error,u.prototype.name=\"CancellationError\",i.CancellationError=u,c.prototype=new Error,c.prototype.constructor=Error,c.prototype.name=\"TimeoutError\",i.TimeoutError=c,o.Promise=i,function(n){var t=r,i=o.Promise,s=\"__workerpool-cleanup__\",u={exit:function(){}},c={addAbortListener:function(e){u.abortListeners.push(e)},emit:u.emit};if(\"undefined\"!=typeof self&&\"function\"==typeof postMessage&&\"function\"==typeof addEventListener)u.on=function(e,n){addEventListener(e,(function(e){n(e.data)}))},u.send=function(e,n){n?postMessage(e,n):postMessage(e)};else{if(\"undefined\"==typeof process)throw new Error(\"Script must be executed as a worker\");var a;try{a=require(\"worker_threads\")}catch(n){if(\"object\"!==e(n)||null===n||\"MODULE_NOT_FOUND\"!==n.code)throw n}if(a&&null!==a.parentPort){var f=a.parentPort;u.send=f.postMessage.bind(f),u.on=f.on.bind(f),u.exit=process.exit.bind(process)}else u.on=process.on.bind(process),u.send=function(e){process.send(e)},u.on(\"disconnect\",(function(){process.exit(1)})),u.exit=process.exit.bind(process)}function d(e){return e&&e.toJSON?JSON.parse(JSON.stringify(e)):JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}function l(e){return e&&\"function\"==typeof e.then&&\"function\"==typeof e.catch}u.methods={},u.methods.run=function(e,n){var t=new Function(\"return (\"+e+\").apply(this, arguments);\");return t.worker=c,t.apply(t,n)},u.methods.methods=function(){return Object.keys(u.methods)},u.terminationHandler=void 0,u.abortListenerTimeout=1e3,u.abortListeners=[],u.terminateAndExit=function(e){var n=function(){u.exit(e)};if(!u.terminationHandler)return n();var t=u.terminationHandler(e);return l(t)?(t.then(n,n),t):(n(),new i((function(e,n){n(new Error(\"Worker terminating\"))})))},u.cleanup=function(e){if(!u.abortListeners.length)return u.send({id:e,method:s,error:d(new Error(\"Worker terminating\"))}),new i((function(e){e()}));var n,t=u.abortListeners.map((function(e){return e()})),r=new i((function(e,t){n=setTimeout((function(){t(new Error(\"Timeout occured waiting for abort handler, killing worker\"))}),u.abortListenerTimeout)})),o=i.all(t).then((function(){clearTimeout(n),u.abortListeners.length||(u.abortListeners=[])}),(function(){clearTimeout(n),u.exit()}));return new i((function(e,n){o.then(e,n),r.then(e,n)})).then((function(){u.send({id:e,method:s,error:null})}),(function(n){u.send({id:e,method:s,error:n?d(n):null})}))};var p=null;u.on(\"message\",(function(e){if(\"__workerpool-terminate__\"===e)return u.terminateAndExit(0);if(e.method===s)return u.cleanup(e.id);try{var n=u.methods[e.method];if(!n)throw new Error('Unknown method \"'+e.method+'\"');p=e.id;var r=n.apply(n,e.params);l(r)?r.then((function(n){n instanceof t?u.send({id:e.id,result:n.message,error:null},n.transfer):u.send({id:e.id,result:n,error:null}),p=null})).catch((function(n){u.send({id:e.id,result:null,error:d(n)}),p=null})):(r instanceof t?u.send({id:e.id,result:r.message,error:null},r.transfer):u.send({id:e.id,result:r,error:null}),p=null)}catch(n){u.send({id:e.id,result:null,error:d(n)})}})),u.register=function(e,n){if(e)for(var t in e)e.hasOwnProperty(t)&&(u.methods[t]=e[t],u.methods[t].worker=c);n&&(u.terminationHandler=n.onTerminate,u.abortListenerTimeout=n.abortListenerTimeout||1e3),u.send(\"ready\")},u.emit=function(e){if(p){if(e instanceof t)return void u.send({id:p,isEvent:!0,payload:e.message},e.transfer);u.send({id:p,isEvent:!0,payload:e})}},n.add=u.register,n.emit=u.emit}(t),n(t)}));\n\n"; + return embeddedWorker; + } + var Promise$2 = require_Promise().Promise; + var environment = environmentExports; + var validateOptions = validateOptions$1.validateOptions, forkOptsNames = validateOptions$1.forkOptsNames, workerThreadOptsNames = validateOptions$1.workerThreadOptsNames, workerOptsNames = validateOptions$1.workerOptsNames; + /** + * Special message sent by parent which causes a child process worker to terminate itself. + * Not a "message object"; this string is the entire message. + */ + var TERMINATE_METHOD_ID = "__workerpool-terminate__"; + /** + * Special message by parent which causes a child process worker to perform cleaup + * steps before determining if the child process worker should be terminated. + */ + var CLEANUP_METHOD_ID = "__workerpool-cleanup__"; + function ensureWorkerThreads() { + var WorkerThreads = tryRequireWorkerThreads(); + if (!WorkerThreads) throw new Error("WorkerPool: workerType = 'thread' is not supported, Node >= 11.7.0 required"); + return WorkerThreads; + } + function ensureWebWorker() { + if (typeof Worker !== "function" && ((typeof Worker === "undefined" ? "undefined" : _typeof(Worker)) !== "object" || typeof Worker.prototype.constructor !== "function")) throw new Error("WorkerPool: Web Workers not supported"); + } + function tryRequireWorkerThreads() { + try { + return require___vite_browser_external(); + } catch (error) { + if (_typeof(error) === "object" && error !== null && error.code === "MODULE_NOT_FOUND") return null; + else throw error; + } + } + function getDefaultWorker() { + if (environment.platform === "browser") { + if (typeof Blob === "undefined") throw new Error("Blob not supported by the browser"); + if (!window.URL || typeof window.URL.createObjectURL !== "function") throw new Error("URL.createObjectURL not supported by the browser"); + var blob = new Blob([requireEmbeddedWorker()], { type: "text/javascript" }); + return window.URL.createObjectURL(blob); + } else return __dirname + "/worker.js"; + } + function setupWorker(script, options) { + if (options.workerType === "web") { + ensureWebWorker(); + return setupBrowserWorker(script, options.workerOpts, Worker); + } else if (options.workerType === "thread") { + WorkerThreads = ensureWorkerThreads(); + return setupWorkerThreadWorker(script, WorkerThreads, options); + } else if (options.workerType === "process" || !options.workerType) return setupProcessWorker(script, resolveForkOptions(options), require___vite_browser_external()); + else if (environment.platform === "browser") { + ensureWebWorker(); + return setupBrowserWorker(script, options.workerOpts, Worker); + } else { + var WorkerThreads = tryRequireWorkerThreads(); + if (WorkerThreads) return setupWorkerThreadWorker(script, WorkerThreads, options); + else return setupProcessWorker(script, resolveForkOptions(options), require___vite_browser_external()); + } + } + function setupBrowserWorker(script, workerOpts, Worker) { + validateOptions(workerOpts, workerOptsNames, "workerOpts"); + var worker = new Worker(script, workerOpts); + worker.isBrowserWorker = true; + worker.on = function(event, callback) { + this.addEventListener(event, function(message) { + callback(message.data); + }); + }; + worker.send = function(message, transfer) { + this.postMessage(message, transfer); + }; + return worker; + } + function setupWorkerThreadWorker(script, WorkerThreads, options) { + var _options$emitStdStrea, _options$emitStdStrea2; + validateOptions(options === null || options === void 0 ? void 0 : options.workerThreadOpts, workerThreadOptsNames, "workerThreadOpts"); + var worker = new WorkerThreads.Worker(script, _objectSpread2({ + stdout: (_options$emitStdStrea = options === null || options === void 0 ? void 0 : options.emitStdStreams) !== null && _options$emitStdStrea !== void 0 ? _options$emitStdStrea : false, + stderr: (_options$emitStdStrea2 = options === null || options === void 0 ? void 0 : options.emitStdStreams) !== null && _options$emitStdStrea2 !== void 0 ? _options$emitStdStrea2 : false + }, options === null || options === void 0 ? void 0 : options.workerThreadOpts)); + worker.isWorkerThread = true; + worker.send = function(message, transfer) { + this.postMessage(message, transfer); + }; + worker.kill = function() { + this.terminate(); + return true; + }; + worker.disconnect = function() { + this.terminate(); + }; + if (options !== null && options !== void 0 && options.emitStdStreams) { + worker.stdout.on("data", function(data) { + return worker.emit("stdout", data); + }); + worker.stderr.on("data", function(data) { + return worker.emit("stderr", data); + }); + } + return worker; + } + function setupProcessWorker(script, options, child_process) { + validateOptions(options.forkOpts, forkOptsNames, "forkOpts"); + var worker = child_process.fork(script, options.forkArgs, options.forkOpts); + var send = worker.send; + worker.send = function(message) { + return send.call(worker, message); + }; + if (options.emitStdStreams) { + worker.stdout.on("data", function(data) { + return worker.emit("stdout", data); + }); + worker.stderr.on("data", function(data) { + return worker.emit("stderr", data); + }); + } + worker.isChildProcess = true; + return worker; + } + function resolveForkOptions(opts) { + opts = opts || {}; + var processExecArgv = process.execArgv.join(" "); + var inspectorActive = processExecArgv.indexOf("--inspect") !== -1; + var debugBrk = processExecArgv.indexOf("--debug-brk") !== -1; + var execArgv = []; + if (inspectorActive) { + execArgv.push("--inspect=" + opts.debugPort); + if (debugBrk) execArgv.push("--debug-brk"); + } + process.execArgv.forEach(function(arg) { + if (arg.indexOf("--max-old-space-size") > -1) execArgv.push(arg); + }); + return Object.assign({}, opts, { + forkArgs: opts.forkArgs, + forkOpts: Object.assign({}, opts.forkOpts, { + execArgv: (opts.forkOpts && opts.forkOpts.execArgv || []).concat(execArgv), + stdio: opts.emitStdStreams ? "pipe" : void 0 + }) + }); + } + /** + * Converts a serialized error to Error + * @param {Object} obj Error that has been serialized and parsed to object + * @return {Error} The equivalent Error. + */ + function objectToError(obj) { + var temp = /* @__PURE__ */ new Error(""); + var props = Object.keys(obj); + for (var i = 0; i < props.length; i++) temp[props[i]] = obj[props[i]]; + return temp; + } + function handleEmittedStdPayload(handler, payload) { + Object.values(handler.processing).forEach(function(task) { + var _task$options; + return task === null || task === void 0 || (_task$options = task.options) === null || _task$options === void 0 ? void 0 : _task$options.on(payload); + }); + Object.values(handler.tracking).forEach(function(task) { + var _task$options2; + return task === null || task === void 0 || (_task$options2 = task.options) === null || _task$options2 === void 0 ? void 0 : _task$options2.on(payload); + }); + } + /** + * A WorkerHandler controls a single worker. This worker can be a child process + * on node.js or a WebWorker in a browser environment. + * @param {String} [script] If no script is provided, a default worker with a + * function run will be created. + * @param {import('./types.js').WorkerPoolOptions} [_options] See docs + * @constructor + */ + function WorkerHandler(script, _options) { + var me = this; + var options = _options || {}; + this.script = script || getDefaultWorker(); + this.worker = setupWorker(this.script, options); + this.debugPort = options.debugPort; + this.forkOpts = options.forkOpts; + this.forkArgs = options.forkArgs; + this.workerOpts = options.workerOpts; + this.workerThreadOpts = options.workerThreadOpts; + this.workerTerminateTimeout = options.workerTerminateTimeout; + if (!script) this.worker.ready = true; + this.requestQueue = []; + this.worker.on("stdout", function(data) { + handleEmittedStdPayload(me, { "stdout": data.toString() }); + }); + this.worker.on("stderr", function(data) { + handleEmittedStdPayload(me, { "stderr": data.toString() }); + }); + this.worker.on("message", function(response) { + if (me.terminated) return; + if (typeof response === "string" && response === "ready") { + me.worker.ready = true; + dispatchQueuedRequests(); + } else { + var id = response.id; + var task = me.processing[id]; + if (task !== void 0) if (response.isEvent) { + if (task.options && typeof task.options.on === "function") task.options.on(response.payload); + } else { + delete me.processing[id]; + if (me.terminating === true) me.terminate(); + if (response.error) task.resolver.reject(objectToError(response.error)); + else task.resolver.resolve(response.result); + } + else { + var task = me.tracking[id]; + if (task !== void 0) { + if (response.isEvent) { + if (task.options && typeof task.options.on === "function") task.options.on(response.payload); + } + } + } + if (response.method === CLEANUP_METHOD_ID) { + var trackedTask = me.tracking[response.id]; + if (trackedTask !== void 0) if (response.error) { + clearTimeout(trackedTask.timeoutId); + trackedTask.resolver.reject(objectToError(response.error)); + } else { + me.tracking && clearTimeout(trackedTask.timeoutId); + trackedTask.resolver.reject(new WrappedTimeoutError(trackedTask.error)); + } + delete me.tracking[id]; + } + } + }); + function onError(error) { + me.terminated = true; + for (var id in me.processing) if (me.processing[id] !== void 0) me.processing[id].resolver.reject(error); + me.processing = Object.create(null); + } + function dispatchQueuedRequests() { + var _iterator = _createForOfIteratorHelper(me.requestQueue.splice(0)), _step; + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var request = _step.value; + me.worker.send(request.message, request.transfer); + } + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); + } + } + var worker = this.worker; + this.worker.on("error", function(error) { + onError(new TerminateError$1("Workerpool Worker error: " + (error && error.message ? error.message : String(error || "Unknown worker error")), error)); + }); + this.worker.on("exit", function(exitCode, signalCode) { + var message = "Workerpool Worker terminated Unexpectedly\n"; + message += " exitCode: `" + exitCode + "`\n"; + message += " signalCode: `" + signalCode + "`\n"; + message += " workerpool.script: `" + me.script + "`\n"; + message += " spawnArgs: `" + worker.spawnargs + "`\n"; + message += " spawnfile: `" + worker.spawnfile + "`\n"; + message += " stdout: `" + worker.stdout + "`\n"; + message += " stderr: `" + worker.stderr + "`\n"; + onError(new TerminateError$1(message)); + }); + this.processing = Object.create(null); + this.tracking = Object.create(null); + this.terminating = false; + this.terminated = false; + this.cleaning = false; + this.terminationHandler = null; + this.lastId = 0; + } + /** + * Get a list with methods available on the worker. + * @return {Promise.} methods + */ + WorkerHandler.prototype.methods = function() { + return this.exec("methods"); + }; + /** + * Execute a method with given parameters on the worker + * @param {String} method + * @param {Array} [params] + * @param {{resolve: Function, reject: Function}} [resolver] + * @param {import('./types.js').ExecOptions} [options] + * @return {Promise.<*, Error>} result + */ + WorkerHandler.prototype.exec = function(method, params, resolver, options) { + if (!resolver) resolver = Promise$2.defer(); + var id = ++this.lastId; + this.processing[id] = { + id, + resolver, + options + }; + var request = { + message: { + id, + method, + params + }, + transfer: options && options.transfer + }; + if (this.terminated) resolver.reject(new TerminateError$1("Worker is terminated")); + else if (this.worker.ready) this.worker.send(request.message, request.transfer); + else this.requestQueue.push(request); + var me = this; + return resolver.promise.catch(function(error) { + if (error instanceof Promise$2.CancellationError || error instanceof Promise$2.TimeoutError) { + me.tracking[id] = { + id, + resolver: Promise$2.defer(), + options, + error + }; + delete me.processing[id]; + me.tracking[id].resolver.promise = me.tracking[id].resolver.promise.catch(function(err) { + delete me.tracking[id]; + if (err instanceof WrappedTimeoutError) throw err.error; + return me.terminateAndNotify(true).then(function() { + throw err; + }, function(err) { + throw err; + }); + }); + me.worker.send({ + id, + method: CLEANUP_METHOD_ID + }); + /** + * Sets a timeout to reject the cleanup operation if the message sent to the worker + * does not receive a response. see worker.tryCleanup for worker cleanup operations. + * Here we use the workerTerminateTimeout as the worker will be terminated if the timeout does invoke. + * + * We need this timeout in either case of a Timeout or Cancellation Error as if + * the worker does not send a message we still need to give a window of time for a response. + * + * The workerTermniateTimeout is used here if this promise is rejected the worker cleanup + * operations will occure. + */ + me.tracking[id].timeoutId = setTimeout(function() { + me.tracking[id].resolver.reject(error); + }, me.workerTerminateTimeout); + return me.tracking[id].resolver.promise; + } else throw error; + }); + }; + /** + * Test whether the worker is processing any tasks or cleaning up before termination. + * @return {boolean} Returns true if the worker is busy + */ + WorkerHandler.prototype.busy = function() { + return this.cleaning || Object.keys(this.processing).length > 0; + }; + /** + * Terminate the worker. + * @param {boolean} [force=false] If false (default), the worker is terminated + * after finishing all tasks currently in + * progress. If true, the worker will be + * terminated immediately. + * @param {function} [callback=null] If provided, will be called when process terminates. + */ + WorkerHandler.prototype.terminate = function(force, callback) { + var me = this; + if (force) { + for (var id in this.processing) if (this.processing[id] !== void 0) this.processing[id].resolver.reject(/* @__PURE__ */ new Error("Worker terminated")); + this.processing = Object.create(null); + } + for (var _i = 0, _Object$values = Object.values(me.tracking); _i < _Object$values.length; _i++) { + var task = _Object$values[_i]; + clearTimeout(task.timeoutId); + task.resolver.reject(/* @__PURE__ */ new Error("Worker Terminating")); + } + me.tracking = Object.create(null); + if (typeof callback === "function") this.terminationHandler = callback; + if (!this.busy()) { + var cleanup = function cleanup(err) { + me.terminated = true; + me.cleaning = false; + if (me.worker != null && me.worker.removeAllListeners) me.worker.removeAllListeners("message"); + me.worker = null; + me.terminating = false; + if (me.terminationHandler) me.terminationHandler(err, me); + else if (err) throw err; + }; + if (this.worker) if (typeof this.worker.kill === "function") { + if (this.worker.killed) { + cleanup(/* @__PURE__ */ new Error("worker already killed!")); + return; + } + var cleanExitTimeout = setTimeout(function() { + if (me.worker) me.worker.kill(); + }, this.workerTerminateTimeout); + this.worker.once("exit", function() { + clearTimeout(cleanExitTimeout); + if (me.worker) me.worker.killed = true; + cleanup(); + }); + if (this.worker.ready) this.worker.send(TERMINATE_METHOD_ID); + else this.requestQueue.push({ message: TERMINATE_METHOD_ID }); + this.cleaning = true; + return; + } else if (typeof this.worker.terminate === "function") { + this.worker.terminate(); + this.worker.killed = true; + } else throw new Error("Failed to terminate worker"); + cleanup(); + } else this.terminating = true; + }; + /** + * Terminate the worker, returning a Promise that resolves when the termination has been done. + * @param {boolean} [force=false] If false (default), the worker is terminated + * after finishing all tasks currently in + * progress. If true, the worker will be + * terminated immediately. + * @param {number} [timeout] If provided and non-zero, worker termination promise will be rejected + * after timeout if worker process has not been terminated. + * @return {Promise.} + */ + WorkerHandler.prototype.terminateAndNotify = function(force, timeout) { + var resolver = Promise$2.defer(); + if (timeout) resolver.promise.timeout(timeout); + this.terminate(force, function(err, worker) { + if (err) resolver.reject(err); + else resolver.resolve(worker); + }); + return resolver.promise; + }; + /** + * Wrapper error type to denote that a TimeoutError has already been proceesed + * and we should skip cleanup operations + * @param {Promise.TimeoutError} timeoutError + */ + function WrappedTimeoutError(timeoutError) { + this.error = timeoutError; + this.stack = (/* @__PURE__ */ new Error()).stack; + } + var TerminateError$1 = /* @__PURE__ */ function(_Error) { + /** + * Create a timeout error + * @param {String} [message] + * @param {Error=} [cause] + */ + function TerminateError(message, cause) { + var _this; + _classCallCheck(this, TerminateError); + _this = _callSuper(this, TerminateError, [message || "worker terminated"]); + _this.cause = cause; + return _this; + } + _inherits(TerminateError, _Error); + return _createClass(TerminateError); + }(/* @__PURE__ */ _wrapNativeSuper(Error)); + WorkerHandler$1.exports = WorkerHandler; + WorkerHandler$1.exports._tryRequireWorkerThreads = tryRequireWorkerThreads; + WorkerHandler$1.exports._setupProcessWorker = setupProcessWorker; + WorkerHandler$1.exports._setupBrowserWorker = setupBrowserWorker; + WorkerHandler$1.exports._setupWorkerThreadWorker = setupWorkerThreadWorker; + WorkerHandler$1.exports.ensureWorkerThreads = ensureWorkerThreads; + WorkerHandler$1.exports.TerminateError = TerminateError$1; + var WorkerHandlerExports = WorkerHandler$1.exports; + /** + * FIFO Queue implementation + * @template [T=any] + * @constructor + * @implements {import('./types').TaskQueue} + */ + var queues; + var hasRequiredQueues; + function requireQueues() { + if (hasRequiredQueues) return queues; + hasRequiredQueues = 1; + function FIFOQueue() { + /** @type {import('./types').Task[]} */ + this.tasks = []; + } + /** + * @param {import('./types').Task} task + * @returns {void} + */ + FIFOQueue.prototype.push = function(task) { + this.tasks.push(task); + }; + /** + * @returns {import('./types').Task | undefined} + */ + FIFOQueue.prototype.pop = function() { + return this.tasks.shift(); + }; + /** + * @returns {number} + */ + FIFOQueue.prototype.size = function() { + return this.tasks.length; + }; + /** + * @param {import('./types').Task} task + * @returns {boolean} + */ + FIFOQueue.prototype.contains = function(task) { + return this.tasks.includes(task); + }; + /** + * @returns {void} + */ + FIFOQueue.prototype.clear = function() { + this.tasks.length = 0; + }; + /** + * LIFO Queue implementation + * @template [T=any] + * @constructor + * @implements {import('./types').TaskQueue} + */ + function LIFOQueue() { + /** @type {import('./types').Task[]} */ + this.tasks = []; + } + /** + * @param {import('./types').Task} task + * @returns {void} + */ + LIFOQueue.prototype.push = function(task) { + this.tasks.push(task); + }; + /** + * @returns {import('./types').Task | undefined} + */ + LIFOQueue.prototype.pop = function() { + return this.tasks.pop(); + }; + /** + * @returns {number} + */ + LIFOQueue.prototype.size = function() { + return this.tasks.length; + }; + /** + * @param {import('./types').Task} task + * @returns {boolean} + */ + LIFOQueue.prototype.contains = function(task) { + return this.tasks.includes(task); + }; + /** + * @returns {void} + */ + LIFOQueue.prototype.clear = function() { + this.tasks.length = 0; + }; + queues = { + FIFOQueue, + LIFOQueue + }; + return queues; + } + var debugPortAllocator; + var hasRequiredDebugPortAllocator; + function requireDebugPortAllocator() { + if (hasRequiredDebugPortAllocator) return debugPortAllocator; + hasRequiredDebugPortAllocator = 1; + var MAX_PORTS = 65535; + debugPortAllocator = DebugPortAllocator; + function DebugPortAllocator() { + this.ports = Object.create(null); + this.length = 0; + } + DebugPortAllocator.prototype.nextAvailableStartingAt = function(starting) { + while (this.ports[starting] === true) starting++; + if (starting >= MAX_PORTS) throw new Error("WorkerPool debug port limit reached: " + starting + ">= " + MAX_PORTS); + this.ports[starting] = true; + this.length++; + return starting; + }; + DebugPortAllocator.prototype.releasePort = function(port) { + delete this.ports[port]; + this.length--; + }; + return debugPortAllocator; + } + var Pool_1; + var hasRequiredPool; + function requirePool() { + if (hasRequiredPool) return Pool_1; + hasRequiredPool = 1; + var Promise = require_Promise().Promise; + var WorkerHandler = WorkerHandlerExports; + var environment = environmentExports; + var _require$$2 = requireQueues(), FIFOQueue = _require$$2.FIFOQueue, LIFOQueue = _require$$2.LIFOQueue; + var DEBUG_PORT_ALLOCATOR = new (requireDebugPortAllocator())(); + /** + * A pool to manage workers, which can be created using the function workerpool.pool. + * + * @param {String} [script] Optional worker script + * @param {import('./types.js').WorkerPoolOptions} [options] See docs + * @constructor + */ + function Pool(script, options) { + if (typeof script === "string") + /** @readonly */ + this.script = script || null; + else { + this.script = null; + options = script; + } + /** @private */ + this.workers = []; + /** @private */ + this.taskQueue = this._createQueue(options && options.queueStrategy || "fifo"); + options = options || {}; + /** @readonly */ + this.forkArgs = Object.freeze(options.forkArgs || []); + /** @readonly */ + this.forkOpts = Object.freeze(options.forkOpts || {}); + /** @readonly */ + this.workerOpts = Object.freeze(options.workerOpts || {}); + /** @readonly */ + this.workerThreadOpts = Object.freeze(options.workerThreadOpts || {}); + /** @private */ + this.debugPortStart = options.debugPortStart || 43210; + /** @readonly @deprecated */ + this.nodeWorker = options.nodeWorker; + /** @readonly + * @type {'auto' | 'web' | 'process' | 'thread'} + */ + this.workerType = options.workerType || options.nodeWorker || "auto"; + /** @readonly */ + this.maxQueueSize = options.maxQueueSize || Infinity; + /** @readonly */ + this.workerTerminateTimeout = options.workerTerminateTimeout || 1e3; + /** @readonly */ + this.onCreateWorker = options.onCreateWorker || function() { + return null; + }; + /** @readonly */ + this.onTerminateWorker = options.onTerminateWorker || function() { + return null; + }; + /** @readonly */ + this.emitStdStreams = options.emitStdStreams || false; + if (options && "maxWorkers" in options) { + validateMaxWorkers(options.maxWorkers); + /** @readonly */ + this.maxWorkers = options.maxWorkers; + } else this.maxWorkers = Math.max((environment.cpus || 4) - 1, 1); + if (options && "minWorkers" in options) { + if (options.minWorkers === "max") + /** @readonly */ + this.minWorkers = this.maxWorkers; + else { + validateMinWorkers(options.minWorkers); + this.minWorkers = options.minWorkers; + this.maxWorkers = Math.max(this.minWorkers, this.maxWorkers); + } + this._ensureMinWorkers(); + } + /** @private */ + this._boundNext = this._next.bind(this); + if (this.workerType === "thread") WorkerHandler.ensureWorkerThreads(); + } + /** + * Execute a function on a worker. + * + * Example usage: + * + * var pool = new Pool() + * + * // call a function available on the worker + * pool.exec('fibonacci', [6]) + * + * // offload a function + * function add(a, b) { + * return a + b + * }; + * pool.exec(add, [2, 4]) + * .then(function (result) { + * console.log(result); // outputs 6 + * }) + * .catch(function(error) { + * console.log(error); + * }); + * @template { (...args: any[]) => any } T + * @param {String | T} method Function name or function. + * If `method` is a string, the corresponding + * method on the worker will be executed + * If `method` is a Function, the function + * will be stringified and executed via the + * workers built-in function `run(fn, args)`. + * @param {Parameters | null} [params] Function arguments applied when calling the function + * @param {import('./types.js').ExecOptions} [options] Options + * @return {Promise>} + */ + Pool.prototype.exec = function(method, params, options) { + if (params && !Array.isArray(params)) throw new TypeError("Array expected as argument \"params\""); + if (typeof method === "string") { + var resolver = Promise.defer(); + if (this.taskQueue.size() >= this.maxQueueSize) throw new Error("Max queue size of " + this.maxQueueSize + " reached"); + var task = { + method, + params, + resolver, + timeout: null, + options + }; + this.taskQueue.push(task); + var originalTimeout = resolver.promise.timeout; + var taskQueue = this.taskQueue; + resolver.promise.timeout = function timeout(delay) { + if (taskQueue.contains(task)) { + task.timeout = delay; + return resolver.promise; + } else return originalTimeout.call(resolver.promise, delay); + }; + this._next(); + return resolver.promise; + } else if (typeof method === "function") return this.exec("run", [String(method), params], options); + else throw new TypeError("Function or string expected as argument \"method\""); + }; + /** + * Create a proxy for current worker. Returns an object containing all + * methods available on the worker. All methods return promises resolving the methods result. + * @template { { [k: string]: (...args: any[]) => any } } T + * @return {Promise, Error>} Returns a promise which resolves with a proxy object + */ + Pool.prototype.proxy = function() { + if (arguments.length > 0) throw new Error("No arguments expected"); + var pool = this; + return this.exec("methods").then(function(methods) { + var proxy = {}; + methods.forEach(function(method) { + proxy[method] = function() { + return pool.exec(method, Array.prototype.slice.call(arguments)); + }; + }); + return proxy; + }); + }; + /** + * Creates new array with the results of calling a provided callback function + * on every element in this array. + * @param {Array} array + * @param {function} callback Function taking two arguments: + * `callback(currentValue, index)` + * @return {Promise.} Returns a promise which resolves with an Array + * containing the results of the callback function + * executed for each of the array elements. + */ + /** + * Grab the first task from the queue, find a free worker, and assign the + * worker to the task. + * @private + */ + Pool.prototype._next = function() { + if (this.taskQueue.size() > 0) { + var worker = this._getWorker(); + if (worker) { + var me = this; + var task = this.taskQueue.pop(); + if (task.resolver.promise.pending) { + var promise = worker.exec(task.method, task.params, task.resolver, task.options).then(me._boundNext).catch(function() { + if (worker.terminated) return me._removeWorker(worker); + }).then(function() { + me._next(); + }); + if (typeof task.timeout === "number") promise.timeout(task.timeout); + } else me._next(); + } + } + }; + /** + * Get an available worker. If no worker is available and the maximum number + * of workers isn't yet reached, a new worker will be created and returned. + * If no worker is available and the maximum number of workers is reached, + * null will be returned. + * + * @return {WorkerHandler | null} worker + * @private + */ + Pool.prototype._getWorker = function() { + var workers = this.workers; + for (var i = 0; i < workers.length; i++) { + var worker = workers[i]; + if (worker.busy() === false) return worker; + } + if (workers.length < this.maxWorkers) { + worker = this._createWorkerHandler(); + workers.push(worker); + return worker; + } + return null; + }; + /** + * Remove a worker from the pool. + * Attempts to terminate worker if not already terminated, and ensures the minimum + * pool size is met. + * @param {WorkerHandler} worker + * @return {Promise} + * @private + */ + Pool.prototype._removeWorker = function(worker) { + var me = this; + DEBUG_PORT_ALLOCATOR.releasePort(worker.debugPort); + this._removeWorkerFromList(worker); + this._ensureMinWorkers(); + return new Promise(function(resolve, reject) { + worker.terminate(false, function(err) { + me.onTerminateWorker({ + forkArgs: worker.forkArgs, + forkOpts: worker.forkOpts, + workerThreadOpts: worker.workerThreadOpts, + script: worker.script + }); + if (err) reject(err); + else resolve(worker); + }); + }); + }; + /** + * Remove a worker from the pool list. + * @param {WorkerHandler} worker + * @private + */ + Pool.prototype._removeWorkerFromList = function(worker) { + var index = this.workers.indexOf(worker); + if (index !== -1) this.workers.splice(index, 1); + }; + /** + * Close all active workers. Tasks currently being executed will be finished first. + * @param {boolean} [force=false] If false (default), the workers are terminated + * after finishing all tasks currently in + * progress. If true, the workers will be + * terminated immediately. + * @param {number} [timeout] If provided and non-zero, worker termination promise will be rejected + * after timeout if worker process has not been terminated. + * @return {Promise.} + */ + Pool.prototype.terminate = function(force, timeout) { + var me = this; + var taskQueue = this.taskQueue; + while (taskQueue.size() > 0) { + var task = taskQueue.pop(); + if (task) task.resolver.reject(/* @__PURE__ */ new Error("Pool terminated")); + else break; + } + taskQueue.clear(); + var removeWorker = function f(worker) { + DEBUG_PORT_ALLOCATOR.releasePort(worker.debugPort); + this._removeWorkerFromList(worker); + }.bind(this); + var promises = []; + this.workers.slice().forEach(function(worker) { + var termPromise = worker.terminateAndNotify(force, timeout).then(removeWorker).always(function() { + me.onTerminateWorker({ + forkArgs: worker.forkArgs, + forkOpts: worker.forkOpts, + workerThreadOpts: worker.workerThreadOpts, + script: worker.script + }); + }); + promises.push(termPromise); + }); + return Promise.all(promises); + }; + /** + * Retrieve statistics on tasks and workers. + * @return {{totalWorkers: number, busyWorkers: number, idleWorkers: number, pendingTasks: number, activeTasks: number}} Returns an object with statistics + */ + Pool.prototype.stats = function() { + var totalWorkers = this.workers.length; + var busyWorkers = this.workers.filter(function(worker) { + return worker.busy(); + }).length; + return { + totalWorkers, + busyWorkers, + idleWorkers: totalWorkers - busyWorkers, + pendingTasks: this.taskQueue.size(), + activeTasks: busyWorkers + }; + }; + /** + * Ensures that a minimum of minWorkers is up and running + * @private + */ + Pool.prototype._ensureMinWorkers = function() { + if (this.minWorkers) for (var i = this.workers.length; i < this.minWorkers; i++) this.workers.push(this._createWorkerHandler()); + }; + /** + * Helper function to create a new WorkerHandler and pass all options. + * @return {WorkerHandler} + * @private + */ + Pool.prototype._createWorkerHandler = function() { + var overriddenParams = this.onCreateWorker({ + forkArgs: this.forkArgs, + forkOpts: this.forkOpts, + workerOpts: this.workerOpts, + workerThreadOpts: this.workerThreadOpts, + script: this.script + }) || {}; + return new WorkerHandler(overriddenParams.script || this.script, { + forkArgs: overriddenParams.forkArgs || this.forkArgs, + forkOpts: overriddenParams.forkOpts || this.forkOpts, + workerOpts: overriddenParams.workerOpts || this.workerOpts, + workerThreadOpts: overriddenParams.workerThreadOpts || this.workerThreadOpts, + debugPort: DEBUG_PORT_ALLOCATOR.nextAvailableStartingAt(this.debugPortStart), + workerType: this.workerType, + workerTerminateTimeout: this.workerTerminateTimeout, + emitStdStreams: this.emitStdStreams + }); + }; + /** + * Create queue instance based on strategy + * @param {'fifo' | 'lifo' | import('./types').TaskQueue} strategy + * @returns {import('./types').TaskQueue} Queue instance + * @private + */ + Pool.prototype._createQueue = function(strategy) { + if (typeof strategy === "string") switch (strategy) { + case "fifo": return new FIFOQueue(); + case "lifo": return new LIFOQueue(); + default: throw new Error("Unknown queue strategy: " + strategy); + } + if (!strategy) throw new Error("Queue strategy cannot be null or undefined"); + var requiredMethods = [ + "push", + "pop", + "size", + "contains", + "clear" + ]; + for (var i = 0; i < requiredMethods.length; i++) { + var method = requiredMethods[i]; + if (typeof strategy[method] !== "function") throw new Error("Queue strategy must implement method: " + method); + } + return strategy; + }; + /** + * Ensure that the maxWorkers option is an integer >= 1 + * @param {*} maxWorkers + * @returns {boolean} returns true maxWorkers has a valid value + */ + function validateMaxWorkers(maxWorkers) { + if (!isNumber(maxWorkers) || !isInteger(maxWorkers) || maxWorkers < 1) throw new TypeError("Option maxWorkers must be an integer number >= 1"); + } + /** + * Ensure that the minWorkers option is an integer >= 0 + * @param {*} minWorkers + * @returns {boolean} returns true when minWorkers has a valid value + */ + function validateMinWorkers(minWorkers) { + if (!isNumber(minWorkers) || !isInteger(minWorkers) || minWorkers < 0) throw new TypeError("Option minWorkers must be an integer number >= 0"); + } + /** + * Test whether a variable is a number + * @param {*} value + * @returns {boolean} returns true when value is a number + */ + function isNumber(value) { + return typeof value === "number"; + } + /** + * Test whether a number is an integer + * @param {number} value + * @returns {boolean} Returns true if value is an integer + */ + function isInteger(value) { + return Math.round(value) == value; + } + Pool_1 = Pool; + return Pool_1; + } + var worker$1 = {}; + /** + * The helper class for transferring data from the worker to the main thread. + * + * @param {Object} message The object to deliver to the main thread. + * @param {Object[]} transfer An array of transferable Objects to transfer ownership of. + */ + var transfer; + var hasRequiredTransfer; + function requireTransfer() { + if (hasRequiredTransfer) return transfer; + hasRequiredTransfer = 1; + function Transfer(message, transfer) { + this.message = message; + this.transfer = transfer; + } + transfer = Transfer; + return transfer; + } + var hasRequiredWorker; + function requireWorker() { + if (hasRequiredWorker) return worker$1; + hasRequiredWorker = 1; + (function(exports$1) { + var Transfer = requireTransfer(); + /** + * worker must handle async cleanup handlers. Use custom Promise implementation. + */ + var Promise = require_Promise().Promise; + /** + * Special message sent by parent which causes the worker to terminate itself. + * Not a "message object"; this string is the entire message. + */ + var TERMINATE_METHOD_ID = "__workerpool-terminate__"; + /** + * Special message by parent which causes a child process worker to perform cleaup + * steps before determining if the child process worker should be terminated. + */ + var CLEANUP_METHOD_ID = "__workerpool-cleanup__"; + var TIMEOUT_DEFAULT = 1e3; + var worker = { exit: function exit() {} }; + var publicWorker = { + addAbortListener: function addAbortListener(listener) { + worker.abortListeners.push(listener); + }, + emit: worker.emit + }; + if (typeof self !== "undefined" && typeof postMessage === "function" && typeof addEventListener === "function") { + worker.on = function(event, callback) { + addEventListener(event, function(message) { + callback(message.data); + }); + }; + worker.send = function(message, transfer) { + transfer ? postMessage(message, transfer) : postMessage(message); + }; + } else if (typeof process !== "undefined") { + var WorkerThreads; + try { + WorkerThreads = require___vite_browser_external(); + } catch (error) { + if (_typeof(error) === "object" && error !== null && error.code === "MODULE_NOT_FOUND"); + else throw error; + } + if (WorkerThreads && WorkerThreads.parentPort !== null) { + var parentPort = WorkerThreads.parentPort; + worker.send = parentPort.postMessage.bind(parentPort); + worker.on = parentPort.on.bind(parentPort); + worker.exit = process.exit.bind(process); + } else { + worker.on = process.on.bind(process); + worker.send = function(message) { + process.send(message); + }; + worker.on("disconnect", function() { + process.exit(1); + }); + worker.exit = process.exit.bind(process); + } + } else throw new Error("Script must be executed as a worker"); + function convertError(error) { + if (error && error.toJSON) return JSON.parse(JSON.stringify(error)); + return JSON.parse(JSON.stringify(error, Object.getOwnPropertyNames(error))); + } + /** + * Test whether a value is a Promise via duck typing. + * @param {*} value + * @returns {boolean} Returns true when given value is an object + * having functions `then` and `catch`. + */ + function isPromise(value) { + return value && typeof value.then === "function" && typeof value.catch === "function"; + } + worker.methods = {}; + /** + * Execute a function with provided arguments + * @param {String} fn Stringified function + * @param {Array} [args] Function arguments + * @returns {*} + */ + worker.methods.run = function run(fn, args) { + var f = new Function("return (" + fn + ").apply(this, arguments);"); + f.worker = publicWorker; + return f.apply(f, args); + }; + /** + * Get a list with methods available on this worker + * @return {String[]} methods + */ + worker.methods.methods = function methods() { + return Object.keys(worker.methods); + }; + /** + * Custom handler for when the worker is terminated. + */ + worker.terminationHandler = void 0; + worker.abortListenerTimeout = TIMEOUT_DEFAULT; + /** + * Abort handlers for resolving errors which may cause a timeout or cancellation + * to occur from a worker context + */ + worker.abortListeners = []; + /** + * Cleanup and exit the worker. + * @param {Number} code + * @returns {Promise} + */ + worker.terminateAndExit = function(code) { + var _exit = function _exit() { + worker.exit(code); + }; + if (!worker.terminationHandler) return _exit(); + var result = worker.terminationHandler(code); + if (isPromise(result)) { + result.then(_exit, _exit); + return result; + } else { + _exit(); + return new Promise(function(_resolve, reject) { + reject(/* @__PURE__ */ new Error("Worker terminating")); + }); + } + }; + /** + * Called within the worker message handler to run abort handlers if registered to perform cleanup operations. + * @param {Integer} [requestId] id of task which is currently executing in the worker + * @return {Promise} + */ + worker.cleanup = function(requestId) { + if (!worker.abortListeners.length) { + worker.send({ + id: requestId, + method: CLEANUP_METHOD_ID, + error: convertError(/* @__PURE__ */ new Error("Worker terminating")) + }); + return new Promise(function(resolve) { + resolve(); + }); + } + var _exit = function _exit() { + worker.exit(); + }; + var _abort = function _abort() { + if (!worker.abortListeners.length) worker.abortListeners = []; + }; + var promises = worker.abortListeners.map(function(listener) { + return listener(); + }); + var timerId; + var timeoutPromise = new Promise(function(_resolve, reject) { + timerId = setTimeout(function() { + reject(/* @__PURE__ */ new Error("Timeout occured waiting for abort handler, killing worker")); + }, worker.abortListenerTimeout); + }); + var settlePromise = Promise.all(promises).then(function() { + clearTimeout(timerId); + _abort(); + }, function() { + clearTimeout(timerId); + _exit(); + }); + return new Promise(function(resolve, reject) { + settlePromise.then(resolve, reject); + timeoutPromise.then(resolve, reject); + }).then(function() { + worker.send({ + id: requestId, + method: CLEANUP_METHOD_ID, + error: null + }); + }, function(err) { + worker.send({ + id: requestId, + method: CLEANUP_METHOD_ID, + error: err ? convertError(err) : null + }); + }); + }; + var currentRequestId = null; + worker.on("message", function(request) { + if (request === TERMINATE_METHOD_ID) return worker.terminateAndExit(0); + if (request.method === CLEANUP_METHOD_ID) return worker.cleanup(request.id); + try { + var method = worker.methods[request.method]; + if (method) { + currentRequestId = request.id; + var result = method.apply(method, request.params); + if (isPromise(result)) result.then(function(result) { + if (result instanceof Transfer) worker.send({ + id: request.id, + result: result.message, + error: null + }, result.transfer); + else worker.send({ + id: request.id, + result, + error: null + }); + currentRequestId = null; + }).catch(function(err) { + worker.send({ + id: request.id, + result: null, + error: convertError(err) + }); + currentRequestId = null; + }); + else { + if (result instanceof Transfer) worker.send({ + id: request.id, + result: result.message, + error: null + }, result.transfer); + else worker.send({ + id: request.id, + result, + error: null + }); + currentRequestId = null; + } + } else throw new Error("Unknown method \"" + request.method + "\""); + } catch (err) { + worker.send({ + id: request.id, + result: null, + error: convertError(err) + }); + } + }); + /** + * Register methods to the worker + * @param {Object} [methods] + * @param {import('./types.js').WorkerRegisterOptions} [options] + */ + worker.register = function(methods, options) { + if (methods) { + for (var name in methods) if (methods.hasOwnProperty(name)) { + worker.methods[name] = methods[name]; + worker.methods[name].worker = publicWorker; + } + } + if (options) { + worker.terminationHandler = options.onTerminate; + worker.abortListenerTimeout = options.abortListenerTimeout || TIMEOUT_DEFAULT; + } + worker.send("ready"); + }; + worker.emit = function(payload) { + if (currentRequestId) { + if (payload instanceof Transfer) { + worker.send({ + id: currentRequestId, + isEvent: true, + payload: payload.message + }, payload.transfer); + return; + } + worker.send({ + id: currentRequestId, + isEvent: true, + payload + }); + } + }; + exports$1.add = worker.register; + exports$1.emit = worker.emit; + })(worker$1); + return worker$1; + } + var platform = environmentExports.platform, isMainThread = environmentExports.isMainThread, cpus = environmentExports.cpus; + var TerminateError = WorkerHandlerExports.TerminateError; + /** @typedef {import("./Pool")} Pool */ + /** @typedef {import("./types.js").WorkerPoolOptions} WorkerPoolOptions */ + /** @typedef {import("./types.js").WorkerRegisterOptions} WorkerRegisterOptions */ + /** + * @template { { [k: string]: (...args: any[]) => any } } T + * @typedef {import('./types.js').Proxy} Proxy + */ + /** + * @overload + * Create a new worker pool + * @param {WorkerPoolOptions} [script] + * @returns {Pool} pool + */ + /** + * @overload + * Create a new worker pool + * @param {string} [script] + * @param {WorkerPoolOptions} [options] + * @returns {Pool} pool + */ + function pool(script, options) { + return new (requirePool())(script, options); + } + var pool_1 = src.pool = pool; + /** + * Create a worker and optionally register a set of methods to the worker. + * @param {{ [k: string]: (...args: any[]) => any }} [methods] + * @param {WorkerRegisterOptions} [options] + */ + function worker(methods, options) { + requireWorker().add(methods, options); + } + var worker_1 = src.worker = worker; + /** + * Sends an event to the parent worker pool. + * @param {any} payload + */ + function workerEmit(payload) { + requireWorker().emit(payload); + } + var workerEmit_1 = src.workerEmit = workerEmit; + var _Promise = src.Promise = require_Promise().Promise; + var Transfer = src.Transfer = requireTransfer(); + var platform_1 = src.platform = platform; + var isMainThread_1 = src.isMainThread = isMainThread; + var cpus_1 = src.cpus = cpus; + var TerminateError_1 = src.TerminateError = TerminateError; + exports$2.Promise = _Promise; + exports$2.TerminateError = TerminateError_1; + exports$2.Transfer = Transfer; + exports$2.cpus = cpus_1; + exports$2.default = src; + exports$2.isMainThread = isMainThread_1; + exports$2.platform = platform_1; + exports$2.pool = pool_1; + exports$2.worker = worker_1; + exports$2.workerEmit = workerEmit_1; + Object.defineProperty(exports$2, "__esModule", { value: true }); + })); +})))(), 1); +var _virtual_worker_script_default = "!function(e,n){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=n():\"function\"==typeof define&&define.amd?define(n):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).worker=n()}(this,(function(){\"use strict\";function e(n){return e=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},e(n)}function n(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}var t={};var r=function(e,n){this.message=e,this.transfer=n},o={};function i(e,n){var t=this;if(!(this instanceof i))throw new SyntaxError(\"Constructor must be called with the new operator\");if(\"function\"!=typeof e)throw new SyntaxError(\"Function parameter handler(resolve, reject) missing\");var r=[],o=[];this.resolved=!1,this.rejected=!1,this.pending=!0,this[Symbol.toStringTag]=\"Promise\";var a=function(e,n){r.push(e),o.push(n)};this.then=function(e,n){return new i((function(t,r){var o=e?s(e,t,r):t,i=n?s(n,t,r):r;a(o,i)}),t)};var f=function(e){return t.resolved=!0,t.rejected=!1,t.pending=!1,r.forEach((function(n){n(e)})),a=function(n,t){n(e)},f=d=function(){},t},d=function(e){return t.resolved=!1,t.rejected=!0,t.pending=!1,o.forEach((function(n){n(e)})),a=function(n,t){t(e)},f=d=function(){},t};this.cancel=function(){return n?n.cancel():d(new u),t},this.timeout=function(e){if(n)n.timeout(e);else{var r=setTimeout((function(){d(new c(\"Promise timed out after \"+e+\" ms\"))}),e);t.always((function(){clearTimeout(r)}))}return t},e((function(e){f(e)}),(function(e){d(e)}))}function s(e,n,t){return function(r){try{var o=e(r);o&&\"function\"==typeof o.then&&\"function\"==typeof o.catch?o.then(n,t):n(o)}catch(e){t(e)}}}function u(e){this.message=e||\"promise cancelled\",this.stack=(new Error).stack}function c(e){this.message=e||\"timeout exceeded\",this.stack=(new Error).stack}return i.prototype.catch=function(e){return this.then(null,e)},i.prototype.always=function(e){return this.then(e,e)},i.prototype.finally=function(e){var n=this,t=function(){return new i((function(e){return e()})).then(e).then((function(){return n}))};return this.then(t,t)},i.all=function(e){return new i((function(n,t){var r=e.length,o=[];r?e.forEach((function(e,i){e.then((function(e){o[i]=e,0==--r&&n(o)}),(function(e){r=0,t(e)}))})):n(o)}))},i.defer=function(){var e={};return e.promise=new i((function(n,t){e.resolve=n,e.reject=t})),e},u.prototype=new Error,u.prototype.constructor=Error,u.prototype.name=\"CancellationError\",i.CancellationError=u,c.prototype=new Error,c.prototype.constructor=Error,c.prototype.name=\"TimeoutError\",i.TimeoutError=c,o.Promise=i,function(n){var t=r,i=o.Promise,s=\"__workerpool-cleanup__\",u={exit:function(){}},c={addAbortListener:function(e){u.abortListeners.push(e)},emit:u.emit};if(\"undefined\"!=typeof self&&\"function\"==typeof postMessage&&\"function\"==typeof addEventListener)u.on=function(e,n){addEventListener(e,(function(e){n(e.data)}))},u.send=function(e,n){n?postMessage(e,n):postMessage(e)};else{if(\"undefined\"==typeof process)throw new Error(\"Script must be executed as a worker\");var a;try{a=require(\"worker_threads\")}catch(n){if(\"object\"!==e(n)||null===n||\"MODULE_NOT_FOUND\"!==n.code)throw n}if(a&&null!==a.parentPort){var f=a.parentPort;u.send=f.postMessage.bind(f),u.on=f.on.bind(f),u.exit=process.exit.bind(process)}else u.on=process.on.bind(process),u.send=function(e){process.send(e)},u.on(\"disconnect\",(function(){process.exit(1)})),u.exit=process.exit.bind(process)}function d(e){return e&&e.toJSON?JSON.parse(JSON.stringify(e)):JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}function l(e){return e&&\"function\"==typeof e.then&&\"function\"==typeof e.catch}u.methods={},u.methods.run=function(e,n){var t=new Function(\"return (\"+e+\").apply(this, arguments);\");return t.worker=c,t.apply(t,n)},u.methods.methods=function(){return Object.keys(u.methods)},u.terminationHandler=void 0,u.abortListenerTimeout=1e3,u.abortListeners=[],u.terminateAndExit=function(e){var n=function(){u.exit(e)};if(!u.terminationHandler)return n();var t=u.terminationHandler(e);return l(t)?(t.then(n,n),t):(n(),new i((function(e,n){n(new Error(\"Worker terminating\"))})))},u.cleanup=function(e){if(!u.abortListeners.length)return u.send({id:e,method:s,error:d(new Error(\"Worker terminating\"))}),new i((function(e){e()}));var n,t=u.abortListeners.map((function(e){return e()})),r=new i((function(e,t){n=setTimeout((function(){t(new Error(\"Timeout occured waiting for abort handler, killing worker\"))}),u.abortListenerTimeout)})),o=i.all(t).then((function(){clearTimeout(n),u.abortListeners.length||(u.abortListeners=[])}),(function(){clearTimeout(n),u.exit()}));return new i((function(e,n){o.then(e,n),r.then(e,n)})).then((function(){u.send({id:e,method:s,error:null})}),(function(n){u.send({id:e,method:s,error:n?d(n):null})}))};var p=null;u.on(\"message\",(function(e){if(\"__workerpool-terminate__\"===e)return u.terminateAndExit(0);if(e.method===s)return u.cleanup(e.id);try{var n=u.methods[e.method];if(!n)throw new Error('Unknown method \"'+e.method+'\"');p=e.id;var r=n.apply(n,e.params);l(r)?r.then((function(n){n instanceof t?u.send({id:e.id,result:n.message,error:null},n.transfer):u.send({id:e.id,result:n,error:null}),p=null})).catch((function(n){u.send({id:e.id,result:null,error:d(n)}),p=null})):(r instanceof t?u.send({id:e.id,result:r.message,error:null},r.transfer):u.send({id:e.id,result:r,error:null}),p=null)}catch(n){u.send({id:e.id,result:null,error:d(n)})}})),u.register=function(e,n){if(e)for(var t in e)e.hasOwnProperty(t)&&(u.methods[t]=e[t],u.methods[t].worker=c);n&&(u.terminationHandler=n.onTerminate,u.abortListenerTimeout=n.abortListenerTimeout||1e3),u.send(\"ready\")},u.emit=function(e){if(p){if(e instanceof t)return void u.send({id:p,isEvent:!0,payload:e.message},e.transfer);u.send({id:p,isEvent:!0,payload:e})}},n.add=u.register,n.emit=u.emit}(t),n(t)}));\n\n;(function(){\nvar runTask=(function thread() {\n const MAXMEM = 32767;\n let instance;\n let memory;\n\n // Lazily cached typed-array views over wasm memory.\n // Invalidated automatically when memory.grow() replaces memory.buffer.\n let _u32 = null;\n let _u8 = null;\n\n function getU32() {\n if (_u32 === null || _u32.buffer !== memory.buffer) {\n _u32 = new Uint32Array(memory.buffer, 0, 1);\n }\n return _u32;\n }\n\n function getU8() {\n if (_u8 === null || _u8.buffer !== memory.buffer) {\n _u8 = new Uint8Array(memory.buffer);\n }\n return _u8;\n }\n\n async function init(data) {\n let wasmModule;\n if (data.code instanceof WebAssembly.Module) {\n wasmModule = data.code;\n } else {\n wasmModule = await WebAssembly.compile(new Uint8Array(data.code));\n }\n memory = new WebAssembly.Memory({initial: data.init, maximum: MAXMEM});\n // Reset cached views — new memory means new backing buffer.\n _u32 = null;\n _u8 = null;\n instance = await WebAssembly.instantiate(wasmModule, {env: {memory}});\n }\n\n function alloc(length) {\n const u32 = getU32();\n // Align to 4 bytes with a branchless bitmask instead of a loop.\n u32[0] = (u32[0] + 3) & ~3;\n const res = u32[0];\n u32[0] += length;\n if (u32[0] + length > memory.buffer.byteLength) {\n const currentPages = memory.buffer.byteLength / 0x10000;\n let requiredPages = Math.floor((u32[0] + length) / 0x10000) + 1;\n if (requiredPages > MAXMEM) requiredPages = MAXMEM;\n memory.grow(requiredPages - currentPages);\n // memory.buffer changed — cached views are now stale.\n }\n return res;\n }\n\n function allocBuffer(buffer) {\n const src = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const p = alloc(src.byteLength);\n // getU8() handles re-creation if alloc() triggered a grow.\n getU8().set(src, p);\n return p;\n }\n\n function getBuffer(pointer, length) {\n return new Uint8Array(memory.buffer, pointer, length);\n }\n\n function setBuffer(pointer, buffer) {\n getU8().set(buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer), pointer);\n }\n\n function runTask(task) {\n if (task[0].cmd === \"INIT\") {\n // INIT is the only async path — return a Promise so workerpool\n // can await it; all other tasks execute synchronously to prevent\n // concurrent execution of tasks within the same worker.\n return init(task[0]);\n }\n const vars = [];\n const out = [];\n const oldAlloc = getU32()[0];\n for (let i = 0; i < task.length; i++) {\n const step = task[i];\n switch (step.cmd) {\n case \"ALLOCSET\":\n vars[step.var] = allocBuffer(step.buff);\n break;\n case \"ALLOC\":\n vars[step.var] = alloc(step.len);\n break;\n case \"SET\":\n setBuffer(vars[step.var], step.buff);\n break;\n case \"CALL\": {\n const paramDefs = step.params;\n const params = new Array(paramDefs.length);\n for (let j = 0; j < paramDefs.length; j++) {\n const p = paramDefs[j];\n params[j] = p.var !== undefined\n ? vars[p.var] + (p.offset || 0)\n : p.val;\n }\n instance.exports[step.fnName](...params);\n break;\n }\n case \"GET\":\n out[step.out] = getBuffer(vars[step.var], step.len).slice();\n break;\n default:\n throw new Error(\"Invalid cmd: \" + step.cmd);\n }\n }\n // Reclaim task-local allocations. getU32() handles a post-grow buffer.\n getU32()[0] = oldAlloc;\n return out;\n }\n\n return runTask;\n})();\nworker.add({runTask:runTask});\n})();"; +//#endregion +//#region src/threadman.browser.js +function getConcurrency() { + return typeof navigator === "object" && navigator.hardwareConcurrency || 2; +} +function getWorkerType() { + return "web"; +} +function supportsWorkers() { + return typeof Worker !== "undefined"; +} +var _workerSource = null; +function getWorkerSource() { + if (_workerSource) return _workerSource; + const blob = new Blob([_virtual_worker_script_default], { type: "application/javascript" }); + _workerSource = (globalThis.URL ? globalThis.URL : globalThis.webkitURL).createObjectURL(blob); + return _workerSource; +} +//#endregion +//#region src/threadman.js +var MEM_SIZE = 25; +async function buildThreadManager(wasm, singleThread) { + const tm = new ThreadManager(); + tm.memory = new WebAssembly.Memory({ initial: MEM_SIZE }); + tm.u8 = new Uint8Array(tm.memory.buffer); + tm.u32 = new Uint32Array(tm.memory.buffer); + const wasmModule = await WebAssembly.compile(wasm.code); + tm.instance = await WebAssembly.instantiate(wasmModule, { env: { "memory": tm.memory } }); + if (!supportsWorkers()) singleThread = true; + tm.singleThread = singleThread; + tm.initalPFree = tm.u32[0]; + tm.pq = wasm.pq; + tm.pr = wasm.pr; + tm.pG1gen = wasm.pG1gen; + tm.pG1zero = wasm.pG1zero; + tm.pG2gen = wasm.pG2gen; + tm.pG2zero = wasm.pG2zero; + tm.pOneT = wasm.pOneT; + tm.code = wasm.code; + tm.wasmModule = wasmModule; + if (singleThread) { + tm.taskManager = thread(); + await tm.taskManager([{ + cmd: "INIT", + init: MEM_SIZE, + code: tm.code.slice() + }]); + tm.concurrency = 1; + } else { + const rawConcurrency = getConcurrency(); + const concurrency = Math.min(Math.max(rawConcurrency, 2), 64); + tm.concurrency = concurrency; + tm.pool = import_workerpool.default.pool(getWorkerSource(), { + maxWorkers: concurrency, + workerType: getWorkerType() + }); + const initPromises = []; + for (let i = 0; i < concurrency; i++) initPromises.push(tm.pool.exec("runTask", [[{ + cmd: "INIT", + init: MEM_SIZE, + code: tm.wasmModule + }]])); + await Promise.all(initPromises); + } + return tm; +} +var ThreadManager = class { + constructor() { + this.oldPFree = 0; + } + startSyncOp() { + if (this.oldPFree !== 0) throw new Error("Sync operation in progress"); + this.oldPFree = this.u32[0]; + } + endSyncOp() { + if (this.oldPFree === 0) throw new Error("No sync operation in progress"); + this.u32[0] = this.oldPFree; + this.oldPFree = 0; + } + async queueAction(actionData, transfers) { + if (this.singleThread) return this.taskManager(actionData); + return this.pool.exec("runTask", [actionData], { transfer: transfers }); + } + resetMemory() { + this.u32[0] = this.initalPFree; + } + allocBuff(buff) { + const pointer = this.alloc(buff.byteLength); + this.setBuff(pointer, buff); + return pointer; + } + getBuff(pointer, length) { + return this.u8.slice(pointer, pointer + length); + } + setBuff(pointer, buffer) { + this.u8.set(new Uint8Array(buffer), pointer); + } + alloc(length) { + this.u32[0] = this.u32[0] + 3 & -4; + const res = this.u32[0]; + this.u32[0] += length; + return res; + } + async terminate() { + if (this.pool) await this.pool.terminate(true); + } +}; +//#endregion +//#region src/engine_applykey.js +function buildBatchApplyKey(curve, groupName) { + const G = curve[groupName]; + const Fr = curve.Fr; + const tm = curve.tm; + curve[groupName].batchApplyKey = async function(buff, first, inc, inType, outType) { + inType = inType || "affine"; + outType = outType || "affine"; + let fnName, fnAffine; + let sGin, sGmid, sGout; + if (groupName == "G1") { + if (inType == "jacobian") { + sGin = G.F.n8 * 3; + fnName = "g1m_batchApplyKey"; + } else { + sGin = G.F.n8 * 2; + fnName = "g1m_batchApplyKeyMixed"; + } + sGmid = G.F.n8 * 3; + if (outType == "jacobian") sGout = G.F.n8 * 3; + else { + fnAffine = "g1m_batchToAffine"; + sGout = G.F.n8 * 2; + } + } else if (groupName == "G2") { + if (inType == "jacobian") { + sGin = G.F.n8 * 3; + fnName = "g2m_batchApplyKey"; + } else { + sGin = G.F.n8 * 2; + fnName = "g2m_batchApplyKeyMixed"; + } + sGmid = G.F.n8 * 3; + if (outType == "jacobian") sGout = G.F.n8 * 3; + else { + fnAffine = "g2m_batchToAffine"; + sGout = G.F.n8 * 2; + } + } else if (groupName == "Fr") { + fnName = "frm_batchApplyKey"; + sGin = G.n8; + sGmid = G.n8; + sGout = G.n8; + } else throw new Error("Invalid group: " + groupName); + const nPoints = Math.floor(buff.byteLength / sGin); + const pointsPerChunk = Math.floor(nPoints / tm.concurrency); + const opPromises = []; + inc = Fr.e(inc); + let t = Fr.e(first); + for (let i = 0; i < tm.concurrency; i++) { + let n; + if (i < tm.concurrency - 1) n = pointsPerChunk; + else n = nPoints - i * pointsPerChunk; + if (n == 0) continue; + const task = []; + const b = buff.slice(i * pointsPerChunk * sGin, i * pointsPerChunk * sGin + n * sGin); + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: b + }); + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: t + }); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: inc + }); + task.push({ + cmd: "ALLOC", + var: 3, + len: n * Math.max(sGmid, sGout) + }); + task.push({ + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { val: n }, + { var: 1 }, + { var: 2 }, + { var: 3 } + ] + }); + if (fnAffine) task.push({ + cmd: "CALL", + fnName: fnAffine, + params: [ + { var: 3 }, + { val: n }, + { var: 3 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 3, + len: n * sGout + }); + opPromises.push(tm.queueAction(task, [b.buffer])); + t = Fr.mul(t, Fr.exp(inc, n)); + } + const result = await Promise.all(opPromises); + let outBuff; + if (buff instanceof BigBuffer) outBuff = new BigBuffer(nPoints * sGout); + else outBuff = new Uint8Array(nPoints * sGout); + let p = 0; + for (let i = 0; i < result.length; i++) { + outBuff.set(result[i][0], p); + p += result[i][0].byteLength; + } + return outBuff; + }; +} +//#endregion +//#region src/engine_pairing.js +function buildPairing(curve) { + const tm = curve.tm; + curve.pairing = function pairing(a, b) { + tm.startSyncOp(); + const pA = tm.allocBuff(curve.G1.toJacobian(a)); + const pB = tm.allocBuff(curve.G2.toJacobian(b)); + const pRes = tm.alloc(curve.Gt.n8); + tm.instance.exports[curve.name + "_pairing"](pA, pB, pRes); + const res = tm.getBuff(pRes, curve.Gt.n8); + tm.endSyncOp(); + return res; + }; + curve.pairingEq = async function pairingEq() { + let buffCt; + let nEqs; + if (arguments.length % 2 == 1) { + buffCt = arguments[arguments.length - 1]; + nEqs = (arguments.length - 1) / 2; + } else { + buffCt = curve.Gt.one; + nEqs = arguments.length / 2; + } + const opPromises = []; + for (let i = 0; i < nEqs; i++) { + const task = []; + const g1Buff = curve.G1.toJacobian(arguments[i * 2]); + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: g1Buff + }); + task.push({ + cmd: "ALLOC", + var: 1, + len: curve.prePSize + }); + const g2Buff = curve.G2.toJacobian(arguments[i * 2 + 1]); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: g2Buff + }); + task.push({ + cmd: "ALLOC", + var: 3, + len: curve.preQSize + }); + task.push({ + cmd: "ALLOC", + var: 4, + len: curve.Gt.n8 + }); + task.push({ + cmd: "CALL", + fnName: curve.name + "_prepareG1", + params: [{ var: 0 }, { var: 1 }] + }); + task.push({ + cmd: "CALL", + fnName: curve.name + "_prepareG2", + params: [{ var: 2 }, { var: 3 }] + }); + task.push({ + cmd: "CALL", + fnName: curve.name + "_millerLoop", + params: [ + { var: 1 }, + { var: 3 }, + { var: 4 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 4, + len: curve.Gt.n8 + }); + opPromises.push(tm.queueAction(task, [g1Buff.buffer, g2Buff.buffer])); + } + const result = await Promise.all(opPromises); + tm.startSyncOp(); + const pRes = tm.alloc(curve.Gt.n8); + tm.instance.exports.ftm_one(pRes); + for (let i = 0; i < result.length; i++) { + const pMR = tm.allocBuff(result[i][0]); + tm.instance.exports.ftm_mul(pRes, pMR, pRes); + } + tm.instance.exports[curve.name + "_finalExponentiation"](pRes, pRes); + const pCt = tm.allocBuff(buffCt); + const r = !!tm.instance.exports.ftm_eq(pRes, pCt); + tm.endSyncOp(); + return r; + }; + curve.prepareG1 = function(p) { + this.tm.startSyncOp(); + const pP = this.tm.allocBuff(p); + const pPrepP = this.tm.alloc(this.prePSize); + this.tm.instance.exports[this.name + "_prepareG1"](pP, pPrepP); + const res = this.tm.getBuff(pPrepP, this.prePSize); + this.tm.endSyncOp(); + return res; + }; + curve.prepareG2 = function(q) { + this.tm.startSyncOp(); + const pQ = this.tm.allocBuff(q); + const pPrepQ = this.tm.alloc(this.preQSize); + this.tm.instance.exports[this.name + "_prepareG2"](pQ, pPrepQ); + const res = this.tm.getBuff(pPrepQ, this.preQSize); + this.tm.endSyncOp(); + return res; + }; + curve.millerLoop = function(preP, preQ) { + this.tm.startSyncOp(); + const pPreP = this.tm.allocBuff(preP); + const pPreQ = this.tm.allocBuff(preQ); + const pRes = this.tm.alloc(this.Gt.n8); + this.tm.instance.exports[this.name + "_millerLoop"](pPreP, pPreQ, pRes); + const res = this.tm.getBuff(pRes, this.Gt.n8); + this.tm.endSyncOp(); + return res; + }; + curve.finalExponentiation = function(a) { + this.tm.startSyncOp(); + const pA = this.tm.allocBuff(a); + const pRes = this.tm.alloc(this.Gt.n8); + this.tm.instance.exports[this.name + "_finalExponentiation"](pA, pRes); + const res = this.tm.getBuff(pRes, this.Gt.n8); + this.tm.endSyncOp(); + return res; + }; +} +//#endregion +//#region src/engine_multiexp.js +var pTSizes = [ + 1, + 1, + 1, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 13, + 14, + 15, + 16, + 16, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17, + 17 +]; +function buildMultiexp(curve, groupName) { + const G = curve[groupName]; + const tm = G.tm; + async function _multiExpChunk(buffBases, buffScalars, inType, logger, logText) { + if (!(buffBases instanceof Uint8Array)) { + if (logger) logger.error(`${logText} _multiExpChunk buffBases is not Uint8Array`); + throw new Error(`${logText} _multiExpChunk buffBases is not Uint8Array`); + } + if (!(buffScalars instanceof Uint8Array)) { + if (logger) logger.error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); + throw new Error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); + } + inType = inType || "affine"; + let sGIn; + let fnName; + if (groupName === "G1") if (inType === "affine") { + fnName = "g1m_multiexpAffine"; + sGIn = G.F.n8 * 2; + } else { + fnName = "g1m_multiexp"; + sGIn = G.F.n8 * 3; + } + else if (groupName === "G2") if (inType === "affine") { + fnName = "g2m_multiexpAffine"; + sGIn = G.F.n8 * 2; + } else { + fnName = "g2m_multiexp"; + sGIn = G.F.n8 * 3; + } + else throw new Error("Invalid group"); + const nPoints = Math.floor(buffBases.byteLength / sGIn); + if (nPoints === 0) return G.zero; + const sScalar = Math.floor(buffScalars.byteLength / nPoints); + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error("Scalar size does not match"); + const bitChunkSize = pTSizes[log2(nPoints)]; + const opPromises = []; + const task = [ + { + cmd: "ALLOCSET", + var: 0, + buff: buffBases + }, + { + cmd: "ALLOCSET", + var: 1, + buff: buffScalars + }, + { + cmd: "ALLOC", + var: 2, + len: G.F.n8 * 3 + }, + { + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { var: 1 }, + { val: sScalar }, + { val: nPoints }, + { var: 2 } + ] + }, + { + cmd: "GET", + out: 0, + var: 2, + len: G.F.n8 * 3 + } + ]; + opPromises.push(G.tm.queueAction(task, [buffBases.buffer, buffScalars.buffer])); + const result = await Promise.all(opPromises); + let res = G.zero; + for (let i = result.length - 1; i >= 0; i--) { + if (!G.isZero(res)) for (let j = 0; j < bitChunkSize; j++) res = G.double(res); + res = G.add(res, result[i][0]); + } + return res; + } + async function _multiExp(buffBases, buffScalars, inType, logger, logText) { + const MAX_CHUNK_SIZE = 1 << 22; + const MIN_CHUNK_SIZE = 4096; + let sGIn; + if (groupName === "G1") if (inType === "affine") sGIn = G.F.n8 * 2; + else sGIn = G.F.n8 * 3; + else if (groupName === "G2") if (inType === "affine") sGIn = G.F.n8 * 2; + else sGIn = G.F.n8 * 3; + else throw new Error("Invalid group"); + const nPoints = Math.floor(buffBases.byteLength / sGIn); + if (nPoints === 0) return G.zero; + const sScalar = Math.floor(buffScalars.byteLength / nPoints); + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error("Scalar size does not match"); + const opPromises = []; + const bitChunkSize = pTSizes[log2(nPoints)]; + let nChunks = Math.floor((sScalar * 8 - 1) / bitChunkSize) + 1; + if (groupName === "G2") nChunks *= 2; + let chunkSize; + console.log("nChunks_0", nChunks); + nChunks = (Math.floor((nChunks - 1) / tm.concurrency) + 1) * tm.concurrency; + chunkSize = Math.floor(nPoints / nChunks) + 1; + if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; + if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; + console.log("nChunks", nChunks); + console.log("effective nChunks", nPoints / chunkSize); + for (let i = 0; i < nPoints; i += chunkSize) { + if (logger) logger.debug(`Multiexp start: ${logText}: ${i}/${nPoints}`); + const n = Math.min(nPoints - i, chunkSize); + const buffBasesChunk = buffBases.slice(i * sGIn, (i + n) * sGIn); + const buffScalarsChunk = buffScalars.slice(i * sScalar, (i + n) * sScalar); + opPromises.push(_multiExpChunk(buffBasesChunk, buffScalarsChunk, inType, logger, logText).then((r) => { + if (logger) logger.debug(`Multiexp end: ${logText}: ${i}/${nPoints}`); + return r; + })); + } + const result = await Promise.all(opPromises); + let res = G.zero; + for (let i = result.length - 1; i >= 0; i--) res = G.add(res, result[i]); + return res; + } + G.multiExp = async function multiExpAffine(buffBases, buffScalars, logger, logText) { + return _multiExp(buffBases, buffScalars, "jacobian", logger, logText); + }; + G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText) { + return _multiExp(buffBases, buffScalars, "affine", logger, logText); + }; +} +//#endregion +//#region src/engine_fft.js +function buildFFT(curve, groupName) { + const G = curve[groupName]; + const Fr = curve.Fr; + const tm = G.tm; + async function _fft(buff, inverse, inType, outType, logger, loggerTxt) { + inType = inType || "affine"; + outType = outType || "affine"; + const MAX_BITS_THREAD = 14; + let sIn, sMid, sOut, fnIn2Mid, fnMid2Out, fnFFTMix, fnFFTJoin, fnFFTFinal, fnReversePermutation; + if (groupName == "G1") { + if (inType == "affine") { + sIn = G.F.n8 * 2; + fnIn2Mid = "g1m_batchToJacobian"; + } else sIn = G.F.n8 * 3; + sMid = G.F.n8 * 3; + if (inverse) fnFFTFinal = "g1m_fftFinal"; + fnFFTJoin = "g1m_fftJoin"; + fnFFTMix = "g1m_fftMix"; + fnReversePermutation = "g1m__reversePermutation"; + if (outType == "affine") { + sOut = G.F.n8 * 2; + fnMid2Out = "g1m_batchToAffine"; + } else sOut = G.F.n8 * 3; + } else if (groupName == "G2") { + if (inType == "affine") { + sIn = G.F.n8 * 2; + fnIn2Mid = "g2m_batchToJacobian"; + } else sIn = G.F.n8 * 3; + sMid = G.F.n8 * 3; + if (inverse) fnFFTFinal = "g2m_fftFinal"; + fnFFTJoin = "g2m_fftJoin"; + fnFFTMix = "g2m_fftMix"; + fnReversePermutation = "g2m__reversePermutation"; + if (outType == "affine") { + sOut = G.F.n8 * 2; + fnMid2Out = "g2m_batchToAffine"; + } else sOut = G.F.n8 * 3; + } else if (groupName == "Fr") { + sIn = G.n8; + sMid = G.n8; + sOut = G.n8; + if (inverse) fnFFTFinal = "frm_fftFinal"; + fnFFTMix = "frm_fftMix"; + fnFFTJoin = "frm_fftJoin"; + fnReversePermutation = "frm__reversePermutation"; + } + let returnArray = false; + if (Array.isArray(buff)) { + buff = array2buffer(buff, sIn); + returnArray = true; + } else buff = buff.slice(0, buff.byteLength); + console.log("FFT input size:", buff.byteLength, " bytes"); + const nPoints = buff.byteLength / sIn; + const bits = log2(nPoints); + console.log("FFT points:", nPoints, " bits:", bits); + if (1 << bits != nPoints) throw new Error("fft must be multiple of 2"); + if (bits == Fr.s + 1) { + let buffOut; + if (inverse) buffOut = await _fftExtInv(buff, inType, outType, logger, loggerTxt); + else buffOut = await _fftExt(buff, inType, outType, logger, loggerTxt); + if (returnArray) return buffer2array(buffOut, sOut); + else return buffOut; + } + let inv; + if (inverse) inv = Fr.inv(Fr.e(nPoints)); + let buffOut; + console.log("fnReversePermutation:", fnReversePermutation); + const task = []; + task.push({ + cmd: "ALLOCSET", + var: 0, + buff + }); + task.push({ + cmd: "CALL", + fnName: fnReversePermutation, + params: [{ var: 0 }, { val: bits }] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: nPoints * sIn + }); + buff = (await tm.queueAction(task, [buff.buffer]))[0]; + let chunks; + let pointsInChunk = Math.min(1 << MAX_BITS_THREAD, nPoints); + let nChunks = nPoints / pointsInChunk; + while (nChunks < tm.concurrency && pointsInChunk >= 16) { + nChunks *= 2; + pointsInChunk /= 2; + } + const l2Chunk = log2(pointsInChunk); + const promises = []; + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${nChunks}`); + for (let i = 0; i < nChunks; i++) { + const task = []; + task.push({ + cmd: "ALLOC", + var: 0, + len: sMid * pointsInChunk + }); + const buffChunk = buff.slice(pointsInChunk * i * sIn, pointsInChunk * (i + 1) * sIn); + task.push({ + cmd: "SET", + var: 0, + buff: buffChunk + }); + if (fnIn2Mid) task.push({ + cmd: "CALL", + fnName: fnIn2Mid, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 0 } + ] + }); + for (let j = 1; j <= l2Chunk; j++) task.push({ + cmd: "CALL", + fnName: fnFFTMix, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { val: j } + ] + }); + if (l2Chunk == bits) { + if (fnFFTFinal) { + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: inv + }); + task.push({ + cmd: "CALL", + fnName: fnFFTFinal, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 1 } + ] + }); + } + if (fnMid2Out) task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 0 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsInChunk * sOut + }); + } else task.push({ + cmd: "GET", + out: 0, + var: 0, + len: sMid * pointsInChunk + }); + promises.push(tm.queueAction(task, [buffChunk.buffer])); + } + chunks = await Promise.all(promises); + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${nChunks}`); + for (let i = 0; i < nChunks; i++) chunks[i] = chunks[i][0]; + for (let i = l2Chunk + 1; i <= bits; i++) { + if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); + const nGroups = 1 << bits - i; + const nChunksPerGroup = nChunks / nGroups; + const opPromises = []; + for (let j = 0; j < nGroups; j++) for (let k = 0; k < nChunksPerGroup / 2; k++) { + const first = Fr.exp(Fr.w[i], k * pointsInChunk); + const inc = Fr.w[i]; + const o1 = j * nChunksPerGroup + k; + const o2 = j * nChunksPerGroup + k + nChunksPerGroup / 2; + const task = []; + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: chunks[o1] + }); + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: chunks[o2] + }); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: first + }); + task.push({ + cmd: "ALLOCSET", + var: 3, + buff: inc + }); + task.push({ + cmd: "CALL", + fnName: fnFFTJoin, + params: [ + { var: 0 }, + { var: 1 }, + { val: pointsInChunk }, + { var: 2 }, + { var: 3 } + ] + }); + if (i == bits) { + if (fnFFTFinal) { + task.push({ + cmd: "ALLOCSET", + var: 4, + buff: inv + }); + task.push({ + cmd: "CALL", + fnName: fnFFTFinal, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 4 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnFFTFinal, + params: [ + { var: 1 }, + { val: pointsInChunk }, + { var: 4 } + ] + }); + } + if (fnMid2Out) { + task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 0 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 1 }, + { val: pointsInChunk }, + { var: 1 } + ] + }); + } + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsInChunk * sOut + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: pointsInChunk * sOut + }); + } else { + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsInChunk * sMid + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: pointsInChunk * sMid + }); + } + opPromises.push(tm.queueAction(task, [ + chunks[o1].buffer, + chunks[o2].buffer, + first.buffer + ])); + } + const res = await Promise.all(opPromises); + for (let j = 0; j < nGroups; j++) for (let k = 0; k < nChunksPerGroup / 2; k++) { + const o1 = j * nChunksPerGroup + k; + const o2 = j * nChunksPerGroup + k + nChunksPerGroup / 2; + const resChunk = res.shift(); + chunks[o1] = resChunk[0]; + chunks[o2] = resChunk[1]; + } + } + if (buff instanceof BigBuffer) buffOut = new BigBuffer(nPoints * sOut); + else buffOut = new Uint8Array(nPoints * sOut); + if (inverse) { + buffOut.set(chunks[0].slice((pointsInChunk - 1) * sOut)); + let p = sOut; + for (let i = nChunks - 1; i > 0; i--) { + buffOut.set(chunks[i], p); + p += pointsInChunk * sOut; + delete chunks[i]; + } + buffOut.set(chunks[0].slice(0, (pointsInChunk - 1) * sOut), p); + delete chunks[0]; + } else for (let i = 0; i < nChunks; i++) { + buffOut.set(chunks[i], pointsInChunk * sOut * i); + delete chunks[i]; + } + if (returnArray) return buffer2array(buffOut, sOut); + else return buffOut; + } + async function _fftExt(buff, inType, outType, logger, loggerTxt) { + let b1, b2; + b1 = buff.slice(0, buff.byteLength / 2); + b2 = buff.slice(buff.byteLength / 2, buff.byteLength); + const promises = []; + [b1, b2] = await _fftJoinExt(b1, b2, "fftJoinExt", Fr.one, Fr.shift, inType, "jacobian", logger, loggerTxt); + promises.push(_fft(b1, false, "jacobian", outType, logger, loggerTxt)); + promises.push(_fft(b2, false, "jacobian", outType, logger, loggerTxt)); + const res1 = await Promise.all(promises); + let buffOut; + if (res1[0].byteLength > 1 << 28) buffOut = new BigBuffer(res1[0].byteLength * 2); + else buffOut = new Uint8Array(res1[0].byteLength * 2); + buffOut.set(res1[0]); + buffOut.set(res1[1], res1[0].byteLength); + return buffOut; + } + async function _fftExtInv(buff, inType, outType, logger, loggerTxt) { + let b1, b2; + b1 = buff.slice(0, buff.byteLength / 2); + b2 = buff.slice(buff.byteLength / 2, buff.byteLength); + const promises = []; + promises.push(_fft(b1, true, inType, "jacobian", logger, loggerTxt)); + promises.push(_fft(b2, true, inType, "jacobian", logger, loggerTxt)); + [b1, b2] = await Promise.all(promises); + const res1 = await _fftJoinExt(b1, b2, "fftJoinExtInv", Fr.one, Fr.shiftInv, "jacobian", outType, logger, loggerTxt); + let buffOut; + if (res1[0].byteLength > 1 << 28) buffOut = new BigBuffer(res1[0].byteLength * 2); + else buffOut = new Uint8Array(res1[0].byteLength * 2); + buffOut.set(res1[0]); + buffOut.set(res1[1], res1[0].byteLength); + return buffOut; + } + async function _fftJoinExt(buff1, buff2, fn, first, inc, inType, outType, logger, loggerTxt) { + const MAX_CHUNK_SIZE = 65536; + const MIN_CHUNK_SIZE = 16; + let fnName; + let fnIn2Mid, fnMid2Out; + let sOut, sIn, sMid; + if (groupName == "G1") { + if (inType == "affine") { + sIn = G.F.n8 * 2; + fnIn2Mid = "g1m_batchToJacobian"; + } else sIn = G.F.n8 * 3; + sMid = G.F.n8 * 3; + fnName = "g1m_" + fn; + if (outType == "affine") { + fnMid2Out = "g1m_batchToAffine"; + sOut = G.F.n8 * 2; + } else sOut = G.F.n8 * 3; + } else if (groupName == "G2") { + if (inType == "affine") { + sIn = G.F.n8 * 2; + fnIn2Mid = "g2m_batchToJacobian"; + } else sIn = G.F.n8 * 3; + fnName = "g2m_" + fn; + sMid = G.F.n8 * 3; + if (outType == "affine") { + fnMid2Out = "g2m_batchToAffine"; + sOut = G.F.n8 * 2; + } else sOut = G.F.n8 * 3; + } else if (groupName == "Fr") { + sIn = Fr.n8; + sOut = Fr.n8; + sMid = Fr.n8; + fnName = "frm_" + fn; + } else throw new Error("Invalid group"); + if (buff1.byteLength != buff2.byteLength) throw new Error("Invalid buffer size"); + const nPoints = Math.floor(buff1.byteLength / sIn); + if (nPoints != 1 << log2(nPoints)) throw new Error("Invalid number of points"); + let chunkSize = Math.floor(nPoints / tm.concurrency); + if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; + if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; + const opPromises = []; + for (let i = 0; i < nPoints; i += chunkSize) { + if (logger) logger.debug(`${loggerTxt}: fftJoinExt Start: ${i}/${nPoints}`); + const n = Math.min(nPoints - i, chunkSize); + const firstChunk = Fr.mul(first, Fr.exp(inc, i)); + const task = []; + const b1 = buff1.slice(i * sIn, (i + n) * sIn); + const b2 = buff2.slice(i * sIn, (i + n) * sIn); + task.push({ + cmd: "ALLOC", + var: 0, + len: sMid * n + }); + task.push({ + cmd: "SET", + var: 0, + buff: b1 + }); + task.push({ + cmd: "ALLOC", + var: 1, + len: sMid * n + }); + task.push({ + cmd: "SET", + var: 1, + buff: b2 + }); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: firstChunk + }); + task.push({ + cmd: "ALLOCSET", + var: 3, + buff: inc + }); + if (fnIn2Mid) { + task.push({ + cmd: "CALL", + fnName: fnIn2Mid, + params: [ + { var: 0 }, + { val: n }, + { var: 0 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnIn2Mid, + params: [ + { var: 1 }, + { val: n }, + { var: 1 } + ] + }); + } + task.push({ + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { var: 1 }, + { val: n }, + { var: 2 }, + { var: 3 }, + { val: Fr.s } + ] + }); + if (fnMid2Out) { + task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 0 }, + { val: n }, + { var: 0 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 1 }, + { val: n }, + { var: 1 } + ] + }); + } + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: n * sOut + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: n * sOut + }); + opPromises.push(tm.queueAction(task, [ + b1.buffer, + b2.buffer, + firstChunk.buffer + ]).then((r) => { + if (logger) logger.debug(`${loggerTxt}: fftJoinExt End: ${i}/${nPoints}`); + return r; + })); + } + const result = await Promise.all(opPromises); + let fullBuffOut1; + let fullBuffOut2; + if (nPoints * sOut > 1 << 28) { + fullBuffOut1 = new BigBuffer(nPoints * sOut); + fullBuffOut2 = new BigBuffer(nPoints * sOut); + } else { + fullBuffOut1 = new Uint8Array(nPoints * sOut); + fullBuffOut2 = new Uint8Array(nPoints * sOut); + } + let p = 0; + for (let i = 0; i < result.length; i++) { + fullBuffOut1.set(result[i][0], p); + fullBuffOut2.set(result[i][1], p); + p += result[i][0].byteLength; + } + return [fullBuffOut1, fullBuffOut2]; + } + G.fft = async function(buff, inType, outType, logger, loggerTxt) { + return await _fft(buff, false, inType, outType, logger, loggerTxt); + }; + G.ifft = async function(buff, inType, outType, logger, loggerTxt) { + return await _fft(buff, true, inType, outType, logger, loggerTxt); + }; + G.lagrangeEvaluations = async function(buff, inType, outType, logger, loggerTxt) { + inType = inType || "affine"; + outType = outType || "affine"; + let sIn; + if (groupName == "G1") if (inType == "affine") sIn = G.F.n8 * 2; + else sIn = G.F.n8 * 3; + else if (groupName == "G2") if (inType == "affine") sIn = G.F.n8 * 2; + else sIn = G.F.n8 * 3; + else if (groupName == "Fr") sIn = Fr.n8; + else throw new Error("Invalid group"); + const nPoints = buff.byteLength / sIn; + const bits = log2(nPoints); + if (2 ** bits * sIn != buff.byteLength) { + if (logger) logger.error("lagrangeEvaluations iinvalid input size"); + throw new Error("lagrangeEvaluations invalid Input size"); + } + if (bits <= Fr.s) return await G.ifft(buff, inType, outType, logger, loggerTxt); + if (bits > Fr.s + 1) { + if (logger) logger.error("lagrangeEvaluations input too big"); + throw new Error("lagrangeEvaluations input too big"); + } + let t0 = buff.slice(0, buff.byteLength / 2); + let t1 = buff.slice(buff.byteLength / 2, buff.byteLength); + const shiftToSmallM = Fr.exp(Fr.shift, nPoints / 2); + const sConst = Fr.inv(Fr.sub(Fr.one, shiftToSmallM)); + [t0, t1] = await _fftJoinExt(t0, t1, "prepareLagrangeEvaluation", sConst, Fr.shiftInv, inType, "jacobian", logger, loggerTxt + " prep"); + const promises = []; + promises.push(_fft(t0, true, "jacobian", outType, logger, loggerTxt + " t0")); + promises.push(_fft(t1, true, "jacobian", outType, logger, loggerTxt + " t1")); + [t0, t1] = await Promise.all(promises); + let buffOut; + if (t0.byteLength > 1 << 28) buffOut = new BigBuffer(t0.byteLength * 2); + else buffOut = new Uint8Array(t0.byteLength * 2); + buffOut.set(t0); + buffOut.set(t1, t0.byteLength); + return buffOut; + }; + G.fftMix = async function fftMix(buff) { + const sG = G.F.n8 * 3; + let fnName, fnFFTJoin; + if (groupName == "G1") { + fnName = "g1m_fftMix"; + fnFFTJoin = "g1m_fftJoin"; + } else if (groupName == "G2") { + fnName = "g2m_fftMix"; + fnFFTJoin = "g2m_fftJoin"; + } else if (groupName == "Fr") { + fnName = "frm_fftMix"; + fnFFTJoin = "frm_fftJoin"; + } else throw new Error("Invalid group"); + const nPoints = Math.floor(buff.byteLength / sG); + const power = log2(nPoints); + let nChunks = 1 << log2(tm.concurrency); + if (nPoints <= nChunks * 2) nChunks = 1; + const pointsPerChunk = nPoints / nChunks; + const powerChunk = log2(pointsPerChunk); + const opPromises = []; + for (let i = 0; i < nChunks; i++) { + const task = []; + const b = buff.slice(i * pointsPerChunk * sG, (i + 1) * pointsPerChunk * sG); + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: b + }); + for (let j = 1; j <= powerChunk; j++) task.push({ + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { val: pointsPerChunk }, + { val: j } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsPerChunk * sG + }); + opPromises.push(tm.queueAction(task, [b.buffer])); + } + const result = await Promise.all(opPromises); + const chunks = []; + for (let i = 0; i < result.length; i++) chunks[i] = result[i][0]; + for (let i = powerChunk + 1; i <= power; i++) { + const nGroups = 1 << power - i; + const nChunksPerGroup = nChunks / nGroups; + const opPromises = []; + for (let j = 0; j < nGroups; j++) for (let k = 0; k < nChunksPerGroup / 2; k++) { + const first = Fr.exp(Fr.w[i], k * pointsPerChunk); + const inc = Fr.w[i]; + const o1 = j * nChunksPerGroup + k; + const o2 = j * nChunksPerGroup + k + nChunksPerGroup / 2; + const task = []; + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: chunks[o1] + }); + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: chunks[o2] + }); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: first + }); + task.push({ + cmd: "ALLOCSET", + var: 3, + buff: inc + }); + task.push({ + cmd: "CALL", + fnName: fnFFTJoin, + params: [ + { var: 0 }, + { var: 1 }, + { val: pointsPerChunk }, + { var: 2 }, + { var: 3 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsPerChunk * sG + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: pointsPerChunk * sG + }); + opPromises.push(tm.queueAction(task, [ + chunks[o1].buffer, + chunks[o2].buffer, + first.buffer + ])); + } + const res = await Promise.all(opPromises); + for (let j = 0; j < nGroups; j++) for (let k = 0; k < nChunksPerGroup / 2; k++) { + const o1 = j * nChunksPerGroup + k; + const o2 = j * nChunksPerGroup + k + nChunksPerGroup / 2; + const resChunk = res.shift(); + chunks[o1] = resChunk[0]; + chunks[o2] = resChunk[1]; + } + } + let fullBuffOut; + if (buff instanceof BigBuffer) fullBuffOut = new BigBuffer(nPoints * sG); + else fullBuffOut = new Uint8Array(nPoints * sG); + let p = 0; + for (let i = 0; i < nChunks; i++) { + fullBuffOut.set(chunks[i], p); + p += chunks[i].byteLength; + } + return fullBuffOut; + }; + G.fftJoin = async function fftJoin(buff1, buff2, first, inc) { + const sG = G.F.n8 * 3; + let fnName; + if (groupName == "G1") fnName = "g1m_fftJoin"; + else if (groupName == "G2") fnName = "g2m_fftJoin"; + else if (groupName == "Fr") fnName = "frm_fftJoin"; + else throw new Error("Invalid group"); + if (buff1.byteLength != buff2.byteLength) throw new Error("Invalid buffer size"); + const nPoints = Math.floor(buff1.byteLength / sG); + if (nPoints != 1 << log2(nPoints)) throw new Error("Invalid number of points"); + let nChunks = 1 << log2(tm.concurrency); + if (nPoints <= nChunks * 2) nChunks = 1; + const pointsPerChunk = nPoints / nChunks; + const opPromises = []; + for (let i = 0; i < nChunks; i++) { + const task = []; + const firstChunk = Fr.mul(first, Fr.exp(inc, i * pointsPerChunk)); + const b1 = buff1.slice(i * pointsPerChunk * sG, (i + 1) * pointsPerChunk * sG); + const b2 = buff2.slice(i * pointsPerChunk * sG, (i + 1) * pointsPerChunk * sG); + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: b1 + }); + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: b2 + }); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: firstChunk + }); + task.push({ + cmd: "ALLOCSET", + var: 3, + buff: inc + }); + task.push({ + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { var: 1 }, + { val: pointsPerChunk }, + { var: 2 }, + { var: 3 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsPerChunk * sG + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: pointsPerChunk * sG + }); + opPromises.push(tm.queueAction(task, [ + b1.buffer, + b2.buffer, + firstChunk.buffer + ])); + } + const result = await Promise.all(opPromises); + let fullBuffOut1; + let fullBuffOut2; + if (buff1 instanceof BigBuffer) { + fullBuffOut1 = new BigBuffer(nPoints * sG); + fullBuffOut2 = new BigBuffer(nPoints * sG); + } else { + fullBuffOut1 = new Uint8Array(nPoints * sG); + fullBuffOut2 = new Uint8Array(nPoints * sG); + } + let p = 0; + for (let i = 0; i < result.length; i++) { + fullBuffOut1.set(result[i][0], p); + fullBuffOut2.set(result[i][1], p); + p += result[i][0].byteLength; + } + return [fullBuffOut1, fullBuffOut2]; + }; + G.fftFinal = async function fftFinal(buff, factor) { + const sG = G.F.n8 * 3; + const sGout = G.F.n8 * 2; + let fnName, fnToAffine; + if (groupName == "G1") { + fnName = "g1m_fftFinal"; + fnToAffine = "g1m_batchToAffine"; + } else if (groupName == "G2") { + fnName = "g2m_fftFinal"; + fnToAffine = "g2m_batchToAffine"; + } else throw new Error("Invalid group"); + const nPoints = Math.floor(buff.byteLength / sG); + if (nPoints != 1 << log2(nPoints)) throw new Error("Invalid number of points"); + const pointsPerChunk = Math.floor(nPoints / tm.concurrency); + const opPromises = []; + for (let i = 0; i < tm.concurrency; i++) { + let n; + if (i < tm.concurrency - 1) n = pointsPerChunk; + else n = nPoints - i * pointsPerChunk; + if (n == 0) continue; + const task = []; + const b = buff.slice(i * pointsPerChunk * sG, (i * pointsPerChunk + n) * sG); + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: b + }); + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: factor + }); + task.push({ + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { val: n }, + { var: 1 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnToAffine, + params: [ + { var: 0 }, + { val: n }, + { var: 0 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: n * sGout + }); + opPromises.push(tm.queueAction(task, [b.buffer])); + } + const result = await Promise.all(opPromises); + let fullBuffOut; + if (buff instanceof BigBuffer) fullBuffOut = new BigBuffer(nPoints * sGout); + else fullBuffOut = new Uint8Array(nPoints * sGout); + let p = 0; + for (let i = result.length - 1; i >= 0; i--) { + fullBuffOut.set(result[i][0], p); + p += result[i][0].byteLength; + } + return fullBuffOut; + }; +} +//#endregion +//#region src/engine.js +async function buildEngine(params) { + const tm = await buildThreadManager(params.wasm, params.singleThread); + const curve = {}; + curve.q = e(params.wasm.q.toString()); + curve.r = e(params.wasm.r.toString()); + curve.name = params.name; + curve.tm = tm; + curve.prePSize = params.wasm.prePSize; + curve.preQSize = params.wasm.preQSize; + curve.Fr = new WasmField1(tm, "frm", params.n8r, params.r); + curve.F1 = new WasmField1(tm, "f1m", params.n8q, params.q); + curve.F2 = new WasmField2(tm, "f2m", curve.F1); + curve.G1 = new WasmCurve(tm, "g1m", curve.F1, params.wasm.pG1gen, params.wasm.pG1b, params.cofactorG1); + curve.G2 = new WasmCurve(tm, "g2m", curve.F2, params.wasm.pG2gen, params.wasm.pG2b, params.cofactorG2); + curve.F6 = new WasmField3(tm, "f6m", curve.F2); + curve.F12 = new WasmField2(tm, "ftm", curve.F6); + curve.Gt = curve.F12; + buildBatchApplyKey(curve, "G1"); + buildBatchApplyKey(curve, "G2"); + buildBatchApplyKey(curve, "Fr"); + buildMultiexp(curve, "G1"); + buildMultiexp(curve, "G2"); + buildFFT(curve, "G1"); + buildFFT(curve, "G2"); + buildFFT(curve, "Fr"); + buildPairing(curve); + curve.array2buffer = function(arr, sG) { + const buff = new Uint8Array(sG * arr.length); + for (let i = 0; i < arr.length; i++) buff.set(arr[i], i * sG); + return buff; + }; + curve.buffer2array = function(buff, sG) { + const n = buff.byteLength / sG; + const arr = new Array(n); + for (let i = 0; i < n; i++) arr[i] = buff.slice(i * sG, i * sG + sG); + return arr; + }; + return curve; +} +//#endregion +//#region src/bn128.js +globalThis.curve_bn128 = null; +async function buildBn128(singleThread, plugins) { + if (!singleThread && globalThis.curve_bn128) return globalThis.curve_bn128; + let bn128wasm = {}; + if (!plugins) { + console.log("Using prebuilt bn128 wasm"); + const bn128wasmPrebuilt = await import("wasmcurves/build/bn128_wasm_gzip.js"); + bn128wasm.pq = bn128wasmPrebuilt.pq; + bn128wasm.pr = bn128wasmPrebuilt.pq; + bn128wasm.pG1gen = bn128wasmPrebuilt.pG1gen; + bn128wasm.pG1zero = bn128wasmPrebuilt.pG1zero; + bn128wasm.pG1b = bn128wasmPrebuilt.pG1b; + bn128wasm.pG2gen = bn128wasmPrebuilt.pG2gen; + bn128wasm.pG2zero = bn128wasmPrebuilt.pG2zero; + bn128wasm.pG2b = bn128wasmPrebuilt.pG2b; + bn128wasm.pOneT = bn128wasmPrebuilt.pOneT; + bn128wasm.prePSize = bn128wasmPrebuilt.prePSize; + bn128wasm.preQSize = bn128wasmPrebuilt.preQSize; + bn128wasm.n8q = 32; + bn128wasm.n8r = 32; + bn128wasm.q = bn128wasmPrebuilt.q; + bn128wasm.r = bn128wasmPrebuilt.r; + const compressedCode = Uint8Array.from(atob(bn128wasmPrebuilt.gzipCode), (c) => c.charCodeAt(0)); + const blob = new Blob([compressedCode]); + const ds = new DecompressionStream("gzip"); + const decompressedStream = blob.stream().pipeThrough(ds); + bn128wasm.code = await new Response(decompressedStream).bytes(); + } else { + const { ModuleBuilder } = await import("wasmbuilder"); + const { buildBn128: buildBn128wasm } = await import("wasmcurves"); + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBn128wasm(moduleBuilder); + if (plugins) plugins(moduleBuilder); + bn128wasm.code = moduleBuilder.build(); + bn128wasm.pq = moduleBuilder.modules.f1m.pq; + bn128wasm.pr = moduleBuilder.modules.frm.pq; + bn128wasm.pG1gen = moduleBuilder.modules.bn128.pG1gen; + bn128wasm.pG1zero = moduleBuilder.modules.bn128.pG1zero; + bn128wasm.pG1b = moduleBuilder.modules.bn128.pG1b; + bn128wasm.pG2gen = moduleBuilder.modules.bn128.pG2gen; + bn128wasm.pG2zero = moduleBuilder.modules.bn128.pG2zero; + bn128wasm.pG2b = moduleBuilder.modules.bn128.pG2b; + bn128wasm.pOneT = moduleBuilder.modules.bn128.pOneT; + bn128wasm.prePSize = moduleBuilder.modules.bn128.prePSize; + bn128wasm.preQSize = moduleBuilder.modules.bn128.preQSize; + bn128wasm.n8q = 32; + bn128wasm.n8r = 32; + bn128wasm.q = moduleBuilder.modules.bn128.q; + bn128wasm.r = moduleBuilder.modules.bn128.r; + } + const params = { + name: "bn128", + wasm: bn128wasm, + q: e("21888242871839275222246405745257275088696311157297823662689037894645226208583"), + r: e("21888242871839275222246405745257275088548364400416034343698204186575808495617"), + n8q: 32, + n8r: 32, + cofactorG2: e("30644e72e131a029b85045b68181585e06ceecda572a2489345f2299c0f9fa8d", 16), + singleThread: singleThread ? true : false + }; + const curve = await buildEngine(params); + curve.terminate = async function() { + if (!params.singleThread) { + globalThis.curve_bn128 = null; + await this.tm.terminate(); + } + }; + if (!singleThread) globalThis.curve_bn128 = curve; + return curve; +} +//#endregion +//#region src/bls12381.js +globalThis.curve_bls12381 = null; +async function buildBls12381(singleThread, plugins) { + if (!singleThread && globalThis.curve_bls12381) return globalThis.curve_bls12381; + const { ModuleBuilder } = await import("wasmbuilder"); + const { buildBls12381: buildBls12381wasm } = await import("wasmcurves"); + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBls12381wasm(moduleBuilder); + if (plugins) plugins(moduleBuilder); + const bls12381wasm = {}; + bls12381wasm.code = moduleBuilder.build(); + bls12381wasm.pq = moduleBuilder.modules.f1m.pq; + bls12381wasm.pr = moduleBuilder.modules.frm.pq; + bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen; + bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero; + bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b; + bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen; + bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero; + bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b; + bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT; + bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize; + bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize; + bls12381wasm.n8q = 48; + bls12381wasm.n8r = 32; + bls12381wasm.q = moduleBuilder.modules.bls12381.q; + bls12381wasm.r = moduleBuilder.modules.bls12381.r; + const params = { + name: "bls12381", + wasm: bls12381wasm, + q: e("1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab", 16), + r: e("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", 16), + n8q: 48, + n8r: 32, + cofactorG1: e("0x396c8c005555e1568c00aaab0000aaab", 16), + cofactorG2: e("0x5d543a95414e7f1091d50792876a202cd91de4547085abaa68a205b2e5a7ddfa628f1cb4d9e82ef21537e293a6691ae1616ec6e786f0c70cf1c38e31c7238e5", 16), + singleThread: singleThread ? true : false + }; + const curve = await buildEngine(params); + curve.terminate = async function() { + if (!params.singleThread) { + globalThis.curve_bls12381 = null; + await this.tm.terminate(); + } + }; + if (!singleThread) globalThis.curve_bls12381 = curve; + return curve; +} +//#endregion +//#region src/curves.js +var bls12381r = e("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", 16); +var bn128r = e("21888242871839275222246405745257275088548364400416034343698204186575808495617"); +var bls12381q = e("1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab", 16); +var bn128q = e("21888242871839275222246405745257275088696311157297823662689037894645226208583"); +async function getCurveFromR(r, singleThread, plugins) { + let curve; + if (eq(r, bn128r)) curve = await buildBn128(singleThread, plugins); + else if (eq(r, bls12381r)) curve = await buildBls12381(singleThread, plugins); + else throw new Error(`Curve not supported: ${toString(r)}`); + return curve; +} +async function getCurveFromQ(q, singleThread, plugins) { + let curve; + if (eq(q, bn128q)) curve = await buildBn128(singleThread, plugins); + else if (eq(q, bls12381q)) curve = await buildBls12381(singleThread, plugins); + else throw new Error(`Curve not supported: ${toString(q, 16)}`); + return curve; +} +async function getCurveFromName(name, singleThread, plugins) { + let curve; + const normName = normalizeName(name); + if ([ + "BN128", + "BN254", + "ALTBN128" + ].indexOf(normName) >= 0) curve = await buildBn128(singleThread, plugins); + else if (["BLS12381"].indexOf(normName) >= 0) curve = await buildBls12381(singleThread, plugins); + else throw new Error(`Curve not supported: ${name}`); + return curve; + function normalizeName(n) { + return n.toUpperCase().match(/[A-Za-z0-9]+/g).join(""); + } +} +//#endregion +//#region main.js +var Scalar = scalar_exports; +var utils = utils_exports; +//#endregion +export { BigBuffer, ChaCha, EC, ZqField as F1Field, ZqField, F2Field, F3Field, PolField, Scalar, buildBls12381, buildBn128, getCurveFromName, getCurveFromQ, getCurveFromR, utils }; diff --git a/build/browser/browser.iife.js b/build/browser/browser.iife.js new file mode 100644 index 0000000..b6294b3 --- /dev/null +++ b/build/browser/browser.iife.js @@ -0,0 +1,138 @@ +console.log(`browser iife`);var ffjavascript=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.create,n=Object.defineProperty,r=Object.getOwnPropertyDescriptor,i=Object.getOwnPropertyNames,a=Object.getPrototypeOf,o=Object.prototype.hasOwnProperty,s=(e,t)=>()=>(e&&(t=e(e=0)),t),c=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),l=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r},u=(e,t,a,s)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var c=i(t),l=0,u=c.length,d;lt[e]).bind(null,d),enumerable:!(s=r(t,d))||s.enumerable});return e},d=(e,r,i)=>(i=e==null?{}:t(a(e)),u(r||!e||!e.__esModule?n(i,`default`,{value:e,enumerable:!0}):i,e)),f=l({abs:()=>I,add:()=>k,band:()=>re,bitLength:()=>_,bits:()=>E,bor:()=>ie,bxor:()=>ae,div:()=>L,e:()=>h,eq:()=>z,exp:()=>F,fromArray:()=>g,fromRprBE:()=>de,fromRprLE:()=>ue,fromString:()=>m,geq:()=>ne,gt:()=>B,isNegative:()=>v,isOdd:()=>w,isZero:()=>y,land:()=>oe,leq:()=>V,lnot:()=>ce,lor:()=>se,lt:()=>te,mod:()=>R,mul:()=>M,naf:()=>T,neg:()=>j,neq:()=>ee,one:()=>W,pow:()=>P,shiftLeft:()=>b,shiftRight:()=>x,shl:()=>S,shr:()=>C,square:()=>N,sub:()=>A,toArray:()=>O,toLEBuff:()=>U,toNumber:()=>D,toRprBE:()=>H,toRprLE:()=>le,toString:()=>fe,zero:()=>pe}),p=[0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4];function m(e,t){if(!t||t==10)return BigInt(e);if(t==16)return e.slice(0,2)==`0x`?BigInt(e):BigInt(`0x`+e)}var h=m;function g(e,t){let n=BigInt(0);t=BigInt(t);for(let r=0;r>BigInt(t)}var S=b,C=x;function w(e){return(BigInt(e)&BigInt(1))==BigInt(1)}function T(e){let t=BigInt(e),n=[];for(;t;){if(t&BigInt(1)){let e=2-Number(t%BigInt(4));n.push(e),t-=BigInt(e)}else n.push(0);t>>=BigInt(1)}return n}function E(e){let t=BigInt(e),n=[];for(;t;)t&BigInt(1)?n.push(1):n.push(0),t>>=BigInt(1);return n}function D(e){if(e>BigInt(2**53-1))throw Error(`Number too big`);return Number(e)}function O(e,t){let n=[],r=BigInt(e);for(t=BigInt(t);r;)n.unshift(Number(r%t)),r/=t;return n}function k(e,t){return BigInt(e)+BigInt(t)}function A(e,t){return BigInt(e)-BigInt(t)}function j(e){return-BigInt(e)}function M(e,t){return BigInt(e)*BigInt(t)}function N(e){return BigInt(e)*BigInt(e)}function P(e,t){return BigInt(e)**BigInt(t)}function F(e,t){return BigInt(e)**BigInt(t)}function I(e){return BigInt(e)>=0?BigInt(e):-BigInt(e)}function L(e,t){return BigInt(e)/BigInt(t)}function R(e,t){return BigInt(e)%BigInt(t)}function z(e,t){return BigInt(e)==BigInt(t)}function ee(e,t){return BigInt(e)!=BigInt(t)}function te(e,t){return BigInt(e)BigInt(t)}function V(e,t){return BigInt(e)<=BigInt(t)}function ne(e,t){return BigInt(e)>=BigInt(t)}function re(e,t){return BigInt(e)&BigInt(t)}function ie(e,t){return BigInt(e)|BigInt(t)}function ae(e,t){return BigInt(e)^BigInt(t)}function oe(e,t){return BigInt(e)&&BigInt(t)}function se(e,t){return BigInt(e)||BigInt(t)}function ce(e){return!BigInt(e)}function le(e,t,n,r){let i=`0000000`+n.toString(16),a=new Uint32Array(e.buffer,e.byteOffset+t,r/4),o=((i.length-7)*4-1>>5)+1;for(let e=0;e>5)+1;for(let e=0;ei[i.length-t-1]=e.toString(16).padStart(8,`0`)),m(i.join(``),16)}function de(e,t,n){n||=e.byteLength,t||=0;let r=new DataView(e.buffer,e.byteOffset+t,n),i=Array(n/4);for(let e=0;e=0;)this.w[i]=this.F.square(this.w[i+1]),this.wi[i]=this.F.square(this.wi[i+1]),i--;this.roots=[],this._setRoots(15)}_setRoots(e){e>this.F.sqrt_s&&(e=this.s);for(let t=e;t>=0&&!this.roots[t];t--){let e=this.F.one,n=1<e.length&&([t,e]=[e,t]),t.length<=2||t.length0?Array(t).fill(this.F.zero).concat(e):-t>=e.length?[]:e.slice(-t)}eval2(e,t){let n=this.F.zero,r=this.F.one;for(let i=0;i>1),n.mul(t,i(e,s,r+a,a<<1,o>>1)))}}lagrange(e){let t=[this.F.one];for(let n=0;n>1,o=this._fft(e,t-1,n,r*2),s=this._fft(e,t-1,n+r,r*2),c=Array(i),l=this.F.one;for(let e=0;e0&&this.F.eq(e[t],this.F.zero);)t--;return e.slice(0,t+1)}eq(e,t){let n=this.reduce(e),r=this.reduce(t);if(n.length!=r.length)return!1;for(let e=0;e=0;r--)n[r]=this.F.add(this.F.mul(n[r+1],t),e[r+1]);return n}_next2Power(e){return e--,e|=e>>1,e|=e>>2,e|=e>>4,e|=e>>8,e|=e>>16,e++,e}toString(e){let t=this.normalize(e),n=``;for(let r=t.length-1;r>=0;r--)this.F.eq(e[r],this.F.zero)||(n!=``&&(n+=` + `),n+=e[r].toString(10),r>0&&(n+=`x`,r>1&&(n=n+`^`+r)));return n}normalize(e){let t=Array(e.length);for(let n=0;n2*o&&(l=this.sub(this.scaleX([this.F.one],2*o),this.mul(c,a)));let u=[],d=i,f,p,m=!1;for(;!m;)f=this.mul(d,c),u=this.add(u,this.scaleX(f,-2*o)),s>2*o?(p=this.mul(d,l),d=this.scaleX(p,-2*o),s=d.length-1):m=!0;return u}oneRoot(e,t){let n=G(e-1)+1,r=this.F.one,i=t;if(t>=e)throw Error(`Given 'i' should be lower than 'n'`);if(1<0;)i&!0&&(r=this.F.mul(r,this.w[n])),i>>=1,n--;return r}computeVanishingPolinomial(e,t){let n=1<>1,s=K(e,t,n-1,r,i*2),c=K(e,t,n-1,r+i,i*2),l=Array(a);for(let t=0;t>1,a=q(e,t.slice(0,i),n-1),o=q(e,t.slice(i),n-1),s=Array(r);for(let t=0;t>=1;return n}function _e(e,t){return(he[e>>>24]|he[e>>>16&255]<<8|he[e>>>8&255]<<16|he[e&255]<<24)>>>32-t}function ve(e,t){for(let n=0;nn){let t=e[n];e[n]=e[r],e[r]=t}}}function ye(e,t,n){let r;if(y(n))return e.zero;let i=T(n);if(i[i.length-1]==1)r=t;else if(i[i.length-1]==-1)r=e.neg(t);else throw Error(`invlaud NAF`);for(let n=i.length-2;n>=0;n--)r=e.double(r),i[n]==1?r=e.add(r,t):i[n]==-1&&(r=e.sub(r,t));return r}function be(e,t,n){if(y(n))return e.one;let r=E(n);if(r.length==0)return e.one;let i=t;for(let n=r.length-2;n>=0;n--)i=e.square(i),r[n]&&(i=e.mul(i,t));return i}function xe(e){if(e.m%2==1)if(z(R(e.p,4),1))if(z(R(e.p,8),1))if(z(R(e.p,16),1))Se(e);else if(z(R(e.p,16),9))Ce(e);else throw Error(`Field withot sqrt`);else if(z(R(e.p,8),5))we(e);else throw Error(`Field withot sqrt`);else z(R(e.p,4),3)&&Te(e);else{let t=R(P(e.p,e.m/2),4);t==1?Ee(e):t==3?De(e):Oe(e)}}function Se(e){for(e.sqrt_q=P(e.p,e.m),e.sqrt_s=0,e.sqrt_t=A(e.sqrt_q,1);!w(e.sqrt_t);)e.sqrt_s+=1,e.sqrt_t=L(e.sqrt_t,2);let t=e.one;for(;e.eq(t,e.one);){let n=e.random();e.sqrt_z=e.pow(n,e.sqrt_t),t=e.pow(e.sqrt_z,2**(e.sqrt_s-1))}e.sqrt_tm1d2=L(A(e.sqrt_t,1),2),e.sqrt=function(e){let t=this;if(t.isZero(e))return t.zero;let n=t.pow(e,t.sqrt_tm1d2),r=t.pow(t.mul(t.square(n),e),2**(t.sqrt_s-1));if(t.eq(r,t.negone))return null;let i=t.sqrt_s,a=t.mul(e,n),o=t.mul(a,n),s=t.sqrt_z;for(;!t.eq(o,t.one);){let e=t.square(o),r=1;for(;!t.eq(e,t.one);)e=t.square(e),r++;n=s;for(let e=0;e>>0,e[i]=(e[i]^e[t])>>>0,e[i]=(e[i]<<16|e[i]>>>16&65535)>>>0,e[r]=e[r]+e[i]>>>0,e[n]=(e[n]^e[r])>>>0,e[n]=(e[n]<<12|e[n]>>>20&4095)>>>0,e[t]=e[t]+e[n]>>>0,e[i]=(e[i]^e[t])>>>0,e[i]=(e[i]<<8|e[i]>>>24&255)>>>0,e[r]=e[r]+e[i]>>>0,e[n]=(e[n]^e[r])>>>0,e[n]=(e[n]<<7|e[n]>>>25&127)>>>0}function Ae(e){ke(e,0,4,8,12),ke(e,1,5,9,13),ke(e,2,6,10,14),ke(e,3,7,11,15),ke(e,0,5,10,15),ke(e,1,6,11,12),ke(e,2,7,8,13),ke(e,3,4,9,14)}var je=class{constructor(e){e||=[0,0,0,0,0,0,0,0],this.state=[1634760805,857760878,2036477234,1797285236,e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7],0,0,0,0],this.idx=16,this.buff=Array(16)}nextU32(){return this.idx==16&&this.update(),this.buff[this.idx++]}nextU64(){return k(M(this.nextU32(),4294967296),this.nextU32())}nextBool(){return(this.nextU32()&1)==1}update(){for(let e=0;e<16;e++)this.buff[e]=this.state[e];for(let e=0;e<10;e++)Ae(this.buff);for(let e=0;e<16;e++)this.buff[e]=this.buff[e]+this.state[e]>>>0;this.idx=0,this.state[12]=this.state[12]+1>>>0,this.state[12]==0&&(this.state[13]=this.state[13]+1>>>0,this.state[13]==0&&(this.state[14]=this.state[14]+1>>>0,this.state[14]==0&&(this.state[15]=this.state[15]+1>>>0)))}},Me=c(((e,t)=>{t.exports={}}));function Ne(e){let t=new Uint8Array(e);if(globalThis.crypto!==void 0)globalThis.crypto.getRandomValues(t);else if(typeof require==`function`)Me().randomFillSync(t);else throw Error(`No cryptographically secure random source available.`);return t}function Pe(){let e=Ne(32),t=new Uint32Array(e.buffer),n=[];for(let e=0;e<8;e++)n.push(t[e]);return n}var Fe=null;function Ie(){return Fe||(Fe=new je(Pe()),Fe)}var Le=class{constructor(e,t,n){this.F=t,this.G=e,this.opMulGF=n;let r=t.sqrt_t||t.t,i=t.sqrt_s||t.s,a=t.one;for(;t.eq(t.pow(a,t.half),t.one);)a=t.add(a,t.one);this.w=Array(i+1),this.wi=Array(i+1),this.w[i]=this.F.pow(a,r),this.wi[i]=this.F.inv(this.w[i]);let o=i-1;for(;o>=0;)this.w[o]=this.F.square(this.w[o+1]),this.wi[o]=this.F.square(this.wi[o+1]),o--;this.roots=[],this._setRoots(Math.min(i,15))}_setRoots(e){for(let t=e;t>=0&&!this.roots[t];t--){let e=this.F.one,n=1<>1,s=ze(e,t,n-1,r,i*2),c=ze(e,t,n-1,r+i,i*2),l=Array(a);for(let t=0;t>this.one,this.bitLength=_(this.p),this.mask=(this.one<>this.one;this.nqr=this.two;let n=this.pow(this.nqr,t);for(;!this.eq(n,this.negone);)this.nqr+=this.one,n=this.pow(this.nqr,t);for(this.s=0,this.t=this.negone;(this.t&this.one)==this.zero;)this.s+=1,this.t>>=this.one;this.nqr_to_t=this.pow(this.nqr,this.t),xe(this),this.FFT=new Le(this,this,this.mul.bind(this)),this.fft=this.FFT.fft.bind(this.FFT),this.ifft=this.FFT.ifft.bind(this.FFT),this.w=this.FFT.w,this.wi=this.FFT.wi,this.shift=this.square(this.nqr),this.k=this.exp(this.nqr,2**this.s)}e(e,t){let n;if(t?t==16&&(n=BigInt(`0x`+e)):n=BigInt(e),n<0){let e=-n;return e>=this.p&&(e%=this.p),this.p-e}else return n>=this.p?n%this.p:n}add(e,t){let n=e+t;return n>=this.p?n-this.p:n}sub(e,t){return e>=t?e-t:this.p-t+e}neg(e){return e&&this.p-e}mul(e,t){return e*t%this.p}mulScalar(e,t){return e*this.e(t)%this.p}square(e){return e*e%this.p}eq(e,t){return e==t}neq(e,t){return e!=t}lt(e,t){return(e>this.half?e-this.p:e)<(t>this.half?t-this.p:t)}gt(e,t){return(e>this.half?e-this.p:e)>(t>this.half?t-this.p:t)}leq(e,t){return(e>this.half?e-this.p:e)<=(t>this.half?t-this.p:t)}geq(e,t){return(e>this.half?e-this.p:e)>=(t>this.half?t-this.p:t)}div(e,t){return this.mul(e,this.inv(t))}idiv(e,t){if(!t)throw Error(`Division by zero`);return e/t}inv(e){if(!e)throw Error(`Division by zero`);let t=this.zero,n=this.p,r=this.one,i=e%this.p;for(;i;){let e=n/i;[t,r]=[r,t-e*r],[n,i]=[i,n-e*i]}return t=this.p?n-this.p:n}bor(e,t){let n=(e|t)&this.mask;return n>=this.p?n-this.p:n}bxor(e,t){let n=(e^t)&this.mask;return n>=this.p?n-this.p:n}bnot(e){let t=e^this.mask;return t>=this.p?t-this.p:t}shl(e,t){if(Number(t)=this.p?n-this.p:n}else{let n=this.p-t;return Number(n)>n:this.zero}}shr(e,t){if(Number(t)>t;{let n=this.p-t;if(Number(n)=this.p?t-this.p:t}else return 0}}land(e,t){return e&&t?this.one:this.zero}lor(e,t){return e||t?this.one:this.zero}lnot(e){return e?this.zero:this.one}sqrt_old(e){if(e==this.zero)return this.zero;if(this.pow(e,this.negone>>this.one)!=this.one)return null;let t=this.s,n=this.nqr_to_t,r=this.pow(e,this.t),i=this.pow(e,this.add(this.t,this.one)>>this.one);for(;r!=this.one;){let e=this.square(r),a=1;for(;e!=this.one;)a++,e=this.square(e);let o=n;for(let e=0;ethis.p>>this.one&&(i=this.neg(i)),i}normalize(e,t){if(e=BigInt(e,t),e<0){let t=-e;return t>=this.p&&(t%=this.p),this.p-t}else return e>=this.p?e%this.p:e}random(){let e=this.bitLength*2/8,t=this.zero;for(let n=0;nthis.half&&t==10?`-`+(this.p-e).toString(t):e.toString(t),n}isZero(e){return e==this.zero}fromRng(e){let t;do{t=this.zero;for(let n=0;n=this.p);return t=t*this.Ri%this.p,t}fft(e){return this.FFT.fft(e)}ifft(e){return this.FFT.ifft(e)}toRprLE(e,t,n){le(e,t,n,this.n64*8)}toRprBE(e,t,n){H(e,t,n,this.n64*8)}toRprBEM(e,t,n){return this.toRprBE(e,t,this.mul(this.R,n))}toRprLEM(e,t,n){return this.toRprLE(e,t,this.mul(this.R,n))}fromRprLE(e,t){return ue(e,t,this.n8)}fromRprBE(e,t){return de(e,t,this.n8)}fromRprLEM(e,t){return this.mul(this.fromRprLE(e,t),this.Ri)}fromRprBEM(e,t){return this.mul(this.fromRprBE(e,t),this.Ri)}toObject(e){return e}},Ve=class{constructor(e,t){this.type=`F2`,this.F=e,this.zero=[this.F.zero,this.F.zero],this.one=[this.F.one,this.F.zero],this.negone=this.neg(this.one),this.nonResidue=t,this.m=e.m*2,this.p=e.p,this.n64=e.n64*2,this.n32=this.n64*2,this.n8=this.n64*8,xe(this)}_mulByNonResidue(e){return this.F.mul(this.nonResidue,e)}copy(e){return[this.F.copy(e[0]),this.F.copy(e[1])]}add(e,t){return[this.F.add(e[0],t[0]),this.F.add(e[1],t[1])]}double(e){return this.add(e,e)}sub(e,t){return[this.F.sub(e[0],t[0]),this.F.sub(e[1],t[1])]}neg(e){return this.sub(this.zero,e)}conjugate(e){return[e[0],this.F.neg(e[1])]}mul(e,t){let n=this.F.mul(e[0],t[0]),r=this.F.mul(e[1],t[1]);return[this.F.add(n,this._mulByNonResidue(r)),this.F.sub(this.F.mul(this.F.add(e[0],e[1]),this.F.add(t[0],t[1])),this.F.add(n,r))]}inv(e){let t=this.F.square(e[0]),n=this.F.square(e[1]),r=this.F.sub(t,this._mulByNonResidue(n)),i=this.F.inv(r);return[this.F.mul(e[0],i),this.F.neg(this.F.mul(e[1],i))]}div(e,t){return this.mul(e,this.inv(t))}square(e){let t=this.F.mul(e[0],e[1]);return[this.F.sub(this.F.mul(this.F.add(e[0],e[1]),this.F.add(e[0],this._mulByNonResidue(e[1]))),this.F.add(t,this._mulByNonResidue(t))),this.F.add(t,t)]}isZero(e){return this.F.isZero(e[0])&&this.F.isZero(e[1])}eq(e,t){return this.F.eq(e[0],t[0])&&this.F.eq(e[1],t[1])}mulScalar(e,t){return ye(this,e,t)}pow(e,t){return be(this,e,t)}exp(e,t){return be(this,e,t)}toString(e){return`[ ${this.F.toString(e[0])} , ${this.F.toString(e[1])} ]`}fromRng(e){return[this.F.fromRng(e),this.F.fromRng(e)]}gt(e,t){return this.F.gt(e[0],t[0])?!0:this.F.gt(t[0],e[0])?!1:!!this.F.gt(e[1],t[1])}geq(e,t){return this.gt(e,t)||this.eq(e,t)}lt(e,t){return!this.geq(e,t)}leq(e,t){return!this.gt(e,t)}neq(e,t){return!this.eq(e,t)}random(){return[this.F.random(),this.F.random()]}toRprLE(e,t,n){this.F.toRprLE(e,t,n[0]),this.F.toRprLE(e,t+this.F.n8,n[1])}toRprBE(e,t,n){this.F.toRprBE(e,t,n[1]),this.F.toRprBE(e,t+this.F.n8,n[0])}toRprLEM(e,t,n){this.F.toRprLEM(e,t,n[0]),this.F.toRprLEM(e,t+this.F.n8,n[1])}toRprBEM(e,t,n){this.F.toRprBEM(e,t,n[1]),this.F.toRprBEM(e,t+this.F.n8,n[0])}fromRprLE(e,t){return t||=0,[this.F.fromRprLE(e,t),this.F.fromRprLE(e,t+this.F.n8)]}fromRprBE(e,t){t||=0;let n=this.F.fromRprBE(e,t);return[this.F.fromRprBE(e,t+this.F.n8),n]}fromRprLEM(e,t){return t||=0,[this.F.fromRprLEM(e,t),this.F.fromRprLEM(e,t+this.F.n8)]}fromRprBEM(e,t){t||=0;let n=this.F.fromRprBEM(e,t);return[this.F.fromRprBEM(e,t+this.F.n8),n]}toObject(e){return e}},He=class{constructor(e,t){this.type=`F3`,this.F=e,this.zero=[this.F.zero,this.F.zero,this.F.zero],this.one=[this.F.one,this.F.zero,this.F.zero],this.negone=this.neg(this.one),this.nonResidue=t,this.m=e.m*3,this.p=e.p,this.n64=e.n64*3,this.n32=this.n64*2,this.n8=this.n64*8}_mulByNonResidue(e){return this.F.mul(this.nonResidue,e)}copy(e){return[this.F.copy(e[0]),this.F.copy(e[1]),this.F.copy(e[2])]}add(e,t){return[this.F.add(e[0],t[0]),this.F.add(e[1],t[1]),this.F.add(e[2],t[2])]}double(e){return this.add(e,e)}sub(e,t){return[this.F.sub(e[0],t[0]),this.F.sub(e[1],t[1]),this.F.sub(e[2],t[2])]}neg(e){return this.sub(this.zero,e)}mul(e,t){let n=this.F.mul(e[0],t[0]),r=this.F.mul(e[1],t[1]),i=this.F.mul(e[2],t[2]);return[this.F.add(n,this._mulByNonResidue(this.F.sub(this.F.mul(this.F.add(e[1],e[2]),this.F.add(t[1],t[2])),this.F.add(r,i)))),this.F.add(this.F.sub(this.F.mul(this.F.add(e[0],e[1]),this.F.add(t[0],t[1])),this.F.add(n,r)),this._mulByNonResidue(i)),this.F.add(this.F.sub(this.F.mul(this.F.add(e[0],e[2]),this.F.add(t[0],t[2])),this.F.add(n,i)),r)]}inv(e){let t=this.F.square(e[0]),n=this.F.square(e[1]),r=this.F.square(e[2]),i=this.F.mul(e[0],e[1]),a=this.F.mul(e[0],e[2]),o=this.F.mul(e[1],e[2]),s=this.F.sub(t,this._mulByNonResidue(o)),c=this.F.sub(this._mulByNonResidue(r),i),l=this.F.sub(n,a),u=this.F.inv(this.F.add(this.F.mul(e[0],s),this._mulByNonResidue(this.F.add(this.F.mul(e[2],c),this.F.mul(e[1],l)))));return[this.F.mul(u,s),this.F.mul(u,c),this.F.mul(u,l)]}div(e,t){return this.mul(e,this.inv(t))}square(e){let t=this.F.square(e[0]),n=this.F.mul(e[0],e[1]),r=this.F.add(n,n),i=this.F.square(this.F.add(this.F.sub(e[0],e[1]),e[2])),a=this.F.mul(e[1],e[2]),o=this.F.add(a,a),s=this.F.square(e[2]);return[this.F.add(t,this._mulByNonResidue(o)),this.F.add(r,this._mulByNonResidue(s)),this.F.sub(this.F.add(this.F.add(r,i),o),this.F.add(t,s))]}isZero(e){return this.F.isZero(e[0])&&this.F.isZero(e[1])&&this.F.isZero(e[2])}eq(e,t){return this.F.eq(e[0],t[0])&&this.F.eq(e[1],t[1])&&this.F.eq(e[2],t[2])}affine(e){return[this.F.affine(e[0]),this.F.affine(e[1]),this.F.affine(e[2])]}mulScalar(e,t){return ye(this,e,t)}pow(e,t){return be(this,e,t)}exp(e,t){return be(this,e,t)}toString(e){return`[ ${this.F.toString(e[0])} , ${this.F.toString(e[1])}, ${this.F.toString(e[2])} ]`}fromRng(e){return[this.F.fromRng(e),this.F.fromRng(e),this.F.fromRng(e)]}gt(e,t){return this.F.gt(e[0],t[0])?!0:this.F.gt(t[0],e[0])?!1:this.F.gt(e[1],t[1])?!0:this.F.gt(t[1],e[1])?!1:!!this.F.gt(e[2],t[2])}geq(e,t){return this.gt(e,t)||this.eq(e,t)}lt(e,t){return!this.geq(e,t)}leq(e,t){return!this.gt(e,t)}neq(e,t){return!this.eq(e,t)}random(){return[this.F.random(),this.F.random(),this.F.random()]}toRprLE(e,t,n){this.F.toRprLE(e,t,n[0]),this.F.toRprLE(e,t+this.F.n8,n[1]),this.F.toRprLE(e,t+this.F.n8*2,n[2])}toRprBE(e,t,n){this.F.toRprBE(e,t,n[2]),this.F.toRprBE(e,t+this.F.n8,n[1]),this.F.toRprBE(e,t+this.F.n8*2,n[0])}toRprLEM(e,t,n){this.F.toRprLEM(e,t,n[0]),this.F.toRprLEM(e,t+this.F.n8,n[1]),this.F.toRprLEM(e,t+this.F.n8*2,n[2])}toRprBEM(e,t,n){this.F.toRprBEM(e,t,n[2]),this.F.toRprBEM(e,t+this.F.n8,n[1]),this.F.toRprBEM(e,t+this.F.n8*2,n[0])}fromRprLE(e,t){return t||=0,[this.F.fromRprLE(e,t),this.F.fromRprLE(e,t+this.n8),this.F.fromRprLE(e,t+this.n8*2)]}fromRprBE(e,t){t||=0;let n=this.F.fromRprBE(e,t),r=this.F.fromRprBE(e,t+this.n8);return[this.F.fromRprBE(e,t+this.n8*2),r,n]}fromRprLEM(e,t){return t||=0,[this.F.fromRprLEM(e,t),this.F.fromRprLEM(e,t+this.n8),this.F.fromRprLEM(e,t+this.n8*2)]}fromRprBEM(e,t){t||=0;let n=this.F.fromRprBEM(e,t),r=this.F.fromRprBEM(e,t+this.n8);return[this.F.fromRprBEM(e,t+this.n8*2),r,n]}toObject(e){return e}};function Ue(e,t){if(Array.isArray(t)){for(let n=t.length-1;n>=0;n--)if(!e.F.isZero(t[n]))return Ue(e.F,t[n]);return 0}else return B(t,e.neg(t))}var We=class{constructor(e,t){this.F=e,this.g=t,this.g.length==2&&(this.g[2]=this.F.one),this.zero=[this.F.zero,this.F.one,this.F.zero]}add(e,t){let n=this.F;if(this.eq(e,this.zero))return t;if(this.eq(t,this.zero))return e;let r=[,,,],i=n.square(e[2]),a=n.square(t[2]),o=n.mul(e[0],a),s=n.mul(t[0],i),c=n.mul(e[2],i),l=n.mul(t[2],a),u=n.mul(e[1],l),d=n.mul(t[1],c);if(n.eq(o,s)&&n.eq(u,d))return this.double(e);let f=n.sub(s,o),p=n.sub(d,u),m=n.square(n.add(f,f)),h=n.mul(f,m),g=n.add(p,p),_=n.mul(o,m);r[0]=n.sub(n.sub(n.square(g),h),n.add(_,_));let v=n.mul(u,h);return r[1]=n.sub(n.mul(g,n.sub(_,r[0])),n.add(v,v)),r[2]=n.mul(f,n.sub(n.square(n.add(e[2],t[2])),n.add(i,a))),r}neg(e){return[e[0],this.F.neg(e[1]),e[2]]}sub(e,t){return this.add(e,this.neg(t))}double(e){let t=this.F,n=[,,,];if(this.eq(e,this.zero))return e;let r=t.square(e[0]),i=t.square(e[1]),a=t.square(i),o=t.sub(t.square(t.add(e[0],i)),t.add(r,a));o=t.add(o,o);let s=t.add(t.add(r,r),r),c=t.square(s);n[0]=t.sub(c,t.add(o,o));let l=t.add(a,a);l=t.add(l,l),l=t.add(l,l),n[1]=t.sub(t.mul(s,t.sub(o,n[0])),l);let u=t.mul(e[1],e[2]);return n[2]=t.add(u,u),n}timesScalar(e,t){return ye(this,e,t)}mulScalar(e,t){return ye(this,e,t)}affine(e){let t=this.F;if(this.isZero(e))return this.zero;if(t.eq(e[2],t.one))return e;{let n=t.inv(e[2]),r=t.square(n),i=t.mul(r,n),a=[,,,];return a[0]=t.mul(e[0],r),a[1]=t.mul(e[1],i),a[2]=t.one,a}}multiAffine(e){let t=Object.keys(e),n=this.F,r=Array(t.length+1);r[0]=n.one;for(let i=0;i=0;i--)if(n.eq(e[t[i]][2],n.zero))r[i]=r[i+1],e[t[i]]=this.zero;else{let a=n.mul(r[i],r[i+1]);r[i]=n.mul(e[t[i]][2],r[i+1]);let o=n.square(a),s=n.mul(o,a);e[t[i]][0]=n.mul(e[t[i]][0],o),e[t[i]][1]=n.mul(e[t[i]][1],s),e[t[i]][2]=n.one}}eq(e,t){let n=this.F;if(this.F.eq(e[2],this.F.zero))return this.F.eq(t[2],this.F.zero);if(this.F.eq(t[2],this.F.zero))return!1;let r=n.square(e[2]),i=n.square(t[2]),a=n.mul(e[0],i),o=n.mul(t[0],r),s=n.mul(e[2],r),c=n.mul(t[2],i),l=n.mul(e[1],c),u=n.mul(t[1],s);return n.eq(a,o)&&n.eq(l,u)}isZero(e){return this.F.isZero(e[2])}toString(e){let t=this.affine(e);return`[ ${this.F.toString(t[0])} , ${this.F.toString(t[1])} ]`}fromRng(e){let t=this.F,n=[],r;do{n[0]=t.fromRng(e),r=e.nextBool();let i=t.add(t.mul(t.square(n[0]),n[0]),this.b);n[1]=t.sqrt(i)}while(n[1]==null||t.isZero[n]);let i=Ue(t,n[1]);return r^i&&(n[1]=t.neg(n[1])),n[2]=t.one,this.cofactor&&(n=this.mulScalar(n,this.cofactor)),n=this.affine(n),n}toRprLE(e,t,n){if(n=this.affine(n),this.isZero(n)){new Uint8Array(e,t,this.F.n8*2).fill(0);return}this.F.toRprLE(e,t,n[0]),this.F.toRprLE(e,t+this.F.n8,n[1])}toRprBE(e,t,n){if(n=this.affine(n),this.isZero(n)){new Uint8Array(e,t,this.F.n8*2).fill(0);return}this.F.toRprBE(e,t,n[0]),this.F.toRprBE(e,t+this.F.n8,n[1])}toRprLEM(e,t,n){if(n=this.affine(n),this.isZero(n)){new Uint8Array(e,t,this.F.n8*2).fill(0);return}this.F.toRprLEM(e,t,n[0]),this.F.toRprLEM(e,t+this.F.n8,n[1])}toRprLEJM(e,t,n){if(n=this.affine(n),this.isZero(n)){new Uint8Array(e,t,this.F.n8*2).fill(0);return}this.F.toRprLEM(e,t,n[0]),this.F.toRprLEM(e,t+this.F.n8,n[1]),this.F.toRprLEM(e,t+2*this.F.n8,n[2])}toRprBEM(e,t,n){if(n=this.affine(n),this.isZero(n)){new Uint8Array(e,t,this.F.n8*2).fill(0);return}this.F.toRprBEM(e,t,n[0]),this.F.toRprBEM(e,t+this.F.n8,n[1])}fromRprLE(e,t){t||=0;let n=this.F.fromRprLE(e,t),r=this.F.fromRprLE(e,t+this.F.n8);return this.F.isZero(n)&&this.F.isZero(r)?this.zero:[n,r,this.F.one]}fromRprBE(e,t){t||=0;let n=this.F.fromRprBE(e,t),r=this.F.fromRprBE(e,t+this.F.n8);return this.F.isZero(n)&&this.F.isZero(r)?this.zero:[n,r,this.F.one]}fromRprLEM(e,t){t||=0;let n=this.F.fromRprLEM(e,t),r=this.F.fromRprLEM(e,t+this.F.n8);return this.F.isZero(n)&&this.F.isZero(r)?this.zero:[n,r,this.F.one]}fromRprLEJM(e,t){t||=0;let n=this.F.fromRprLEM(e,t),r=this.F.fromRprLEM(e,t+this.F.n8),i=this.F.fromRprLEM(e,t+this.F.n8*2);return this.F.isZero(n)&&this.F.isZero(r)?this.zero:[n,r,i]}fromRprBEM(e,t){t||=0;let n=this.F.fromRprBEM(e,t),r=this.F.fromRprBEM(e,t+this.F.n8);return this.F.isZero(n)&&this.F.isZero(r)?this.zero:[n,r,this.F.one]}fromRprCompressed(e,t){let n=this.F,r=new Uint8Array(e.buffer,t,n.n8);if(r[0]&64)return this.zero;let i=[,,,],a=(r[0]&128)!=0;r[0]&=127,i[0]=n.fromRprBE(e,t),a&&(r[0]|=128);let o=n.add(n.mul(n.square(i[0]),i[0]),this.b);if(i[1]=n.sqrt(o),i[1]===null)throw Error(`Invalid Point!`);return a^Ue(n,i[1])&&(i[1]=n.neg(i[1])),i[2]=n.one,i}toRprCompressed(e,t,n){n=this.affine(n);let r=new Uint8Array(e.buffer,t,this.F.n8);if(this.isZero(n)){r.fill(0),r[0]=64;return}this.F.toRprBE(e,t,n[0]),Ue(this.F,n[1])&&(r[0]|=128)}fromRprUncompressed(e,t){return e[0]&64?this.zero:this.fromRprBE(e,t)}toRprUncompressed(e,t,n){this.toRprBE(e,t,n),this.isZero(n)&&(e[t]=e[t]|64)}},Ge=l({array2buffer:()=>it,beBuff2int:()=>Je,beInt2Buff:()=>Ye,bitReverse:()=>nt,buffReverseBits:()=>rt,buffer2array:()=>at,leBuff2int:()=>Xe,leInt2Buff:()=>Ze,log2:()=>J,stringifyBigInts:()=>Ke,stringifyFElements:()=>Qe,unstringifyBigInts:()=>qe,unstringifyFElements:()=>$e});function Ke(e){if(typeof e==`bigint`||e.eq!==void 0)return e.toString(10);if(e instanceof Uint8Array)return ue(e,0);if(Array.isArray(e))return e.map(Ke);if(typeof e==`object`){let t={};return Object.keys(e).forEach(n=>{t[n]=Ke(e[n])}),t}else return e}function qe(e){if(typeof e==`string`&&/^[0-9]+$/.test(e)||typeof e==`string`&&/^0x[0-9a-fA-F]+$/.test(e))return BigInt(e);if(Array.isArray(e))return e.map(qe);if(typeof e==`object`){if(e===null)return null;let t={};return Object.keys(e).forEach(n=>{t[n]=qe(e[n])}),t}else return e}function Je(e){let t=BigInt(0),n=e.length,r=0,i=new DataView(e.buffer,e.byteOffset,e.byteLength);for(;n>0;)n>=4?(n-=4,t+=BigInt(i.getUint32(n))<=2?(n-=2,t+=BigInt(i.getUint16(n))<0;)a-4>=0?(a-=4,i.setUint32(a,Number(n&BigInt(4294967295))),n>>=BigInt(32)):a-2>=0?(a-=2,i.setUint16(a,Number(n&BigInt(65535))),n>>=BigInt(16)):(--a,i.setUint8(a,Number(n&BigInt(255))),n>>=BigInt(8));if(n)throw Error(`Number does not fit in this length`);return r}function Xe(e){let t=BigInt(0),n=0,r=new DataView(e.buffer,e.byteOffset,e.byteLength);for(;n>=BigInt(32)):a+2<=t?(i.setUint16(a,Number(n&BigInt(65535)),!0),a+=2,n>>=BigInt(16)):(i.setUint8(a,Number(n&BigInt(255)),!0),a+=1,n>>=BigInt(8));if(n)throw Error(`Number does not fit in this length`);return r}function Qe(e,t){if(typeof t==`bigint`||t.eq!==void 0)return t.toString(10);if(t instanceof Uint8Array)return e.toString(e.e(t));if(Array.isArray(t))return t.map(Qe.bind(this,e));if(typeof t==`object`){let n={};return Object.keys(t).forEach(r=>{n[r]=Qe(e,t[r])}),n}else return t}function $e(e,t){if(typeof t==`string`&&/^[0-9]+$/.test(t)||typeof t==`string`&&/^0x[0-9a-fA-F]+$/.test(t))return e.e(t);if(Array.isArray(t))return t.map($e.bind(this,e));if(typeof t==`object`){if(t===null)return null;let n={};return Object.keys(t).forEach(r=>{n[r]=$e(e,t[r])}),n}else return t}var et=[];for(let e=0;e<256;e++)et[e]=tt(e,8);function tt(e,t){let n=0,r=e;for(let e=0;e>=1;return n}function nt(e,t){return(et[e>>>24]|et[e>>>16&255]<<8|et[e>>>8&255]<<16|et[e&255]<<24)>>>32-t}function J(e){return(e&4294901760?(e&=4294901760,16):0)|(e&4278255360?(e&=4278255360,8):0)|(e&4042322160?(e&=4042322160,4):0)|(e&3435973836?(e&=3435973836,2):0)|(e&2863311530)!=0}function rt(e,t){let n=e.byteLength/t,r=J(n);if(n!=1<n){let r=e.slice(i*t,(i+1)*t);e.set(e.slice(n*t,(n+1)*t),i*t),e.set(r,n*t)}}}function it(e,t){let n=new Uint8Array(t*e.length);for(let r=0;r0;){let t=s+c>Y?Y-s:c,n=new Uint8Array(this.buffers[o].buffer,this.buffers[o].byteOffset+s,t);if(t==r)return n.slice();a||=r<=Y?new Uint8Array(r):new e(r),a.set(n,r-c),c-=t,o++,s=0}return a}set(t,n){n===void 0&&(n=0);let r=t.byteLength;if(r==0)return;let i=Math.floor(n/Y);if(i==Math.floor((n+r-1)/Y))return t instanceof e&&t.buffers.length==1?this.buffers[i].set(t.buffers[0],n%Y):this.buffers[i].set(t,n%Y);let a=i,o=n%Y,s=r;for(;s>0;){let e=o+s>Y?Y-o:s,n=t.slice(r-s,r-s+e);new Uint8Array(this.buffers[a].buffer,this.buffers[a].byteOffset+o,e).set(n),s-=e,a++,o=0}}};function ot(e,t,n,r){return async function(i){let a=Math.floor(i.byteLength/n);if(a*n!==i.byteLength)throw Error(`Invalid buffer size`);let o=Math.floor(a/e.concurrency),s=[];for(let c=0;c=0;e--)this.w[e]=this.square(this.w[e+1]);if(!this.eq(this.w[0],this.one))throw Error(`Error calculating roots of unity`);this.batchToMontgomery=ot(e,t+`_batchToMontgomery`,this.n8,this.n8),this.batchFromMontgomery=ot(e,t+`_batchFromMontgomery`,this.n8,this.n8)}op2(e,t,n){return this.tm.setBuff(this.pOp1,t),this.tm.setBuff(this.pOp2,n),this.tm.instance.exports[this.prefix+e](this.pOp1,this.pOp2,this.pOp3),this.tm.getBuff(this.pOp3,this.n8)}op2Bool(e,t,n){return this.tm.setBuff(this.pOp1,t),this.tm.setBuff(this.pOp2,n),!!this.tm.instance.exports[this.prefix+e](this.pOp1,this.pOp2)}op1(e,t){return this.tm.setBuff(this.pOp1,t),this.tm.instance.exports[this.prefix+e](this.pOp1,this.pOp3),this.tm.getBuff(this.pOp3,this.n8)}op1Bool(e,t){return this.tm.setBuff(this.pOp1,t),!!this.tm.instance.exports[this.prefix+e](this.pOp1,this.pOp3)}add(e,t){return this.op2(`_add`,e,t)}eq(e,t){return this.op2Bool(`_eq`,e,t)}isZero(e){return this.op1Bool(`_isZero`,e)}sub(e,t){return this.op2(`_sub`,e,t)}neg(e){return this.op1(`_neg`,e)}inv(e){return this.op1(`_inverse`,e)}toMontgomery(e){return this.op1(`_toMontgomery`,e)}fromMontgomery(e){return this.op1(`_fromMontgomery`,e)}mul(e,t){return this.op2(`_mul`,e,t)}div(e,t){return this.tm.setBuff(this.pOp1,e),this.tm.setBuff(this.pOp2,t),this.tm.instance.exports[this.prefix+`_inverse`](this.pOp2,this.pOp2),this.tm.instance.exports[this.prefix+`_mul`](this.pOp1,this.pOp2,this.pOp3),this.tm.getBuff(this.pOp3,this.n8)}square(e){return this.op1(`_square`,e)}isSquare(e){return this.op1Bool(`_isSquare`,e)}sqrt(e){return this.op1(`_sqrt`,e)}exp(e,t){return t instanceof Uint8Array||(t=U(h(t))),this.tm.setBuff(this.pOp1,e),this.tm.setBuff(this.pOp2,t),this.tm.instance.exports[this.prefix+`_exp`](this.pOp1,this.pOp2,t.byteLength,this.pOp3),this.tm.getBuff(this.pOp3,this.n8)}isNegative(e){return this.op1Bool(`_isNegative`,e)}e(e,t){if(e instanceof Uint8Array)return e;let n=h(e,t);v(n)?(n=j(n),B(n,this.p)&&(n=R(n,this.p)),n=A(this.p,n)):B(n,this.p)&&(n=R(n,this.p));let r=Ze(n,this.n8);return this.toMontgomery(r)}toString(e,t){return fe(ue(this.fromMontgomery(e),0),t)}fromRng(e){let t,n=new Uint8Array(this.n8);do{t=pe;for(let n=0;nn.buffer.byteLength){let i=n.buffer.byteLength/65536,a=Math.floor((r[0]+t)/65536)+1;a>e&&(a=e),n.grow(a-i)}return i}function l(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=c(t.byteLength);return o().set(t,n),n}function u(e,t){return new Uint8Array(n.buffer,e,t)}function d(e,t){o().set(t instanceof Uint8Array?t:new Uint8Array(t),e)}function f(e){if(e[0].cmd===`INIT`)return s(e[0]);let n=[],r=[],i=a()[0];for(let i=0;i{(function(n,r){typeof e==`object`&&t!==void 0?r(e):typeof define==`function`&&define.amd?define([`exports`],r):(n=typeof globalThis<`u`?globalThis:n||self,r(n.workerpool={}))})(e,(function(e){"use strict";var t={},n={exports:{}};(function(e){var t=function(e){return e!==void 0&&e.versions!=null&&e.versions.node!=null&&e+``==`[object process]`};e.exports.isNode=t,e.exports.platform=typeof process<`u`&&t(process)?`node`:`browser`;var n=e.exports.platform===`node`&&Me();e.exports.isMainThread=e.exports.platform===`node`?(!n||n.isMainThread)&&!process.connected:typeof Window<`u`,e.exports.cpus=e.exports.platform===`browser`?self.navigator.hardwareConcurrency:Me().cpus().length})(n);var r=n.exports;function i(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:i}}throw TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var a,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,a=e},f:function(){try{o||n.return==null||n.return()}finally{if(s)throw a}}}}function d(e,t,n){return(t=x(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function f(e){return f=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},f(e)}function p(e,t){if(typeof t!=`function`&&t!==null)throw TypeError(`Super expression must either be null or a function`);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,`prototype`,{writable:!1}),t&&y(e,t)}function m(e){try{return Function.toString.call(e).indexOf(`[native code]`)!==-1}catch{return typeof e==`function`}}function h(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch{}return(h=function(){return!!e})()}function g(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function _(e){for(var t=1;t= 11.7.0 required`);return e}function B(){if(typeof Worker!=`function`&&((typeof Worker>`u`?`undefined`:S(Worker))!==`object`||typeof Worker.prototype.constructor!=`function`))throw Error(`WorkerPool: Web Workers not supported`)}function V(){try{return Me()}catch(e){if(S(e)===`object`&&e!==null&&e.code===`MODULE_NOT_FOUND`)return null;throw e}}function ne(){if(P.platform===`browser`){if(typeof Blob>`u`)throw Error(`Blob not supported by the browser`);if(!window.URL||typeof window.URL.createObjectURL!=`function`)throw Error(`URL.createObjectURL not supported by the browser`);var e=new Blob([M()],{type:`text/javascript`});return window.URL.createObjectURL(e)}else return __dirname+`/worker.js`}function re(e,t){if(t.workerType===`web`)return B(),ie(e,t.workerOpts,Worker);if(t.workerType===`thread`)return n=te(),ae(e,n,t);if(t.workerType===`process`||!t.workerType)return oe(e,se(t),Me());if(P.platform===`browser`)return B(),ie(e,t.workerOpts,Worker);var n=V();return n?ae(e,n,t):oe(e,se(t),Me())}function ie(e,t,n){F(t,R,`workerOpts`);var r=new n(e,t);return r.isBrowserWorker=!0,r.on=function(e,t){this.addEventListener(e,function(e){t(e.data)})},r.send=function(e,t){this.postMessage(e,t)},r}function ae(e,t,n){F(n?.workerThreadOpts,L,`workerThreadOpts`);var r=new t.Worker(e,_({stdout:n?.emitStdStreams??!1,stderr:n?.emitStdStreams??!1},n?.workerThreadOpts));return r.isWorkerThread=!0,r.send=function(e,t){this.postMessage(e,t)},r.kill=function(){return this.terminate(),!0},r.disconnect=function(){this.terminate()},n!=null&&n.emitStdStreams&&(r.stdout.on(`data`,function(e){return r.emit(`stdout`,e)}),r.stderr.on(`data`,function(e){return r.emit(`stderr`,e)})),r}function oe(e,t,n){F(t.forkOpts,I,`forkOpts`);var r=n.fork(e,t.forkArgs,t.forkOpts),i=r.send;return r.send=function(e){return i.call(r,e)},t.emitStdStreams&&(r.stdout.on(`data`,function(e){return r.emit(`stdout`,e)}),r.stderr.on(`data`,function(e){return r.emit(`stderr`,e)})),r.isChildProcess=!0,r}function se(e){e||={};var t=process.execArgv.join(` `),n=t.indexOf(`--inspect`)!==-1,r=t.indexOf(`--debug-brk`)!==-1,i=[];return n&&(i.push(`--inspect=`+e.debugPort),r&&i.push(`--debug-brk`)),process.execArgv.forEach(function(e){e.indexOf(`--max-old-space-size`)>-1&&i.push(e)}),Object.assign({},e,{forkArgs:e.forkArgs,forkOpts:Object.assign({},e.forkOpts,{execArgv:(e.forkOpts&&e.forkOpts.execArgv||[]).concat(i),stdio:e.emitStdStreams?`pipe`:void 0})})}function ce(e){for(var t=Error(``),n=Object.keys(e),r=0;r0},H.prototype.terminate=function(e,t){var n=this;if(e){for(var r in this.processing)this.processing[r]!==void 0&&this.processing[r].resolver.reject(Error(`Worker terminated`));this.processing=Object.create(null)}for(var i=0,a=Object.values(n.tracking);i=e)throw Error(`WorkerPool debug port limit reached: `+t+`>= `+e);return this.ports[t]=!0,this.length++,t},t.prototype.releasePort=function(e){delete this.ports[e],this.length--},me}var q,he;function ge(){if(he)return q;he=1;var e=O().Promise,t=fe,n=r,i=W(),a=i.FIFOQueue,o=i.LIFOQueue,s=new(K());function c(e,r){typeof e==`string`?this.script=e||null:(this.script=null,r=e),this.workers=[],this.taskQueue=this._createQueue(r&&r.queueStrategy||`fifo`),r||={},this.forkArgs=Object.freeze(r.forkArgs||[]),this.forkOpts=Object.freeze(r.forkOpts||{}),this.workerOpts=Object.freeze(r.workerOpts||{}),this.workerThreadOpts=Object.freeze(r.workerThreadOpts||{}),this.debugPortStart=r.debugPortStart||43210,this.nodeWorker=r.nodeWorker,this.workerType=r.workerType||r.nodeWorker||`auto`,this.maxQueueSize=r.maxQueueSize||1/0,this.workerTerminateTimeout=r.workerTerminateTimeout||1e3,this.onCreateWorker=r.onCreateWorker||function(){return null},this.onTerminateWorker=r.onTerminateWorker||function(){return null},this.emitStdStreams=r.emitStdStreams||!1,r&&`maxWorkers`in r?(l(r.maxWorkers),this.maxWorkers=r.maxWorkers):this.maxWorkers=Math.max((n.cpus||4)-1,1),r&&`minWorkers`in r&&(r.minWorkers===`max`?this.minWorkers=this.maxWorkers:(u(r.minWorkers),this.minWorkers=r.minWorkers,this.maxWorkers=Math.max(this.minWorkers,this.maxWorkers)),this._ensureMinWorkers()),this._boundNext=this._next.bind(this),this.workerType===`thread`&&t.ensureWorkerThreads()}c.prototype.exec=function(t,n,r){if(n&&!Array.isArray(n))throw TypeError(`Array expected as argument "params"`);if(typeof t==`string`){var i=e.defer();if(this.taskQueue.size()>=this.maxQueueSize)throw Error(`Max queue size of `+this.maxQueueSize+` reached`);var a={method:t,params:n,resolver:i,timeout:null,options:r};this.taskQueue.push(a);var o=i.promise.timeout,s=this.taskQueue;return i.promise.timeout=function(e){return s.contains(a)?(a.timeout=e,i.promise):o.call(i.promise,e)},this._next(),i.promise}else if(typeof t==`function`)return this.exec(`run`,[String(t),n],r);else throw TypeError(`Function or string expected as argument "method"`)},c.prototype.proxy=function(){if(arguments.length>0)throw Error(`No arguments expected`);var e=this;return this.exec(`methods`).then(function(t){var n={};return t.forEach(function(t){n[t]=function(){return e.exec(t,Array.prototype.slice.call(arguments))}}),n})},c.prototype._next=function(){if(this.taskQueue.size()>0){var e=this._getWorker();if(e){var t=this,n=this.taskQueue.pop();if(n.resolver.promise.pending){var r=e.exec(n.method,n.params,n.resolver,n.options).then(t._boundNext).catch(function(){if(e.terminated)return t._removeWorker(e)}).then(function(){t._next()});typeof n.timeout==`number`&&r.timeout(n.timeout)}else t._next()}}},c.prototype._getWorker=function(){for(var e=this.workers,t=0;t0;){var a=i.pop();if(a)a.resolver.reject(Error(`Pool terminated`));else break}i.clear();var o=function(e){s.releasePort(e.debugPort),this._removeWorkerFromList(e)}.bind(this),c=[];return this.workers.slice().forEach(function(e){var i=e.terminateAndNotify(t,n).then(o).always(function(){r.onTerminateWorker({forkArgs:e.forkArgs,forkOpts:e.forkOpts,workerThreadOpts:e.workerThreadOpts,script:e.script})});c.push(i)}),e.all(c)},c.prototype.stats=function(){var e=this.workers.length,t=this.workers.filter(function(e){return e.busy()}).length;return{totalWorkers:e,busyWorkers:t,idleWorkers:e-t,pendingTasks:this.taskQueue.size(),activeTasks:t}},c.prototype._ensureMinWorkers=function(){if(this.minWorkers)for(var e=this.workers.length;e= 1`)}function u(e){if(!d(e)||!f(e)||e<0)throw TypeError(`Option minWorkers must be an integer number >= 0`)}function d(e){return typeof e==`number`}function f(e){return Math.round(e)==e}return q=c,q}var _e={},ve,ye;function be(){if(ye)return ve;ye=1;function e(e,t){this.message=e,this.transfer=t}return ve=e,ve}var xe;function Se(){return xe?_e:(xe=1,(function(e){var t=be(),n=O().Promise,r=`__workerpool-terminate__`,i=`__workerpool-cleanup__`,a=1e3,o={exit:function(){}},s={addAbortListener:function(e){o.abortListeners.push(e)},emit:o.emit};if(typeof self<`u`&&typeof postMessage==`function`&&typeof addEventListener==`function`)o.on=function(e,t){addEventListener(e,function(e){t(e.data)})},o.send=function(e,t){t?postMessage(e,t):postMessage(e)};else if(typeof process<`u`){var c;try{c=Me()}catch(e){if(!(S(e)===`object`&&e!==null&&e.code===`MODULE_NOT_FOUND`))throw e}if(c&&c.parentPort!==null){var l=c.parentPort;o.send=l.postMessage.bind(l),o.on=l.on.bind(l),o.exit=process.exit.bind(process)}else o.on=process.on.bind(process),o.send=function(e){process.send(e)},o.on(`disconnect`,function(){process.exit(1)}),o.exit=process.exit.bind(process)}else throw Error(`Script must be executed as a worker`);function u(e){return e&&e.toJSON?JSON.parse(JSON.stringify(e)):JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}function d(e){return e&&typeof e.then==`function`&&typeof e.catch==`function`}o.methods={},o.methods.run=function(e,t){var n=Function(`return (`+e+`).apply(this, arguments);`);return n.worker=s,n.apply(n,t)},o.methods.methods=function(){return Object.keys(o.methods)},o.terminationHandler=void 0,o.abortListenerTimeout=a,o.abortListeners=[],o.terminateAndExit=function(e){var t=function(){o.exit(e)};if(!o.terminationHandler)return t();var r=o.terminationHandler(e);return d(r)?(r.then(t,t),r):(t(),new n(function(e,t){t(Error(`Worker terminating`))}))},o.cleanup=function(e){if(!o.abortListeners.length)return o.send({id:e,method:i,error:u(Error(`Worker terminating`))}),new n(function(e){e()});var t=function(){o.exit()},r=function(){o.abortListeners.length||(o.abortListeners=[])},a=o.abortListeners.map(function(e){return e()}),s,c=new n(function(e,t){s=setTimeout(function(){t(Error(`Timeout occured waiting for abort handler, killing worker`))},o.abortListenerTimeout)}),l=n.all(a).then(function(){clearTimeout(s),r()},function(){clearTimeout(s),t()});return new n(function(e,t){l.then(e,t),c.then(e,t)}).then(function(){o.send({id:e,method:i,error:null})},function(t){o.send({id:e,method:i,error:t?u(t):null})})};var f=null;o.on(`message`,function(e){if(e===r)return o.terminateAndExit(0);if(e.method===i)return o.cleanup(e.id);try{var n=o.methods[e.method];if(n){f=e.id;var a=n.apply(n,e.params);d(a)?a.then(function(n){n instanceof t?o.send({id:e.id,result:n.message,error:null},n.transfer):o.send({id:e.id,result:n,error:null}),f=null}).catch(function(t){o.send({id:e.id,result:null,error:u(t)}),f=null}):(a instanceof t?o.send({id:e.id,result:a.message,error:null},a.transfer):o.send({id:e.id,result:a,error:null}),f=null)}else throw Error(`Unknown method "`+e.method+`"`)}catch(t){o.send({id:e.id,result:null,error:u(t)})}}),o.register=function(e,t){if(e)for(var n in e)e.hasOwnProperty(n)&&(o.methods[n]=e[n],o.methods[n].worker=s);t&&(o.terminationHandler=t.onTerminate,o.abortListenerTimeout=t.abortListenerTimeout||a),o.send(`ready`)},o.emit=function(e){if(f){if(e instanceof t){o.send({id:f,isEvent:!0,payload:e.message},e.transfer);return}o.send({id:f,isEvent:!0,payload:e})}},e.add=o.register,e.emit=o.emit})(_e),_e)}var Ce=r.platform,we=r.isMainThread,Te=r.cpus,Ee=fe.TerminateError;function De(e,t){return new(ge())(e,t)}var Oe=t.pool=De;function ke(e,t){Se().add(e,t)}var Ae=t.worker=ke;function je(e){Se().emit(e)}var Ne=t.workerEmit=je,Pe=t.Promise=O().Promise,Fe=t.Transfer=be(),Ie=t.platform=Ce,Le=t.isMainThread=we,Re=t.cpus=Te,ze=t.TerminateError=Ee;e.Promise=Pe,e.TerminateError=ze,e.Transfer=Fe,e.cpus=Re,e.default=t,e.isMainThread=Le,e.platform=Ie,e.pool=Oe,e.worker=Ae,e.workerEmit=Ne,Object.defineProperty(e,`__esModule`,{value:!0})}))}))(),1),pt=`!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(e="undefined"!=typeof globalThis?globalThis:e||self).worker=n()}(this,(function(){"use strict";function e(n){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(n)}function n(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var t={};var r=function(e,n){this.message=e,this.transfer=n},o={};function i(e,n){var t=this;if(!(this instanceof i))throw new SyntaxError("Constructor must be called with the new operator");if("function"!=typeof e)throw new SyntaxError("Function parameter handler(resolve, reject) missing");var r=[],o=[];this.resolved=!1,this.rejected=!1,this.pending=!0,this[Symbol.toStringTag]="Promise";var a=function(e,n){r.push(e),o.push(n)};this.then=function(e,n){return new i((function(t,r){var o=e?s(e,t,r):t,i=n?s(n,t,r):r;a(o,i)}),t)};var f=function(e){return t.resolved=!0,t.rejected=!1,t.pending=!1,r.forEach((function(n){n(e)})),a=function(n,t){n(e)},f=d=function(){},t},d=function(e){return t.resolved=!1,t.rejected=!0,t.pending=!1,o.forEach((function(n){n(e)})),a=function(n,t){t(e)},f=d=function(){},t};this.cancel=function(){return n?n.cancel():d(new u),t},this.timeout=function(e){if(n)n.timeout(e);else{var r=setTimeout((function(){d(new c("Promise timed out after "+e+" ms"))}),e);t.always((function(){clearTimeout(r)}))}return t},e((function(e){f(e)}),(function(e){d(e)}))}function s(e,n,t){return function(r){try{var o=e(r);o&&"function"==typeof o.then&&"function"==typeof o.catch?o.then(n,t):n(o)}catch(e){t(e)}}}function u(e){this.message=e||"promise cancelled",this.stack=(new Error).stack}function c(e){this.message=e||"timeout exceeded",this.stack=(new Error).stack}return i.prototype.catch=function(e){return this.then(null,e)},i.prototype.always=function(e){return this.then(e,e)},i.prototype.finally=function(e){var n=this,t=function(){return new i((function(e){return e()})).then(e).then((function(){return n}))};return this.then(t,t)},i.all=function(e){return new i((function(n,t){var r=e.length,o=[];r?e.forEach((function(e,i){e.then((function(e){o[i]=e,0==--r&&n(o)}),(function(e){r=0,t(e)}))})):n(o)}))},i.defer=function(){var e={};return e.promise=new i((function(n,t){e.resolve=n,e.reject=t})),e},u.prototype=new Error,u.prototype.constructor=Error,u.prototype.name="CancellationError",i.CancellationError=u,c.prototype=new Error,c.prototype.constructor=Error,c.prototype.name="TimeoutError",i.TimeoutError=c,o.Promise=i,function(n){var t=r,i=o.Promise,s="__workerpool-cleanup__",u={exit:function(){}},c={addAbortListener:function(e){u.abortListeners.push(e)},emit:u.emit};if("undefined"!=typeof self&&"function"==typeof postMessage&&"function"==typeof addEventListener)u.on=function(e,n){addEventListener(e,(function(e){n(e.data)}))},u.send=function(e,n){n?postMessage(e,n):postMessage(e)};else{if("undefined"==typeof process)throw new Error("Script must be executed as a worker");var a;try{a=require("worker_threads")}catch(n){if("object"!==e(n)||null===n||"MODULE_NOT_FOUND"!==n.code)throw n}if(a&&null!==a.parentPort){var f=a.parentPort;u.send=f.postMessage.bind(f),u.on=f.on.bind(f),u.exit=process.exit.bind(process)}else u.on=process.on.bind(process),u.send=function(e){process.send(e)},u.on("disconnect",(function(){process.exit(1)})),u.exit=process.exit.bind(process)}function d(e){return e&&e.toJSON?JSON.parse(JSON.stringify(e)):JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}function l(e){return e&&"function"==typeof e.then&&"function"==typeof e.catch}u.methods={},u.methods.run=function(e,n){var t=new Function("return ("+e+").apply(this, arguments);");return t.worker=c,t.apply(t,n)},u.methods.methods=function(){return Object.keys(u.methods)},u.terminationHandler=void 0,u.abortListenerTimeout=1e3,u.abortListeners=[],u.terminateAndExit=function(e){var n=function(){u.exit(e)};if(!u.terminationHandler)return n();var t=u.terminationHandler(e);return l(t)?(t.then(n,n),t):(n(),new i((function(e,n){n(new Error("Worker terminating"))})))},u.cleanup=function(e){if(!u.abortListeners.length)return u.send({id:e,method:s,error:d(new Error("Worker terminating"))}),new i((function(e){e()}));var n,t=u.abortListeners.map((function(e){return e()})),r=new i((function(e,t){n=setTimeout((function(){t(new Error("Timeout occured waiting for abort handler, killing worker"))}),u.abortListenerTimeout)})),o=i.all(t).then((function(){clearTimeout(n),u.abortListeners.length||(u.abortListeners=[])}),(function(){clearTimeout(n),u.exit()}));return new i((function(e,n){o.then(e,n),r.then(e,n)})).then((function(){u.send({id:e,method:s,error:null})}),(function(n){u.send({id:e,method:s,error:n?d(n):null})}))};var p=null;u.on("message",(function(e){if("__workerpool-terminate__"===e)return u.terminateAndExit(0);if(e.method===s)return u.cleanup(e.id);try{var n=u.methods[e.method];if(!n)throw new Error('Unknown method "'+e.method+'"');p=e.id;var r=n.apply(n,e.params);l(r)?r.then((function(n){n instanceof t?u.send({id:e.id,result:n.message,error:null},n.transfer):u.send({id:e.id,result:n,error:null}),p=null})).catch((function(n){u.send({id:e.id,result:null,error:d(n)}),p=null})):(r instanceof t?u.send({id:e.id,result:r.message,error:null},r.transfer):u.send({id:e.id,result:r,error:null}),p=null)}catch(n){u.send({id:e.id,result:null,error:d(n)})}})),u.register=function(e,n){if(e)for(var t in e)e.hasOwnProperty(t)&&(u.methods[t]=e[t],u.methods[t].worker=c);n&&(u.terminationHandler=n.onTerminate,u.abortListenerTimeout=n.abortListenerTimeout||1e3),u.send("ready")},u.emit=function(e){if(p){if(e instanceof t)return void u.send({id:p,isEvent:!0,payload:e.message},e.transfer);u.send({id:p,isEvent:!0,payload:e})}},n.add=u.register,n.emit=u.emit}(t),n(t)})); + +;(function(){ +var runTask=(function thread() { + const MAXMEM = 32767; + let instance; + let memory; + + // Lazily cached typed-array views over wasm memory. + // Invalidated automatically when memory.grow() replaces memory.buffer. + let _u32 = null; + let _u8 = null; + + function getU32() { + if (_u32 === null || _u32.buffer !== memory.buffer) { + _u32 = new Uint32Array(memory.buffer, 0, 1); + } + return _u32; + } + + function getU8() { + if (_u8 === null || _u8.buffer !== memory.buffer) { + _u8 = new Uint8Array(memory.buffer); + } + return _u8; + } + + async function init(data) { + let wasmModule; + if (data.code instanceof WebAssembly.Module) { + wasmModule = data.code; + } else { + wasmModule = await WebAssembly.compile(new Uint8Array(data.code)); + } + memory = new WebAssembly.Memory({initial: data.init, maximum: MAXMEM}); + // Reset cached views — new memory means new backing buffer. + _u32 = null; + _u8 = null; + instance = await WebAssembly.instantiate(wasmModule, {env: {memory}}); + } + + function alloc(length) { + const u32 = getU32(); + // Align to 4 bytes with a branchless bitmask instead of a loop. + u32[0] = (u32[0] + 3) & ~3; + const res = u32[0]; + u32[0] += length; + if (u32[0] + length > memory.buffer.byteLength) { + const currentPages = memory.buffer.byteLength / 0x10000; + let requiredPages = Math.floor((u32[0] + length) / 0x10000) + 1; + if (requiredPages > MAXMEM) requiredPages = MAXMEM; + memory.grow(requiredPages - currentPages); + // memory.buffer changed — cached views are now stale. + } + return res; + } + + function allocBuffer(buffer) { + const src = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer); + const p = alloc(src.byteLength); + // getU8() handles re-creation if alloc() triggered a grow. + getU8().set(src, p); + return p; + } + + function getBuffer(pointer, length) { + return new Uint8Array(memory.buffer, pointer, length); + } + + function setBuffer(pointer, buffer) { + getU8().set(buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer), pointer); + } + + function runTask(task) { + if (task[0].cmd === "INIT") { + // INIT is the only async path — return a Promise so workerpool + // can await it; all other tasks execute synchronously to prevent + // concurrent execution of tasks within the same worker. + return init(task[0]); + } + const vars = []; + const out = []; + const oldAlloc = getU32()[0]; + for (let i = 0; i < task.length; i++) { + const step = task[i]; + switch (step.cmd) { + case "ALLOCSET": + vars[step.var] = allocBuffer(step.buff); + break; + case "ALLOC": + vars[step.var] = alloc(step.len); + break; + case "SET": + setBuffer(vars[step.var], step.buff); + break; + case "CALL": { + const paramDefs = step.params; + const params = new Array(paramDefs.length); + for (let j = 0; j < paramDefs.length; j++) { + const p = paramDefs[j]; + params[j] = p.var !== undefined + ? vars[p.var] + (p.offset || 0) + : p.val; + } + instance.exports[step.fnName](...params); + break; + } + case "GET": + out[step.out] = getBuffer(vars[step.var], step.len).slice(); + break; + default: + throw new Error("Invalid cmd: " + step.cmd); + } + } + // Reclaim task-local allocations. getU32() handles a post-grow buffer. + getU32()[0] = oldAlloc; + return out; + } + + return runTask; +})(); +worker.add({runTask:runTask}); +})();`;function mt(){return typeof navigator==`object`&&navigator.hardwareConcurrency||2}function ht(){return`web`}function gt(){return typeof Worker<`u`}var _t=null;function vt(){if(_t)return _t;let e=new Blob([pt],{type:`application/javascript`});return _t=(globalThis.URL?globalThis.URL:globalThis.webkitURL).createObjectURL(e),_t}var yt=25;async function bt(e,t){let n=new xt;n.memory=new WebAssembly.Memory({initial:yt}),n.u8=new Uint8Array(n.memory.buffer),n.u32=new Uint32Array(n.memory.buffer);let r=await WebAssembly.compile(e.code);if(n.instance=await WebAssembly.instantiate(r,{env:{memory:n.memory}}),gt()||(t=!0),n.singleThread=t,n.initalPFree=n.u32[0],n.pq=e.pq,n.pr=e.pr,n.pG1gen=e.pG1gen,n.pG1zero=e.pG1zero,n.pG2gen=e.pG2gen,n.pG2zero=e.pG2zero,n.pOneT=e.pOneT,n.code=e.code,n.wasmModule=r,t)n.taskManager=dt(),await n.taskManager([{cmd:`INIT`,init:yt,code:n.code.slice()}]),n.concurrency=1;else{let e=mt(),t=Math.min(Math.max(e,2),64);n.concurrency=t,n.pool=ft.default.pool(vt(),{maxWorkers:t,workerType:ht()});let r=[];for(let e=0;e=0;e--){if(!n.isZero(h))for(let e=0;el&&(_=l),_(s&&s.debug(`Multiexp end: ${c}: ${t}/${f}`),e)))}let v=await Promise.all(m),y=n.zero;for(let e=v.length-1;e>=0;e--)y=n.add(y,v[e]);return y}n.multiExp=async function(e,t,n,r){return a(e,t,`jacobian`,n,r)},n.multiExpAffine=async function(e,t,n,r){return a(e,t,`affine`,n,r)}}function Et(e,t){let n=e[t],r=e.Fr,i=n.tm;async function a(e,a,c,l,u,d){c||=`affine`,l||=`affine`;let f,p,m,h,g,_,v,y,b;t==`G1`?(c==`affine`?(f=n.F.n8*2,h=`g1m_batchToJacobian`):f=n.F.n8*3,p=n.F.n8*3,a&&(y=`g1m_fftFinal`),v=`g1m_fftJoin`,_=`g1m_fftMix`,b=`g1m__reversePermutation`,l==`affine`?(m=n.F.n8*2,g=`g1m_batchToAffine`):m=n.F.n8*3):t==`G2`?(c==`affine`?(f=n.F.n8*2,h=`g2m_batchToJacobian`):f=n.F.n8*3,p=n.F.n8*3,a&&(y=`g2m_fftFinal`),v=`g2m_fftJoin`,_=`g2m_fftMix`,b=`g2m__reversePermutation`,l==`affine`?(m=n.F.n8*2,g=`g2m_batchToAffine`):m=n.F.n8*3):t==`Fr`&&(f=n.n8,p=n.n8,m=n.n8,a&&(y=`frm_fftFinal`),_=`frm_fftMix`,v=`frm_fftJoin`,b=`frm__reversePermutation`);let x=!1;Array.isArray(e)?(e=it(e,f),x=!0):e=e.slice(0,e.byteLength),console.log(`FFT input size:`,e.byteLength,` bytes`);let S=e.byteLength/f,C=J(S);if(console.log(`FFT points:`,S,` bits:`,C),1<=16;)k*=2,O/=2;let A=J(O),j=[];u&&u.debug(`${d}: fft ${C} mix start: ${k}`);for(let t=0;t0;t--)T.set(D[t],e),e+=O*m,delete D[t];T.set(D[0].slice(0,(O-1)*m),e),delete D[0]}else for(let e=0;e1<<28?new X(d[0].byteLength*2):new Uint8Array(d[0].byteLength*2),f.set(d[0]),f.set(d[1],d[0].byteLength),f}async function s(e,t,n,i,o){let s,l;s=e.slice(0,e.byteLength/2),l=e.slice(e.byteLength/2,e.byteLength);let u=[];u.push(a(s,!0,t,`jacobian`,i,o)),u.push(a(l,!0,t,`jacobian`,i,o)),[s,l]=await Promise.all(u);let d=await c(s,l,`fftJoinExtInv`,r.one,r.shiftInv,`jacobian`,n,i,o),f;return f=d[0].byteLength>1<<28?new X(d[0].byteLength*2):new Uint8Array(d[0].byteLength*2),f.set(d[0]),f.set(d[1],d[0].byteLength),f}async function c(e,a,o,s,c,l,u,d,f){let p=65536,m,h,g,_,v,y;if(t==`G1`)l==`affine`?(v=n.F.n8*2,h=`g1m_batchToJacobian`):v=n.F.n8*3,y=n.F.n8*3,m=`g1m_`+o,u==`affine`?(g=`g1m_batchToAffine`,_=n.F.n8*2):_=n.F.n8*3;else if(t==`G2`)l==`affine`?(v=n.F.n8*2,h=`g2m_batchToJacobian`):v=n.F.n8*3,m=`g2m_`+o,y=n.F.n8*3,u==`affine`?(g=`g2m_batchToAffine`,_=n.F.n8*2):_=n.F.n8*3;else if(t==`Fr`)v=r.n8,_=r.n8,y=r.n8,m=`frm_`+o;else throw Error(`Invalid group`);if(e.byteLength!=a.byteLength)throw Error(`Invalid buffer size`);let b=Math.floor(e.byteLength/v);if(b!=1<p&&(x=p);let S=[];for(let t=0;t(d&&d.debug(`${f}: fftJoinExt End: ${t}/${b}`),e)))}let C=await Promise.all(S),w,T;b*_>1<<28?(w=new X(b*_),T=new X(b*_)):(w=new Uint8Array(b*_),T=new Uint8Array(b*_));let E=0;for(let e=0;er.s+1)throw s&&s.error(`lagrangeEvaluations input too big`),Error(`lagrangeEvaluations input too big`);let p=e.slice(0,e.byteLength/2),m=e.slice(e.byteLength/2,e.byteLength),h=r.exp(r.shift,d/2),g=r.inv(r.sub(r.one,h));[p,m]=await c(p,m,`prepareLagrangeEvaluation`,g,r.shiftInv,i,`jacobian`,s,l+` prep`);let _=[];_.push(a(p,!0,`jacobian`,o,s,l+` t0`)),_.push(a(m,!0,`jacobian`,o,s,l+` t1`)),[p,m]=await Promise.all(_);let v;return v=p.byteLength>1<<28?new X(p.byteLength*2):new Uint8Array(p.byteLength*2),v.set(p),v.set(m,p.byteLength),v},n.fftMix=async function(e){let a=n.F.n8*3,o,s;if(t==`G1`)o=`g1m_fftMix`,s=`g1m_fftJoin`;else if(t==`G2`)o=`g2m_fftMix`,s=`g2m_fftJoin`;else if(t==`Fr`)o=`frm_fftMix`,s=`frm_fftJoin`;else throw Error(`Invalid group`);let c=Math.floor(e.byteLength/a),l=J(c),u=1<=0;e--)p.set(f[e][0],m),m+=f[e][0].byteLength;return p}}async function Dt(e){let t=await bt(e.wasm,e.singleThread),n={};return n.q=h(e.wasm.q.toString()),n.r=h(e.wasm.r.toString()),n.name=e.name,n.tm=t,n.prePSize=e.wasm.prePSize,n.preQSize=e.wasm.preQSize,n.Fr=new st(t,`frm`,e.n8r,e.r),n.F1=new st(t,`f1m`,e.n8q,e.q),n.F2=new ct(t,`f2m`,n.F1),n.G1=new ut(t,`g1m`,n.F1,e.wasm.pG1gen,e.wasm.pG1b,e.cofactorG1),n.G2=new ut(t,`g2m`,n.F2,e.wasm.pG2gen,e.wasm.pG2b,e.cofactorG2),n.F6=new lt(t,`f6m`,n.F2),n.F12=new ct(t,`ftm`,n.F6),n.Gt=n.F12,St(n,`G1`),St(n,`G2`),St(n,`Fr`),Tt(n,`G1`),Tt(n,`G2`),Et(n,`G1`),Et(n,`G2`),Et(n,`Fr`),Ct(n),n.array2buffer=function(e,t){let n=new Uint8Array(t*e.length);for(let r=0;rkt,n8q:()=>32,n8r:()=>32,pG1b:()=>Nt,pG1gen:()=>jt,pG1zero:()=>Mt,pG2b:()=>It,pG2gen:()=>Pt,pG2zero:()=>Ft,pOneT:()=>Lt,pq:()=>488,pr:()=>At,prePSize:()=>192,preQSize:()=>Rt,q:()=>zt,r:()=>Bt}),kt,At,jt,Mt,Nt,Pt,Ft,It,Lt,Rt,zt,Bt,Vt=s((()=>{kt=`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`,At=1768,jt=31432,Mt=31528,Nt=3080,Pt=31624,Ft=31816,It=12456,Lt=32008,Rt=19776,zt=`21888242871839275222246405745257275088696311157297823662689037894645226208583`,Bt=`21888242871839275222246405745257275088548364400416034343698204186575808495617`}));function Ht(e){return BigInt(e)}function Ut(e){return e<0n}function Wt(e){return e===0n}function Gt(e){return Ut(e)?e.toString(2).length-1:e.toString(2).length}function Kt(e){let t=[],n=Ht(e);return t.push(Number(n&255n)),t.push(Number(n>>8n&255n)),t.push(Number(n>>16n&255n)),t.push(Number(n>>24n&255n)),t}function qt(e){for(var t=[],n=0;n>6,128|r&63):r<55296||r>=57344?t.push(224|r>>12,128|r>>6&63,128|r&63):(n++,r=65536+((r&1023)<<10|e.charCodeAt(n)&1023),t.push(240|r>>18,128|r>>12&63,128|r>>6&63,128|r&63))}return t}function Jt(e){let t=qt(e);return[...Z(t.length),...t]}function Yt(e){let t=[],n=Ht(e);if(Ut(n))throw Error(`Number cannot be negative`);for(;!Wt(n);)t.push(Number(n&127n)),n>>=7n;t.length==0&&t.push(0);for(let e=0;e4294967295n)throw Error(`Number too big`);if(t>2147483647n&&(t-=4294967296n),t<-2147483648n)throw Error(`Number too small`);return Xt(t)}function Qt(e){let t=Ht(e);if(t>18446744073709551615n)throw Error(`Number too big`);if(t>9223372036854775807n&&(t-=18446744073709551616n),t<-9223372036854775808n)throw Error(`Number too small`);return Xt(t)}function Z(e){let t=Ht(e);if(t>4294967295n)throw Error(`Number too big`);return Yt(t)}function $t(e){return Array.from(e,function(e){return(`0`+(e&255).toString(16)).slice(-2)}).join(``)}function en(e){if(typeof e==`string`){let t=e.split(` +`);for(let e=0;e{})),nn,rn=s((()=>{tn(),nn=class{constructor(e){this.func=e,this.functionName=e.functionName,this.module=e.module}setLocal(e,t){let n=this.func.localIdxByName[e];if(n===void 0)throw Error(`Local Variable not defined: Function: ${this.functionName} local: ${e} `);return[...t,33,...Z(n)]}teeLocal(e,t){let n=this.func.localIdxByName[e];if(n===void 0)throw Error(`Local Variable not defined: Function: ${this.functionName} local: ${e} `);return[...t,34,...Z(n)]}getLocal(e){let t=this.func.localIdxByName[e];if(t===void 0)throw Error(`Local Variable not defined: Function: ${this.functionName} local: ${e} `);return[32,...Z(t)]}i64_load8_s(e,t,n){let r=t||0,i=n===void 0?0:n;return[...e,48,i,...Z(r)]}i64_load8_u(e,t,n){let r=t||0,i=n===void 0?0:n;return[...e,49,i,...Z(r)]}i64_load16_s(e,t,n){let r=t||0,i=n===void 0?1:n;return[...e,50,i,...Z(r)]}i64_load16_u(e,t,n){let r=t||0,i=n===void 0?1:n;return[...e,51,i,...Z(r)]}i64_load32_s(e,t,n){let r=t||0,i=n===void 0?2:n;return[...e,52,i,...Z(r)]}i64_load32_u(e,t,n){let r=t||0,i=n===void 0?2:n;return[...e,53,i,...Z(r)]}i64_load(e,t,n){let r=t||0,i=n===void 0?3:n;return[...e,41,i,...Z(r)]}i64_store(e,t,n,r){let i,a,o;return Array.isArray(t)?(i=0,a=3,o=t):Array.isArray(n)?(i=t,a=3,o=n):Array.isArray(r)&&(i=t,a=n,o=r),[...e,...o,55,a,...Z(i)]}i64_store32(e,t,n,r){let i,a,o;return Array.isArray(t)?(i=0,a=2,o=t):Array.isArray(n)?(i=t,a=2,o=n):Array.isArray(r)&&(i=t,a=n,o=r),[...e,...o,62,a,...Z(i)]}i64_store16(e,t,n,r){let i,a,o;return Array.isArray(t)?(i=0,a=1,o=t):Array.isArray(n)?(i=t,a=1,o=n):Array.isArray(r)&&(i=t,a=n,o=r),[...e,...o,61,a,...Z(i)]}i64_store8(e,t,n,r){let i,a,o;return Array.isArray(t)?(i=0,a=0,o=t):Array.isArray(n)?(i=t,a=0,o=n):Array.isArray(r)&&(i=t,a=n,o=r),[...e,...o,60,a,...Z(i)]}i32_load8_s(e,t,n){let r=t||0,i=n===void 0?0:n;return[...e,44,i,...Z(r)]}i32_load8_u(e,t,n){let r=t||0,i=n===void 0?0:n;return[...e,45,i,...Z(r)]}i32_load16_s(e,t,n){let r=t||0,i=n===void 0?1:n;return[...e,46,i,...Z(r)]}i32_load16_u(e,t,n){let r=t||0,i=n===void 0?1:n;return[...e,47,i,...Z(r)]}i32_load(e,t,n){let r=t||0,i=n===void 0?2:n;return[...e,40,i,...Z(r)]}i32_store(e,t,n,r){let i,a,o;return Array.isArray(t)?(i=0,a=2,o=t):Array.isArray(n)?(i=t,a=2,o=n):Array.isArray(r)&&(i=t,a=n,o=r),[...e,...o,54,a,...Z(i)]}i32_store16(e,t,n,r){let i,a,o;return Array.isArray(t)?(i=0,a=1,o=t):Array.isArray(n)?(i=t,a=1,o=n):Array.isArray(r)&&(i=t,a=n,o=r),[...e,...o,59,a,...Z(i)]}i32_store8(e,t,n,r){let i,a,o;return Array.isArray(t)?(i=0,a=0,o=t):Array.isArray(n)?(i=t,a=0,o=n):Array.isArray(r)&&(i=t,a=n,o=r),[...e,...o,58,a,...Z(i)]}call(e,...t){let n=this.module.functionIdxByName[e];if(n===void 0)throw Error(`Function not defined: Function: ${e}`);return[...[].concat(...t),16,...Z(n)]}call_indirect(e,...t){return[...[].concat(...t),...e,17,0,0]}if(e,t,n){return n?[...e,4,64,...t,5,...n,11]:[...e,4,64,...t,11]}block(e){return[2,64,...e,11]}loop(...e){return[3,64,...[].concat(...e),11]}br_if(e,t){return[...t,13,...Z(e)]}br(e){return[12,...Z(e)]}ret(e){return[...e,15]}drop(e){return[...e,26]}i64_const(e){return[66,...Qt(e)]}i32_const(e){return[65,...Zt(e)]}i64_eqz(e){return[...e,80]}i64_eq(e,t){return[...e,...t,81]}i64_ne(e,t){return[...e,...t,82]}i64_lt_s(e,t){return[...e,...t,83]}i64_lt_u(e,t){return[...e,...t,84]}i64_gt_s(e,t){return[...e,...t,85]}i64_gt_u(e,t){return[...e,...t,86]}i64_le_s(e,t){return[...e,...t,87]}i64_le_u(e,t){return[...e,...t,88]}i64_ge_s(e,t){return[...e,...t,89]}i64_ge_u(e,t){return[...e,...t,90]}i64_add(e,t){return[...e,...t,124]}i64_sub(e,t){return[...e,...t,125]}i64_mul(e,t){return[...e,...t,126]}i64_div_s(e,t){return[...e,...t,127]}i64_div_u(e,t){return[...e,...t,128]}i64_rem_s(e,t){return[...e,...t,129]}i64_rem_u(e,t){return[...e,...t,130]}i64_and(e,t){return[...e,...t,131]}i64_or(e,t){return[...e,...t,132]}i64_xor(e,t){return[...e,...t,133]}i64_shl(e,t){return[...e,...t,134]}i64_shr_s(e,t){return[...e,...t,135]}i64_shr_u(e,t){return[...e,...t,136]}i64_extend_i32_s(e){return[...e,172]}i64_extend_i32_u(e){return[...e,173]}i64_clz(e){return[...e,121]}i64_ctz(e){return[...e,122]}i32_eqz(e){return[...e,69]}i32_eq(e,t){return[...e,...t,70]}i32_ne(e,t){return[...e,...t,71]}i32_lt_s(e,t){return[...e,...t,72]}i32_lt_u(e,t){return[...e,...t,73]}i32_gt_s(e,t){return[...e,...t,74]}i32_gt_u(e,t){return[...e,...t,75]}i32_le_s(e,t){return[...e,...t,76]}i32_le_u(e,t){return[...e,...t,77]}i32_ge_s(e,t){return[...e,...t,78]}i32_ge_u(e,t){return[...e,...t,79]}i32_add(e,t){return[...e,...t,106]}i32_sub(e,t){return[...e,...t,107]}i32_mul(e,t){return[...e,...t,108]}i32_div_s(e,t){return[...e,...t,109]}i32_div_u(e,t){return[...e,...t,110]}i32_rem_s(e,t){return[...e,...t,111]}i32_rem_u(e,t){return[...e,...t,112]}i32_and(e,t){return[...e,...t,113]}i32_or(e,t){return[...e,...t,114]}i32_xor(e,t){return[...e,...t,115]}i32_shl(e,t){return[...e,...t,116]}i32_shr_s(e,t){return[...e,...t,117]}i32_shr_u(e,t){return[...e,...t,118]}i32_rotl(e,t){return[...e,...t,119]}i32_rotr(e,t){return[...e,...t,120]}i32_wrap_i64(e){return[...e,167]}i32_clz(e){return[...e,103]}i32_ctz(e){return[...e,104]}unreachable(){return[0]}current_memory(){return[63,0]}comment(){return[]}}})),an,on,sn=s((()=>{rn(),tn(),an={i32:127,i64:126,f32:125,f64:124,anyfunc:112,func:96,emptyblock:64},on=class{constructor(e,t,n,r,i){if(n==`import`)this.fnType=`import`,this.moduleName=r,this.fieldName=i;else if(n==`internal`)this.fnType=`internal`;else throw Error(`Invalid function fnType: `+n);this.module=e,this.fnName=t,this.params=[],this.locals=[],this.localIdxByName={},this.code=[],this.returnType=null,this.nextLocal=0}addParam(e,t){if(this.localIdxByName[e])throw Error(`param already exists. Function: ${this.fnName}, Param: ${e} `);let n=this.nextLocal++;this.localIdxByName[e]=n,this.params.push({type:t})}addLocal(e,t,n){let r=n||1;if(this.localIdxByName[e])throw Error(`local already exists. Function: ${this.fnName}, Param: ${e} `);let i=this.nextLocal++;this.localIdxByName[e]=i,this.locals.push({type:t,length:r})}setReturnType(e){if(this.returnType)throw Error(`returnType already defined. Function: ${this.fnName}`);this.returnType=e}getSignature(){let e=[...Z(this.params.length),...this.params.map(e=>an[e.type])],t=this.returnType?[1,an[this.returnType]]:[0];return[96,...e,...t]}getBody(){let e=this.locals.map(e=>[...Z(e.length),an[e.type]]),t=[...Z(this.locals.length),...[].concat(...e),...this.code,11];return[...Z(t.length),...t]}addCode(...e){this.code.push(...[].concat(...e))}getCodeBuilder(){return new nn(this)}}})),cn,ln=s((()=>{sn(),tn(),cn=class{constructor(){this.functions=[],this.functionIdxByName={},this.nImportFunctions=0,this.nInternalFunctions=0,this.memory={pagesSize:1,moduleName:`env`,fieldName:`memory`},this.free=8,this.datas=[],this.modules={},this.exports=[],this.functionsTable=[]}build(){return this._setSignatures(),new Uint8Array([...Kt(1836278016),...Kt(1),...this._buildType(),...this._buildImport(),...this._buildFunctionDeclarations(),...this._buildFunctionsTable(),...this._buildExports(),...this._buildElements(),...this._buildCode(),...this._buildData()])}addFunction(e){if(this.functionIdxByName[e]!==void 0)throw Error(`Function already defined: ${e}`);let t=this.functions.length;return this.functionIdxByName[e]=t,this.functions.push(new on(this,e,`internal`)),this.nInternalFunctions++,this.functions[t]}addIimportFunction(e,t,n){if(this.functionIdxByName[e]!==void 0)throw Error(`Function already defined: ${e}`);if(this.functions.length>0&&this.functions[this.functions.length-1].type==`internal`)throw Error(`Import functions must be declared before internal: ${e}`);let r=n||e,i=this.functions.length;return this.functionIdxByName[e]=i,this.functions.push(new on(this,e,`import`,t,r)),this.nImportFunctions++,this.functions[i]}setMemory(e,t,n){this.memory={pagesSize:e,moduleName:t||`env`,fieldName:n||`memory`}}exportFunction(e,t){let n=t||e;if(this.functionIdxByName[e]===void 0)throw Error(`Function not defined: ${e}`);let r=this.functionIdxByName[e];n!=e&&(this.functionIdxByName[n]=r),this.exports.push({exportName:n,idx:r})}addFunctionToTable(e){let t=this.functionIdxByName[e];this.functionsTable.push(t)}addData(e,t){this.datas.push({offset:e,bytes:t})}alloc(e,t){let n,r;(Array.isArray(e)||ArrayBuffer.isView(e))&&t===void 0?(n=e.length,r=e):(n=e,r=t),n=(n-1>>3)+1<<3;let i=this.free;return this.free+=n,r&&this.addData(i,r),i}allocString(e){let t=new globalThis.TextEncoder().encode(e);return this.alloc([...t,0])}_setSignatures(){this.signatures=[];let e={};if(this.functionsTable.length>0){let t=this.functions[this.functionsTable[0]].getSignature(),n=`s_`+$t(t);e[n]=0,this.signatures.push(t)}for(let t=0;t{tn(),un=class{constructor(e){this.func=e,this.functionName=e.functionName,this.module=e.module}setLocal(e,t){if(this.func.localIdxByName[e]===void 0)throw Error(`Local Variable not defined: Function: ${this.functionName} local: ${e} `);return[t,`set_local $${e}`]}teeLocal(e,t){if(this.func.localIdxByName[e]===void 0)throw Error(`Local Variable not defined: Function: ${this.functionName} local: ${e} `);return[t,`tee_local $${e}`]}getLocal(e){if(this.func.localIdxByName[e]===void 0)throw Error(`Local Variable not defined: Function: ${this.functionName} local: ${e} `);return`get_local $${e}`}genLoad(e,t,n,r,i){let a=e,o=r||0;o>0&&(a+=` offset=${o}`);let s=i===void 0?t:i;return s!=t&&(a+=` align=${1<0&&(l+=` offset=${o}`),s!=t&&(l+=` align=${1<{dn(),tn(),fn=class{constructor(e,t,n,r,i){if(n==`import`)this.fnType=`import`,this.moduleName=r,this.fieldName=i;else if(n==`internal`)this.fnType=`internal`,this.comment=r;else throw Error(`Invalid function fnType: `+n);this.module=e,this.fnName=t,this.params=[],this.locals=[],this.localIdxByName={},this.code=[],this.returnType=null,this.nextLocal=0}addParam(e,t){if(this.localIdxByName[e])throw Error(`param already exists. Function: ${this.fnName}, Param: ${e} `);let n=this.nextLocal++;this.localIdxByName[e]=n,this.params.push({type:t,name:e})}addLocal(e,t,n){if(n!==void 0&&n!=1)throw Error(`Locals greater than 1 not implemented`);if(this.localIdxByName[e])throw Error(`local already exists. Function: ${this.fnName}, Param: ${e} `);let r=this.nextLocal++;this.localIdxByName[e]=r,this.locals.push({type:t,name:e})}setReturnType(e){if(this.returnType)throw Error(`returnType already defined. Function: ${this.fnName}`);this.returnType=e}getSignature(){let e=``;for(let t=0;t{pn(),tn(),mn=class{constructor(){this.functions=[],this.functionIdxByName={},this.nImportFunctions=0,this.nInternalFunctions=0,this.memory={pagesSize:1,moduleName:`env`,fieldName:`memory`},this.free=8,this.datas=[],this.modules={},this.exports=[],this.functionsTable=[]}build(){let e=[];return this._setSignatures(),e.push(this._buildType()),e.push(this._buildImport()),this.functionsTable.length>0&&e.push(this._buildFunctionsTable()),this.exports.length>0&&e.push(this._buildExports()),this.functionsTable.length>0&&e.push(this._buildElements()),this.nInternalFunctions>0&&e.push(this._buildFunctions()),e.push(this._buildData()),[`(module`,en(e),`)`]}addFunction(e,t){if(this.functionIdxByName[e]!==void 0)throw Error(`Function already defined: ${e}`);let n=this.functions.length;return this.functionIdxByName[e]=n,this.functions.push(new fn(this,e,`internal`,t)),this.nInternalFunctions++,this.functions[n]}addIimportFunction(e,t,n){if(this.functionIdxByName[e]!==void 0)throw Error(`Function already defined: ${e}`);if(this.functions.length>0&&this.functions[this.functions.length-1].type==`internal`)throw Error(`Import functions must be declared before internal: ${e}`);let r=n||e,i=this.functions.length;return this.functionIdxByName[e]=i,this.functions.push(new fn(this,e,`import`,t,r)),this.nImportFunctions++,this.functions[i]}setMemory(e,t,n){this.memory={pagesSize:e,moduleName:t||`env`,fieldName:n||`memory`}}exportFunction(e,t){let n=t||e;if(this.functionIdxByName[e]===void 0)throw Error(`Function not defined: ${e}`);let r=this.functionIdxByName[e];n!=e&&(this.functionIdxByName[n]=r),this.exports.push({exportName:n,idx:r})}addFunctionToTable(e){let t=this.functionIdxByName[e];this.functionsTable.push(t)}addData(e,t){this.datas.push({offset:e,bytes:t})}alloc(e,t){let n,r;(Array.isArray(e)||ArrayBuffer.isView(e))&&t===void 0?(n=e.length,r=e):(n=e,r=t),n=(n-1>>3)+1<<3;let i=this.free;return this.free+=n,r&&this.addData(i,r),i}allocString(e){let t=new TextEncoder().encode(e);return this.alloc([...t,0])}_setSignatures(){this.signatures=[];let e={};if(this.functionsTable.length>0){let t=this.functions[this.functionsTable[0]].getSignature(),n=this.functions[this.functionsTable[0]].getSignatureName();e[n]=0,this.signatures.push(t)}for(let t=0;t126||e[n]==34||e[n]==92){let r=e[n].toString(16);for(;r.length<2;)r=`0`+r;t+=`\\`+r}else t+=String.fromCharCode(e[n]);return t+=`"`,t}}}}));async function gn(e,t,n){let r=new _n;r.defBytes=t,r.bitsPerBytes=n||32,r.memory=new WebAssembly.Memory({initial:2e4}),r.i32=new Uint32Array(r.memory.buffer),r.i8=new Uint8Array(r.memory.buffer);let i=new cn;i.addIimportFunction(`debug_log32`,`debug`,`log32`).addParam(`x`,`i32`);let a=i.addIimportFunction(`debug_log64`,`debug`,`log64`);a.addParam(`x`,`i32`),a.addParam(`y`,`i32`),c(i),l(i),e(i,r);let o=i.build(),s=await WebAssembly.compile(o);return r.log=console.log,r.instance=await WebAssembly.instantiate(s,{env:{memory:r.memory},debug:{log32:function(e){e<0&&(e=4294967296+e);let t=e.toString(16);for(;t.length<8;)t=`0`+t;r.log(t+`: `+e.toString())},log64:function(e,t){e<0&&(e=4294967296+e),t<0&&(t=4294967296+t);let n=BigInt(e)+(BigInt(t)<<32n),i=n.toString(16);for(;i.length<16;)i=`0`+i;r.log(i+`: `+n.toString())}}}),Object.assign(r,r.instance.exports),Object.assign(r,i.modules),r;function c(e){let t=e.addFunction(`log32`);t.addParam(`x`,`i32`);let n=t.getCodeBuilder();t.addCode(n.call(`debug_log32`,n.getLocal(`x`)))}function l(e){let t=e.addFunction(`log64`);t.addParam(`x`,`i64`);let n=t.getCodeBuilder();t.addCode(n.call(`debug_log64`,n.i32_wrap_i64(n.getLocal(`x`)),n.i32_wrap_i64(n.i64_shr_u(n.getLocal(`x`),n.i64_const(32)))))}}var _n,vn=s((()=>{ln(),_n=class{constructor(){}alloc(e){e===void 0&&(e=this.defBytes),e=(e-1>>3)+1<<3;let t=this.i32[0];return this.i32[0]+=e,t}set(e,t,n){Array.isArray(t)||(t=[t]),n===void 0&&(n=this.defBytes);let r=Math.floor((n-1)/4)+1,i=e,a=1n<>2]=Number(t),n=e,i+=4}if(n!==0n)throw Error(`Expected v to be 0`)}return e}get(e,t,n){n===void 0&&(t===void 0?(t=1,n=this.defBytes):(t=n,n=this.defBytes));let r=Math.floor((n-1)/4)+1,i=1n<=0;n--){t*=i;let r=this.i32[(e>>2)+n];this.bitsPerBytes<32&&r&2147483648&&(r-=4294967296),t+=BigInt(r)}a.push(t),e+=r*4}return a.length==1?a[0]:a}}})),yn=l({ModuleBuilder:()=>cn,ModuleBuilderWat:()=>mn,buildProtoboard:()=>gn}),bn=s((()=>{ln(),hn(),vn()}));function Q(e,t){let n=Array(t),r=BigInt(e);for(let e=0;e>=8n;return n}var xn=s((()=>{}));function Sn(e,t,n){let r=n||`int`;if(e.modules[r])return r;e.modules[r]={};let i=t*2,a=t*8;function o(){let n=e.addFunction(r+`_copy`);n.addParam(`px`,`i32`),n.addParam(`pr`,`i32`);let i=n.getCodeBuilder();for(let e=0;e>1&&r>1,e>>1)))),t.addCode(n.setLocal(`c1`,n.i64_add(n.getLocal(`c1`),n.i64_shr_u(n.getLocal(`c0`),n.i64_const(32)))))),e>0&&(t.addCode(n.setLocal(`c0`,n.i64_add(n.i64_and(n.getLocal(`c0`),n.i64_const(4294967295)),n.i64_and(n.getLocal(s),n.i64_const(4294967295))))),t.addCode(n.setLocal(`c1`,n.i64_add(n.i64_add(n.getLocal(`c1`),n.i64_shr_u(n.getLocal(`c0`),n.i64_const(32))),n.getLocal(c))))),t.addCode(n.i64_store32(n.getLocal(`r`),e*4,n.getLocal(`c0`))),t.addCode(n.setLocal(s,n.getLocal(`c1`)),n.setLocal(c,n.i64_shr_u(n.getLocal(s),n.i64_const(32))))}t.addCode(n.i64_store32(n.getLocal(`r`),i*4*2-4,n.getLocal(s)))}function g(){let t=e.addFunction(r+`_squareOld`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder();t.addCode(n.call(r+`_mul`,n.getLocal(`x`),n.getLocal(`x`),n.getLocal(`r`)))}function _(){let t=e.addFunction(r+`__mul1`);t.addParam(`px`,`i32`),t.addParam(`y`,`i64`),t.addParam(`pr`,`i32`),t.addLocal(`c`,`i64`);let n=t.getCodeBuilder();t.addCode(n.setLocal(`c`,n.i64_mul(n.i64_load32_u(n.getLocal(`px`),0,0),n.getLocal(`y`)))),t.addCode(n.i64_store32(n.getLocal(`pr`),0,0,n.getLocal(`c`)));for(let e=1;e{}));function wn(e,t,n,r,i,a,o){let s=e.addFunction(t);s.addParam(`base`,`i32`),s.addParam(`scalar`,`i32`),s.addParam(`scalarLength`,`i32`),s.addParam(`r`,`i32`),s.addLocal(`i`,`i32`),s.addLocal(`b`,`i32`);let c=s.getCodeBuilder(),l=c.i32_const(e.alloc(n));s.addCode(c.if(c.i32_eqz(c.getLocal(`scalarLength`)),[...c.call(o,c.getLocal(`r`)),...c.ret([])])),s.addCode(c.call(a,c.getLocal(`base`),l)),s.addCode(c.call(o,c.getLocal(`r`))),s.addCode(c.setLocal(`i`,c.getLocal(`scalarLength`))),s.addCode(c.block(c.loop(c.setLocal(`i`,c.i32_sub(c.getLocal(`i`),c.i32_const(1))),c.setLocal(`b`,c.i32_load8_u(c.i32_add(c.getLocal(`scalar`),c.getLocal(`i`)))),...u(),c.br_if(1,c.i32_eqz(c.getLocal(`i`))),c.br(0))));function u(){let e=[];for(let t=0;t<8;t++)e.push(...c.call(i,c.getLocal(`r`),c.getLocal(`r`)),...c.if(c.i32_ge_u(c.getLocal(`b`),c.i32_const(128>>t)),[...c.setLocal(`b`,c.i32_sub(c.getLocal(`b`),c.i32_const(128>>t))),...c.call(r,c.getLocal(`r`),l,c.getLocal(`r`))]));return e}}var Tn=s((()=>{}));function En(e,t){let n=e.modules[t].n64*8,r=e.addFunction(t+`_batchInverse`);r.addParam(`pIn`,`i32`),r.addParam(`inStep`,`i32`),r.addParam(`n`,`i32`),r.addParam(`pOut`,`i32`),r.addParam(`outStep`,`i32`),r.addLocal(`itAux`,`i32`),r.addLocal(`itIn`,`i32`),r.addLocal(`itOut`,`i32`),r.addLocal(`i`,`i32`);let i=r.getCodeBuilder(),a=i.i32_const(e.alloc(n));r.addCode(i.setLocal(`itAux`,i.i32_load(i.i32_const(0))),i.i32_store(i.i32_const(0),i.i32_add(i.getLocal(`itAux`),i.i32_mul(i.i32_add(i.getLocal(`n`),i.i32_const(1)),i.i32_const(n))))),r.addCode(i.call(t+`_one`,i.getLocal(`itAux`)),i.setLocal(`itIn`,i.getLocal(`pIn`)),i.setLocal(`itAux`,i.i32_add(i.getLocal(`itAux`),i.i32_const(n))),i.setLocal(`i`,i.i32_const(0)),i.block(i.loop(i.br_if(1,i.i32_eq(i.getLocal(`i`),i.getLocal(`n`))),i.if(i.call(t+`_isZero`,i.getLocal(`itIn`)),i.call(t+`_copy`,i.i32_sub(i.getLocal(`itAux`),i.i32_const(n)),i.getLocal(`itAux`)),i.call(t+`_mul`,i.getLocal(`itIn`),i.i32_sub(i.getLocal(`itAux`),i.i32_const(n)),i.getLocal(`itAux`))),i.setLocal(`itIn`,i.i32_add(i.getLocal(`itIn`),i.getLocal(`inStep`))),i.setLocal(`itAux`,i.i32_add(i.getLocal(`itAux`),i.i32_const(n))),i.setLocal(`i`,i.i32_add(i.getLocal(`i`),i.i32_const(1))),i.br(0))),i.setLocal(`itIn`,i.i32_sub(i.getLocal(`itIn`),i.getLocal(`inStep`))),i.setLocal(`itAux`,i.i32_sub(i.getLocal(`itAux`),i.i32_const(n))),i.setLocal(`itOut`,i.i32_add(i.getLocal(`pOut`),i.i32_mul(i.i32_sub(i.getLocal(`n`),i.i32_const(1)),i.getLocal(`outStep`)))),i.call(t+`_inverse`,i.getLocal(`itAux`),i.getLocal(`itAux`)),i.block(i.loop(i.br_if(1,i.i32_eqz(i.getLocal(`i`))),i.if(i.call(t+`_isZero`,i.getLocal(`itIn`)),[...i.call(t+`_copy`,i.getLocal(`itAux`),i.i32_sub(i.getLocal(`itAux`),i.i32_const(n))),...i.call(t+`_zero`,i.getLocal(`itOut`))],[...i.call(t+`_copy`,i.i32_sub(i.getLocal(`itAux`),i.i32_const(n)),a),...i.call(t+`_mul`,i.getLocal(`itAux`),i.getLocal(`itIn`),i.i32_sub(i.getLocal(`itAux`),i.i32_const(n))),...i.call(t+`_mul`,i.getLocal(`itAux`),a,i.getLocal(`itOut`))]),i.setLocal(`itIn`,i.i32_sub(i.getLocal(`itIn`),i.getLocal(`inStep`))),i.setLocal(`itOut`,i.i32_sub(i.getLocal(`itOut`),i.getLocal(`outStep`))),i.setLocal(`itAux`,i.i32_sub(i.getLocal(`itAux`),i.i32_const(n))),i.setLocal(`i`,i.i32_sub(i.getLocal(`i`),i.i32_const(1))),i.br(0)))),r.addCode(i.i32_store(i.i32_const(0),i.getLocal(`itAux`)))}var Dn,On=s((()=>{Dn=En}));function kn(e,t,n,r,i,a){a===void 0&&(a=r{An=kn}));function Mn(e,t,n,r,i,a){a===void 0&&(a=r{Nn=Mn}));function Fn(e,t){return e===t?0:e>t?1:-1}function In(e){return e*e}function Ln(e){return e%2n!=0n}function Rn(e){return e%2n==0n}function zn(e){return e<0n}function Bn(e){return e>0n}function Vn(e){return zn(e)?e.toString(2).length-1:e.toString(2).length}function Hn(e){return e<0n?-e:e}function Un(e){return Hn(e)===1n}function Wn(e,t){for(var n=0n,r=1n,i=t,a=Hn(e),o,s,c;a!==0n;)o=i/a,s=n,c=i,n=r,i=a,r=s-o*r,a=c-o*a;if(!Un(i))throw Error(e.toString()+` and `+t.toString()+` are not co-prime`);return Fn(n,0n)===-1&&(n+=t),zn(e)?-n:n}function Gn(e,t,n){if(n===0n)throw Error(`Cannot take modPow with modulus 0`);var r=1n,i=e%n;for(zn(t)&&(t*=-1n,i=Wn(i,n));Bn(t);){if(i===0n)return 0n;Ln(t)&&(r=r*i%n),t/=2n,i=In(i)%n}return r}function Kn(e,t){return e=e>=0n?e:-e,t=t>=0n?t:-t,e===t?0:e>t?1:-1}function qn(e,t){return t===0n?!1:Un(t)?!0:Kn(t,2n)===0?Rn(e):e%t===0n}function Jn(e){var t=Hn(e);if(Un(t))return!1;if(t===2n||t===3n||t===5n)return!0;if(Rn(t)||qn(t,3n)||qn(t,5n))return!1;if(t<49n)return!0}function Yn(e){return e-1n}function Xn(e){switch(Hn(e)){case 21888242871839275222246405745257275088696311157297823662689037894645226208583n:case 21888242871839275222246405745257275088548364400416034343698204186575808495617n:case 4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787n:case 52435875175126190479447740508185965837690552500527637822603658699938581184513n:case 41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888458477323173057491593855069696241854796396165721416325350064441470418137846398469611935719059908164220784476160001n:return!0}return!1}function Zn(e,t){for(var n=Yn(e),r=n,i=0,a,o,s;Rn(r);)r/=2n,i++;next:for(o=0;o{}));function er(e,t,n,r){let i=BigInt(t),a=Math.floor((Vn(i-1n)-1)/64)+1,o=a*2,s=a*8,c=n||`f1m`;if(e.modules[c])return c;let l=Sn(e,a,r),u=e.alloc(s,Q(i,s)),d=e.alloc(Q(In(1n<>1n,g=e.alloc(s,Q(h,s)),_=h+1n,v=e.alloc(s,Q(_,s));e.modules[c]={pq:u,pR2:d,n64:a,q:i,pOne:f,pZero:p,pePlusOne:v};function y(){let t=e.addFunction(c+`_one`);t.addParam(`pr`,`i32`);let n=t.getCodeBuilder();t.addCode(n.call(l+`_copy`,n.i32_const(f),n.getLocal(`pr`)))}function b(){let t=e.addFunction(c+`_add`);t.addParam(`x`,`i32`),t.addParam(`y`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder();t.addCode(n.if(n.call(l+`_add`,n.getLocal(`x`),n.getLocal(`y`),n.getLocal(`r`)),n.drop(n.call(l+`_sub`,n.getLocal(`r`),n.i32_const(u),n.getLocal(`r`))),n.if(n.call(l+`_gte`,n.getLocal(`r`),n.i32_const(u)),n.drop(n.call(l+`_sub`,n.getLocal(`r`),n.i32_const(u),n.getLocal(`r`))))))}function x(){let t=e.addFunction(c+`_sub`);t.addParam(`x`,`i32`),t.addParam(`y`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder();t.addCode(n.if(n.call(l+`_sub`,n.getLocal(`x`),n.getLocal(`y`),n.getLocal(`r`)),n.drop(n.call(l+`_add`,n.getLocal(`r`),n.i32_const(u),n.getLocal(`r`)))))}function S(){let t=e.addFunction(c+`_neg`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder();t.addCode(n.call(c+`_sub`,n.i32_const(p),n.getLocal(`x`),n.getLocal(`r`)))}function C(){let t=e.addFunction(c+`_isNegative`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let n=t.getCodeBuilder(),r=n.i32_const(e.alloc(s));t.addCode(n.call(c+`_fromMontgomery`,n.getLocal(`x`),r),n.call(l+`_gte`,r,n.i32_const(v)))}function w(){let t=e.addFunction(c+`_sign`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let n=t.getCodeBuilder(),r=n.i32_const(e.alloc(s));t.addCode(n.if(n.call(l+`_isZero`,n.getLocal(`x`)),n.ret(n.i32_const(0))),n.call(c+`_fromMontgomery`,n.getLocal(`x`),r),n.if(n.call(l+`_gte`,r,n.i32_const(v)),n.ret(n.i32_const(-1))),n.ret(n.i32_const(1)))}function T(){let t=e.alloc(o*o*8),n=e.addFunction(c+`_mReduct`);n.addParam(`t`,`i32`),n.addParam(`r`,`i32`),n.addLocal(`np32`,`i64`),n.addLocal(`c`,`i64`),n.addLocal(`m`,`i64`);let r=n.getCodeBuilder(),a=Number(4294967296n-Wn(i,4294967296n));n.addCode(r.setLocal(`np32`,r.i64_const(a)));for(let e=0;e=o&&t.addCode(n.i64_store32(n.getLocal(`r`),(e-o)*4,n.getLocal(m))),[m,h]=[h,m],t.addCode(n.setLocal(h,n.i64_shr_u(n.getLocal(m),n.i64_const(32))))}t.addCode(n.i64_store32(n.getLocal(`r`),o*4-4,n.getLocal(m))),t.addCode(n.if(n.i32_wrap_i64(n.getLocal(h)),n.drop(n.call(l+`_sub`,n.getLocal(`r`),n.i32_const(u),n.getLocal(`r`))),n.if(n.call(l+`_gte`,n.getLocal(`r`),n.i32_const(u)),n.drop(n.call(l+`_sub`,n.getLocal(`r`),n.i32_const(u),n.getLocal(`r`))))))}function D(){let t=e.addFunction(c+`_square`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`),t.addLocal(`c0`,`i64`),t.addLocal(`c1`,`i64`),t.addLocal(`c0_old`,`i64`),t.addLocal(`c1_old`,`i64`),t.addLocal(`np32`,`i64`);for(let e=0;e>1&&r>1,e>>1)))),t.addCode(n.setLocal(`c1`,n.i64_add(n.getLocal(`c1`),n.i64_shr_u(n.getLocal(`c0`),n.i64_const(32)))))),e>0&&(t.addCode(n.setLocal(`c0`,n.i64_add(n.i64_and(n.getLocal(`c0`),n.i64_const(4294967295)),n.i64_and(n.getLocal(p),n.i64_const(4294967295))))),t.addCode(n.setLocal(`c1`,n.i64_add(n.i64_add(n.getLocal(`c1`),n.i64_shr_u(n.getLocal(`c0`),n.i64_const(32))),n.getLocal(m)))));for(let r=Math.max(1,e-o+1);r<=e&&r=o&&t.addCode(n.i64_store32(n.getLocal(`r`),(e-o)*4,n.getLocal(`c0`))),t.addCode(n.setLocal(p,n.getLocal(`c1`)),n.setLocal(m,n.i64_shr_u(n.getLocal(p),n.i64_const(32))))}t.addCode(n.i64_store32(n.getLocal(`r`),o*4-4,n.getLocal(p))),t.addCode(n.if(n.i32_wrap_i64(n.getLocal(m)),n.drop(n.call(l+`_sub`,n.getLocal(`r`),n.i32_const(u),n.getLocal(`r`))),n.if(n.call(l+`_gte`,n.getLocal(`r`),n.i32_const(u)),n.drop(n.call(l+`_sub`,n.getLocal(`r`),n.i32_const(u),n.getLocal(`r`))))))}function O(){let t=e.addFunction(c+`_squareOld`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder();t.addCode(n.call(c+`_mul`,n.getLocal(`x`),n.getLocal(`x`),n.getLocal(`r`)))}function k(){let t=e.addFunction(c+`_toMontgomery`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder();t.addCode(n.call(c+`_mul`,n.getLocal(`x`),n.i32_const(d),n.getLocal(`r`)))}function A(){let t=e.alloc(s*2),n=e.addFunction(c+`_fromMontgomery`);n.addParam(`x`,`i32`),n.addParam(`r`,`i32`);let r=n.getCodeBuilder();n.addCode(r.call(l+`_copy`,r.getLocal(`x`),r.i32_const(t))),n.addCode(r.call(l+`_zero`,r.i32_const(t+s))),n.addCode(r.call(c+`_mReduct`,r.i32_const(t),r.getLocal(`r`)))}function j(){let t=e.addFunction(c+`_inverse`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder();t.addCode(n.call(c+`_fromMontgomery`,n.getLocal(`x`),n.getLocal(`r`))),t.addCode(n.call(l+`_inverseMod`,n.getLocal(`r`),n.i32_const(u),n.getLocal(`r`))),t.addCode(n.call(c+`_toMontgomery`,n.getLocal(`r`),n.getLocal(`r`)))}let M=2n;if(Qn(i))for(;Gn(M,h,i)!==m;)M+=1n;let N=0,P=m;for(;!Ln(P)&&P!==0n;)N++,P>>=1n;let F=e.alloc(s,Q(P,s)),I=Gn(M,P,i),L=e.alloc(Q((I<>1n,z=e.alloc(s,Q(R,s));function ee(){let t=e.addFunction(c+`_sqrt`);t.addParam(`n`,`i32`),t.addParam(`r`,`i32`),t.addLocal(`m`,`i32`),t.addLocal(`i`,`i32`),t.addLocal(`j`,`i32`);let n=t.getCodeBuilder(),r=n.i32_const(f),i=n.i32_const(e.alloc(s)),a=n.i32_const(e.alloc(s)),o=n.i32_const(e.alloc(s)),l=n.i32_const(e.alloc(s)),u=n.i32_const(e.alloc(s));t.addCode(n.if(n.call(c+`_isZero`,n.getLocal(`n`)),n.ret(n.call(c+`_zero`,n.getLocal(`r`)))),n.setLocal(`m`,n.i32_const(N)),n.call(c+`_copy`,n.i32_const(L),i),n.call(c+`_exp`,n.getLocal(`n`),n.i32_const(F),n.i32_const(s),a),n.call(c+`_exp`,n.getLocal(`n`),n.i32_const(z),n.i32_const(s),o),n.block(n.loop(n.br_if(1,n.call(c+`_eq`,a,r)),n.call(c+`_square`,a,l),n.setLocal(`i`,n.i32_const(1)),n.block(n.loop(n.br_if(1,n.call(c+`_eq`,l,r)),n.call(c+`_square`,l,l),n.setLocal(`i`,n.i32_add(n.getLocal(`i`),n.i32_const(1))),n.br(0))),n.call(c+`_copy`,i,u),n.setLocal(`j`,n.i32_sub(n.i32_sub(n.getLocal(`m`),n.getLocal(`i`)),n.i32_const(1))),n.block(n.loop(n.br_if(1,n.i32_eqz(n.getLocal(`j`))),n.call(c+`_square`,u,u),n.setLocal(`j`,n.i32_sub(n.getLocal(`j`),n.i32_const(1))),n.br(0))),n.setLocal(`m`,n.getLocal(`i`)),n.call(c+`_square`,u,i),n.call(c+`_mul`,a,i,a),n.call(c+`_mul`,o,u,o),n.br(0))),n.if(n.call(c+`_isNegative`,o),n.call(c+`_neg`,o,n.getLocal(`r`)),n.call(c+`_copy`,o,n.getLocal(`r`))))}function te(){let t=e.addFunction(c+`_isSquare`);t.addParam(`n`,`i32`),t.setReturnType(`i32`);let n=t.getCodeBuilder(),r=n.i32_const(f),i=n.i32_const(e.alloc(s));t.addCode(n.if(n.call(c+`_isZero`,n.getLocal(`n`)),n.ret(n.i32_const(1))),n.call(c+`_exp`,n.getLocal(`n`),n.i32_const(g),n.i32_const(s),i),n.call(c+`_eq`,i,r))}function B(){let t=e.addFunction(c+`_load`);t.addParam(`scalar`,`i32`),t.addParam(`scalarLen`,`i32`),t.addParam(`r`,`i32`),t.addLocal(`p`,`i32`),t.addLocal(`l`,`i32`),t.addLocal(`i`,`i32`),t.addLocal(`j`,`i32`);let n=t.getCodeBuilder(),r=n.i32_const(e.alloc(s)),i=e.alloc(s),a=n.i32_const(i);t.addCode(n.call(l+`_zero`,n.getLocal(`r`)),n.setLocal(`i`,n.i32_const(s)),n.setLocal(`p`,n.getLocal(`scalar`)),n.block(n.loop(n.br_if(1,n.i32_gt_u(n.getLocal(`i`),n.getLocal(`scalarLen`))),n.if(n.i32_eq(n.getLocal(`i`),n.i32_const(s)),n.call(c+`_one`,r),n.call(c+`_mul`,r,n.i32_const(d),r)),n.call(c+`_mul`,n.getLocal(`p`),r,a),n.call(c+`_add`,n.getLocal(`r`),a,n.getLocal(`r`)),n.setLocal(`p`,n.i32_add(n.getLocal(`p`),n.i32_const(s))),n.setLocal(`i`,n.i32_add(n.getLocal(`i`),n.i32_const(s))),n.br(0))),n.setLocal(`l`,n.i32_rem_u(n.getLocal(`scalarLen`),n.i32_const(s))),n.if(n.i32_eqz(n.getLocal(`l`)),n.ret([])),n.call(l+`_zero`,a),n.setLocal(`j`,n.i32_const(0)),n.block(n.loop(n.br_if(1,n.i32_eq(n.getLocal(`j`),n.getLocal(`l`))),n.i32_store8(n.getLocal(`j`),i,n.i32_load8_u(n.getLocal(`p`))),n.setLocal(`p`,n.i32_add(n.getLocal(`p`),n.i32_const(1))),n.setLocal(`j`,n.i32_add(n.getLocal(`j`),n.i32_const(1))),n.br(0))),n.if(n.i32_eq(n.getLocal(`i`),n.i32_const(s)),n.call(c+`_one`,r),n.call(c+`_mul`,r,n.i32_const(d),r)),n.call(c+`_mul`,a,r,a),n.call(c+`_add`,n.getLocal(`r`),a,n.getLocal(`r`)))}function V(){let t=e.addFunction(c+`_timesScalar`);t.addParam(`x`,`i32`),t.addParam(`scalar`,`i32`),t.addParam(`scalarLen`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder(),r=n.i32_const(e.alloc(s));t.addCode(n.call(c+`_load`,n.getLocal(`scalar`),n.getLocal(`scalarLen`),r),n.call(c+`_toMontgomery`,r,r),n.call(c+`_mul`,n.getLocal(`x`),r,n.getLocal(`r`)))}function ne(){let t=e.addFunction(c+`_isOne`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let n=t.getCodeBuilder();t.addCode(n.ret(n.call(l+`_eq`,n.getLocal(`x`),n.i32_const(f))))}return e.exportFunction(l+`_copy`,c+`_copy`),e.exportFunction(l+`_zero`,c+`_zero`),e.exportFunction(l+`_isZero`,c+`_isZero`),e.exportFunction(l+`_eq`,c+`_eq`),ne(),b(),x(),S(),T(),E(),D(),O(),k(),A(),C(),w(),j(),y(),B(),V(),Dn(e,c),An(e,c+`_batchToMontgomery`,c+`_toMontgomery`,s,s),An(e,c+`_batchFromMontgomery`,c+`_fromMontgomery`,s,s),An(e,c+`_batchNeg`,c+`_neg`,s,s),Nn(e,c+`_batchAdd`,c+`_add`,s,s),Nn(e,c+`_batchSub`,c+`_sub`,s,s),Nn(e,c+`_batchMul`,c+`_mul`,s,s),e.exportFunction(c+`_add`),e.exportFunction(c+`_sub`),e.exportFunction(c+`_neg`),e.exportFunction(c+`_isNegative`),e.exportFunction(c+`_isOne`),e.exportFunction(c+`_sign`),e.exportFunction(c+`_mReduct`),e.exportFunction(c+`_mul`),e.exportFunction(c+`_square`),e.exportFunction(c+`_squareOld`),e.exportFunction(c+`_fromMontgomery`),e.exportFunction(c+`_toMontgomery`),e.exportFunction(c+`_inverse`),e.exportFunction(c+`_one`),e.exportFunction(c+`_load`),e.exportFunction(c+`_timesScalar`),wn(e,c+`_exp`,s,c+`_mul`,c+`_square`,l+`_copy`,c+`_one`),e.exportFunction(c+`_exp`),e.exportFunction(c+`_batchInverse`),Qn(i)&&(ee(),te(),e.exportFunction(c+`_sqrt`),e.exportFunction(c+`_isSquare`)),e.exportFunction(c+`_batchToMontgomery`),e.exportFunction(c+`_batchFromMontgomery`),c}var tr=s((()=>{Cn(),xn(),Tn(),On(),jn(),Pn(),$n()}));function nr(e,t,n,r,i){let a=BigInt(t),o=Math.floor((Vn(a-1n)-1)/64)+1,s=o*8,c=n||`f1`;if(e.modules[c])return c;e.modules[c]={n64:o};let l=i||`int`,u=er(e,a,r,l),d=e.modules[u].pR2,f=e.modules[u].pq,p=e.modules[u].pePlusOne;function m(){let t=e.alloc(s),n=e.addFunction(c+`_mul`);n.addParam(`x`,`i32`),n.addParam(`y`,`i32`),n.addParam(`r`,`i32`);let r=n.getCodeBuilder();n.addCode(r.call(u+`_mul`,r.getLocal(`x`),r.getLocal(`y`),r.i32_const(t))),n.addCode(r.call(u+`_mul`,r.i32_const(t),r.i32_const(d),r.getLocal(`r`)))}function h(){let t=e.addFunction(c+`_square`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder();t.addCode(n.call(c+`_mul`,n.getLocal(`x`),n.getLocal(`x`),n.getLocal(`r`)))}function g(){let t=e.addFunction(c+`_inverse`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let n=t.getCodeBuilder();t.addCode(n.call(l+`_inverseMod`,n.getLocal(`x`),n.i32_const(f),n.getLocal(`r`)))}function _(){let t=e.addFunction(c+`_isNegative`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let n=t.getCodeBuilder();t.addCode(n.call(l+`_gte`,n.getLocal(`x`),n.i32_const(p)))}return m(),h(),g(),_(),e.exportFunction(u+`_add`,c+`_add`),e.exportFunction(u+`_sub`,c+`_sub`),e.exportFunction(u+`_neg`,c+`_neg`),e.exportFunction(c+`_mul`),e.exportFunction(c+`_square`),e.exportFunction(c+`_inverse`),e.exportFunction(c+`_isNegative`),e.exportFunction(u+`_copy`,c+`_copy`),e.exportFunction(u+`_zero`,c+`_zero`),e.exportFunction(u+`_one`,c+`_one`),e.exportFunction(u+`_isZero`,c+`_isZero`),e.exportFunction(u+`_eq`,c+`_eq`),c}var rr=s((()=>{tr(),$n()}));function ir(e,t,n,r){if(e.modules[n])return n;let i=e.modules[r].n64*8,a=e.modules[r].q;e.modules[n]={n64:e.modules[r].n64*2};function o(){let t=e.addFunction(n+`_add`);t.addParam(`x`,`i32`),t.addParam(`y`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`y`),l=a.i32_add(a.getLocal(`y`),a.i32_const(i)),u=a.getLocal(`r`),d=a.i32_add(a.getLocal(`r`),a.i32_const(i));t.addCode(a.call(r+`_add`,o,c,u),a.call(r+`_add`,s,l,d))}function s(){let t=e.addFunction(n+`_timesScalar`);t.addParam(`x`,`i32`),t.addParam(`scalar`,`i32`),t.addParam(`scalarLen`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`r`),l=a.i32_add(a.getLocal(`r`),a.i32_const(i));t.addCode(a.call(r+`_timesScalar`,o,a.getLocal(`scalar`),a.getLocal(`scalarLen`),c),a.call(r+`_timesScalar`,s,a.getLocal(`scalar`),a.getLocal(`scalarLen`),l))}function c(){let t=e.addFunction(n+`_sub`);t.addParam(`x`,`i32`),t.addParam(`y`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`y`),l=a.i32_add(a.getLocal(`y`),a.i32_const(i)),u=a.getLocal(`r`),d=a.i32_add(a.getLocal(`r`),a.i32_const(i));t.addCode(a.call(r+`_sub`,o,c,u),a.call(r+`_sub`,s,l,d))}function l(){let t=e.addFunction(n+`_neg`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`r`),l=a.i32_add(a.getLocal(`r`),a.i32_const(i));t.addCode(a.call(r+`_neg`,o,c),a.call(r+`_neg`,s,l))}function u(){let t=e.addFunction(n+`_conjugate`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`r`),l=a.i32_add(a.getLocal(`r`),a.i32_const(i));t.addCode(a.call(r+`_copy`,o,c),a.call(r+`_neg`,s,l))}function d(){let t=e.addFunction(n+`_isNegative`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i));t.addCode(a.if(a.call(r+`_isZero`,s),a.ret(a.call(r+`_isNegative`,o))),a.ret(a.call(r+`_isNegative`,s)))}function f(){let a=e.addFunction(n+`_mul`);a.addParam(`x`,`i32`),a.addParam(`y`,`i32`),a.addParam(`r`,`i32`);let o=a.getCodeBuilder(),s=o.getLocal(`x`),c=o.i32_add(o.getLocal(`x`),o.i32_const(i)),l=o.getLocal(`y`),u=o.i32_add(o.getLocal(`y`),o.i32_const(i)),d=o.getLocal(`r`),f=o.i32_add(o.getLocal(`r`),o.i32_const(i)),p=o.i32_const(e.alloc(i)),m=o.i32_const(e.alloc(i)),h=o.i32_const(e.alloc(i)),g=o.i32_const(e.alloc(i));a.addCode(o.call(r+`_mul`,s,l,p),o.call(r+`_mul`,c,u,m),o.call(r+`_add`,s,c,h),o.call(r+`_add`,l,u,g),o.call(r+`_mul`,h,g,h),o.call(t,m,d),o.call(r+`_add`,p,d,d),o.call(r+`_add`,p,m,f),o.call(r+`_sub`,h,f,f))}function p(){let t=e.addFunction(n+`_mul1`);t.addParam(`x`,`i32`),t.addParam(`y`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`y`),l=a.getLocal(`r`),u=a.i32_add(a.getLocal(`r`),a.i32_const(i));t.addCode(a.call(r+`_mul`,o,c,l),a.call(r+`_mul`,s,c,u))}function m(){let a=e.addFunction(n+`_square`);a.addParam(`x`,`i32`),a.addParam(`r`,`i32`);let o=a.getCodeBuilder(),s=o.getLocal(`x`),c=o.i32_add(o.getLocal(`x`),o.i32_const(i)),l=o.getLocal(`r`),u=o.i32_add(o.getLocal(`r`),o.i32_const(i)),d=o.i32_const(e.alloc(i)),f=o.i32_const(e.alloc(i)),p=o.i32_const(e.alloc(i)),m=o.i32_const(e.alloc(i));a.addCode(o.call(r+`_mul`,s,c,d),o.call(r+`_add`,s,c,f),o.call(t,c,p),o.call(r+`_add`,s,p,p),o.call(t,d,m),o.call(r+`_add`,m,d,m),o.call(r+`_mul`,f,p,l),o.call(r+`_sub`,l,m,l),o.call(r+`_add`,d,d,u))}function h(){let t=e.addFunction(n+`_toMontgomery`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`r`),l=a.i32_add(a.getLocal(`r`),a.i32_const(i));t.addCode(a.call(r+`_toMontgomery`,o,c),a.call(r+`_toMontgomery`,s,l))}function g(){let t=e.addFunction(n+`_fromMontgomery`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`r`),l=a.i32_add(a.getLocal(`r`),a.i32_const(i));t.addCode(a.call(r+`_fromMontgomery`,o,c),a.call(r+`_fromMontgomery`,s,l))}function _(){let t=e.addFunction(n+`_copy`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`r`),l=a.i32_add(a.getLocal(`r`),a.i32_const(i));t.addCode(a.call(r+`_copy`,o,c),a.call(r+`_copy`,s,l))}function v(){let t=e.addFunction(n+`_zero`);t.addParam(`x`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i));t.addCode(a.call(r+`_zero`,o),a.call(r+`_zero`,s))}function y(){let t=e.addFunction(n+`_one`);t.addParam(`x`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i));t.addCode(a.call(r+`_one`,o),a.call(r+`_zero`,s))}function b(){let t=e.addFunction(n+`_eq`);t.addParam(`x`,`i32`),t.addParam(`y`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.getLocal(`y`),l=a.i32_add(a.getLocal(`y`),a.i32_const(i));t.addCode(a.i32_and(a.call(r+`_eq`,o,c),a.call(r+`_eq`,s,l)))}function x(){let t=e.addFunction(n+`_isZero`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i));t.addCode(a.i32_and(a.call(r+`_isZero`,o),a.call(r+`_isZero`,s)))}function S(){let a=e.addFunction(n+`_inverse`);a.addParam(`x`,`i32`),a.addParam(`r`,`i32`);let o=a.getCodeBuilder(),s=o.getLocal(`x`),c=o.i32_add(o.getLocal(`x`),o.i32_const(i)),l=o.getLocal(`r`),u=o.i32_add(o.getLocal(`r`),o.i32_const(i)),d=o.i32_const(e.alloc(i)),f=o.i32_const(e.alloc(i)),p=o.i32_const(e.alloc(i)),m=o.i32_const(e.alloc(i));a.addCode(o.call(r+`_square`,s,d),o.call(r+`_square`,c,f),o.call(t,f,p),o.call(r+`_sub`,d,p,p),o.call(r+`_inverse`,p,m),o.call(r+`_mul`,s,m,l),o.call(r+`_mul`,c,m,u),o.call(r+`_neg`,u,u))}function C(){let t=e.addFunction(n+`_sign`);t.addParam(`x`,`i32`),t.addLocal(`s`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i));t.addCode(a.setLocal(`s`,a.call(r+`_sign`,s)),a.if(a.getLocal(`s`),a.ret(a.getLocal(`s`))),a.ret(a.call(r+`_sign`,o)))}function w(){let t=e.addFunction(n+`_isOne`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i));t.addCode(a.ret(a.i32_and(a.call(r+`_isOne`,o),a.call(r+`_isZero`,s))))}function T(){let t=e.addFunction(n+`_sqrt`);t.addParam(`a`,`i32`),t.addParam(`pr`,`i32`);let o=t.getCodeBuilder(),s=o.i32_const(e.alloc(Q((BigInt(a||0)-3n)/4n,i))),c=o.i32_const(e.alloc(Q((BigInt(a||0)-1n)/2n,i))),l=o.getLocal(`a`),u=o.i32_const(e.alloc(i*2)),d=o.i32_const(e.alloc(i*2)),f=o.i32_const(e.alloc(i*2)),p=e.alloc(i*2),m=o.i32_const(p),h=o.i32_const(p),g=o.i32_const(p+i),_=o.i32_const(e.alloc(i*2)),v=o.i32_const(e.alloc(i*2));t.addCode(o.call(n+`_one`,m),o.call(n+`_neg`,m,m),o.call(n+`_exp`,l,s,o.i32_const(i),u),o.call(n+`_square`,u,d),o.call(n+`_mul`,l,d,d),o.call(n+`_conjugate`,d,f),o.call(n+`_mul`,f,d,f),o.if(o.call(n+`_eq`,f,m),o.unreachable()),o.call(n+`_mul`,u,l,_),o.if(o.call(n+`_eq`,d,m),[...o.call(r+`_zero`,h),...o.call(r+`_one`,g),...o.call(n+`_mul`,m,_,o.getLocal(`pr`))],[...o.call(n+`_one`,v),...o.call(n+`_add`,v,d,v),...o.call(n+`_exp`,v,c,o.i32_const(i),v),...o.call(n+`_mul`,v,_,o.getLocal(`pr`))]))}function E(){let t=e.addFunction(n+`_isSquare`);t.addParam(`a`,`i32`),t.setReturnType(`i32`);let r=t.getCodeBuilder(),o=r.i32_const(e.alloc(Q((BigInt(a||0)-3n)/4n,i))),s=r.getLocal(`a`),c=r.i32_const(e.alloc(i*2)),l=r.i32_const(e.alloc(i*2)),u=r.i32_const(e.alloc(i*2)),d=e.alloc(i*2),f=r.i32_const(d);t.addCode(r.call(n+`_one`,f),r.call(n+`_neg`,f,f),r.call(n+`_exp`,s,o,r.i32_const(i),c),r.call(n+`_square`,c,l),r.call(n+`_mul`,s,l,l),r.call(n+`_conjugate`,l,u),r.call(n+`_mul`,u,l,u),r.if(r.call(n+`_eq`,u,f),r.ret(r.i32_const(0))),r.ret(r.i32_const(1)))}return x(),w(),v(),y(),_(),f(),p(),m(),o(),c(),l(),u(),h(),g(),b(),S(),s(),C(),d(),e.exportFunction(n+`_isZero`),e.exportFunction(n+`_isOne`),e.exportFunction(n+`_zero`),e.exportFunction(n+`_one`),e.exportFunction(n+`_copy`),e.exportFunction(n+`_mul`),e.exportFunction(n+`_mul1`),e.exportFunction(n+`_square`),e.exportFunction(n+`_add`),e.exportFunction(n+`_sub`),e.exportFunction(n+`_neg`),e.exportFunction(n+`_sign`),e.exportFunction(n+`_conjugate`),e.exportFunction(n+`_fromMontgomery`),e.exportFunction(n+`_toMontgomery`),e.exportFunction(n+`_eq`),e.exportFunction(n+`_inverse`),Dn(e,n),wn(e,n+`_exp`,i*2,n+`_mul`,n+`_square`,n+`_copy`,n+`_one`),T(),E(),e.exportFunction(n+`_exp`),e.exportFunction(n+`_timesScalar`),e.exportFunction(n+`_batchInverse`),e.exportFunction(n+`_sqrt`),e.exportFunction(n+`_isSquare`),e.exportFunction(n+`_isNegative`),n}var ar=s((()=>{Tn(),On(),xn()}));function or(e,t,n,r){if(e.modules[n])return n;let i=e.modules[r].n64*8;e.modules[n]={n64:e.modules[r].n64*3};function a(){let t=e.addFunction(n+`_add`);t.addParam(`x`,`i32`),t.addParam(`y`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i)),l=a.getLocal(`y`),u=a.i32_add(a.getLocal(`y`),a.i32_const(i)),d=a.i32_add(a.getLocal(`y`),a.i32_const(2*i)),f=a.getLocal(`r`),p=a.i32_add(a.getLocal(`r`),a.i32_const(i)),m=a.i32_add(a.getLocal(`r`),a.i32_const(2*i));t.addCode(a.call(r+`_add`,o,l,f),a.call(r+`_add`,s,u,p),a.call(r+`_add`,c,d,m))}function o(){let t=e.addFunction(n+`_timesScalar`);t.addParam(`x`,`i32`),t.addParam(`scalar`,`i32`),t.addParam(`scalarLen`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i)),l=a.getLocal(`r`),u=a.i32_add(a.getLocal(`r`),a.i32_const(i)),d=a.i32_add(a.getLocal(`r`),a.i32_const(2*i));t.addCode(a.call(r+`_timesScalar`,o,a.getLocal(`scalar`),a.getLocal(`scalarLen`),l),a.call(r+`_timesScalar`,s,a.getLocal(`scalar`),a.getLocal(`scalarLen`),u),a.call(r+`_timesScalar`,c,a.getLocal(`scalar`),a.getLocal(`scalarLen`),d))}function s(){let t=e.addFunction(n+`_sub`);t.addParam(`x`,`i32`),t.addParam(`y`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i)),l=a.getLocal(`y`),u=a.i32_add(a.getLocal(`y`),a.i32_const(i)),d=a.i32_add(a.getLocal(`y`),a.i32_const(2*i)),f=a.getLocal(`r`),p=a.i32_add(a.getLocal(`r`),a.i32_const(i)),m=a.i32_add(a.getLocal(`r`),a.i32_const(2*i));t.addCode(a.call(r+`_sub`,o,l,f),a.call(r+`_sub`,s,u,p),a.call(r+`_sub`,c,d,m))}function c(){let t=e.addFunction(n+`_neg`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i)),l=a.getLocal(`r`),u=a.i32_add(a.getLocal(`r`),a.i32_const(i)),d=a.i32_add(a.getLocal(`r`),a.i32_const(2*i));t.addCode(a.call(r+`_neg`,o,l),a.call(r+`_neg`,s,u),a.call(r+`_neg`,c,d))}function l(){let t=e.addFunction(n+`_isNegative`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i));t.addCode(a.if(a.call(r+`_isZero`,c),a.if(a.call(r+`_isZero`,s),a.ret(a.call(r+`_isNegative`,o)),a.ret(a.call(r+`_isNegative`,s)))),a.ret(a.call(r+`_isNegative`,c)))}function u(){let a=e.addFunction(n+`_mul`);a.addParam(`x`,`i32`),a.addParam(`y`,`i32`),a.addParam(`r`,`i32`);let o=a.getCodeBuilder(),s=o.getLocal(`x`),c=o.i32_add(o.getLocal(`x`),o.i32_const(i)),l=o.i32_add(o.getLocal(`x`),o.i32_const(2*i)),u=o.getLocal(`y`),d=o.i32_add(o.getLocal(`y`),o.i32_const(i)),f=o.i32_add(o.getLocal(`y`),o.i32_const(2*i)),p=o.getLocal(`r`),m=o.i32_add(o.getLocal(`r`),o.i32_const(i)),h=o.i32_add(o.getLocal(`r`),o.i32_const(2*i)),g=o.i32_const(e.alloc(i)),_=o.i32_const(e.alloc(i)),v=o.i32_const(e.alloc(i)),y=o.i32_const(e.alloc(i)),b=o.i32_const(e.alloc(i)),x=o.i32_const(e.alloc(i)),S=o.i32_const(e.alloc(i)),C=o.i32_const(e.alloc(i)),w=o.i32_const(e.alloc(i)),T=o.i32_const(e.alloc(i)),E=o.i32_const(e.alloc(i)),D=o.i32_const(e.alloc(i)),O=o.i32_const(e.alloc(i));a.addCode(o.call(r+`_mul`,s,u,g),o.call(r+`_mul`,c,d,_),o.call(r+`_mul`,l,f,v),o.call(r+`_add`,s,c,y),o.call(r+`_add`,u,d,b),o.call(r+`_add`,s,l,x),o.call(r+`_add`,u,f,S),o.call(r+`_add`,c,l,C),o.call(r+`_add`,d,f,w),o.call(r+`_add`,g,_,T),o.call(r+`_add`,g,v,E),o.call(r+`_add`,_,v,D),o.call(r+`_mul`,C,w,p),o.call(r+`_sub`,p,D,p),o.call(t,p,p),o.call(r+`_add`,g,p,p),o.call(r+`_mul`,y,b,m),o.call(r+`_sub`,m,T,m),o.call(t,v,O),o.call(r+`_add`,m,O,m),o.call(r+`_mul`,x,S,h),o.call(r+`_sub`,h,E,h),o.call(r+`_add`,h,_,h))}function d(){let a=e.addFunction(n+`_square`);a.addParam(`x`,`i32`),a.addParam(`r`,`i32`);let o=a.getCodeBuilder(),s=o.getLocal(`x`),c=o.i32_add(o.getLocal(`x`),o.i32_const(i)),l=o.i32_add(o.getLocal(`x`),o.i32_const(2*i)),u=o.getLocal(`r`),d=o.i32_add(o.getLocal(`r`),o.i32_const(i)),f=o.i32_add(o.getLocal(`r`),o.i32_const(2*i)),p=o.i32_const(e.alloc(i)),m=o.i32_const(e.alloc(i)),h=o.i32_const(e.alloc(i)),g=o.i32_const(e.alloc(i)),_=o.i32_const(e.alloc(i)),v=o.i32_const(e.alloc(i)),y=o.i32_const(e.alloc(i));a.addCode(o.call(r+`_square`,s,p),o.call(r+`_mul`,s,c,m),o.call(r+`_add`,m,m,h),o.call(r+`_sub`,s,c,g),o.call(r+`_add`,g,l,g),o.call(r+`_square`,g,g),o.call(r+`_mul`,c,l,_),o.call(r+`_add`,_,_,v),o.call(r+`_square`,l,y),o.call(t,v,u),o.call(r+`_add`,p,u,u),o.call(t,y,d),o.call(r+`_add`,h,d,d),o.call(r+`_add`,p,y,f),o.call(r+`_sub`,v,f,f),o.call(r+`_add`,g,f,f),o.call(r+`_add`,h,f,f))}function f(){let t=e.addFunction(n+`_toMontgomery`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i)),l=a.getLocal(`r`),u=a.i32_add(a.getLocal(`r`),a.i32_const(i)),d=a.i32_add(a.getLocal(`r`),a.i32_const(2*i));t.addCode(a.call(r+`_toMontgomery`,o,l),a.call(r+`_toMontgomery`,s,u),a.call(r+`_toMontgomery`,c,d))}function p(){let t=e.addFunction(n+`_fromMontgomery`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i)),l=a.getLocal(`r`),u=a.i32_add(a.getLocal(`r`),a.i32_const(i)),d=a.i32_add(a.getLocal(`r`),a.i32_const(2*i));t.addCode(a.call(r+`_fromMontgomery`,o,l),a.call(r+`_fromMontgomery`,s,u),a.call(r+`_fromMontgomery`,c,d))}function m(){let t=e.addFunction(n+`_copy`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i)),l=a.getLocal(`r`),u=a.i32_add(a.getLocal(`r`),a.i32_const(i)),d=a.i32_add(a.getLocal(`r`),a.i32_const(2*i));t.addCode(a.call(r+`_copy`,o,l),a.call(r+`_copy`,s,u),a.call(r+`_copy`,c,d))}function h(){let t=e.addFunction(n+`_zero`);t.addParam(`x`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i));t.addCode(a.call(r+`_zero`,o),a.call(r+`_zero`,s),a.call(r+`_zero`,c))}function g(){let t=e.addFunction(n+`_one`);t.addParam(`x`,`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i));t.addCode(a.call(r+`_one`,o),a.call(r+`_zero`,s),a.call(r+`_zero`,c))}function _(){let t=e.addFunction(n+`_eq`);t.addParam(`x`,`i32`),t.addParam(`y`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i)),l=a.getLocal(`y`),u=a.i32_add(a.getLocal(`y`),a.i32_const(i)),d=a.i32_add(a.getLocal(`y`),a.i32_const(2*i));t.addCode(a.i32_and(a.i32_and(a.call(r+`_eq`,o,l),a.call(r+`_eq`,s,u)),a.call(r+`_eq`,c,d)))}function v(){let t=e.addFunction(n+`_isZero`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i));t.addCode(a.i32_and(a.i32_and(a.call(r+`_isZero`,o),a.call(r+`_isZero`,s)),a.call(r+`_isZero`,c)))}function y(){let a=e.addFunction(n+`_inverse`);a.addParam(`x`,`i32`),a.addParam(`r`,`i32`);let o=a.getCodeBuilder(),s=o.getLocal(`x`),c=o.i32_add(o.getLocal(`x`),o.i32_const(i)),l=o.i32_add(o.getLocal(`x`),o.i32_const(2*i)),u=o.getLocal(`r`),d=o.i32_add(o.getLocal(`r`),o.i32_const(i)),f=o.i32_add(o.getLocal(`r`),o.i32_const(2*i)),p=o.i32_const(e.alloc(i)),m=o.i32_const(e.alloc(i)),h=o.i32_const(e.alloc(i)),g=o.i32_const(e.alloc(i)),_=o.i32_const(e.alloc(i)),v=o.i32_const(e.alloc(i)),y=o.i32_const(e.alloc(i)),b=o.i32_const(e.alloc(i)),x=o.i32_const(e.alloc(i)),S=o.i32_const(e.alloc(i)),C=o.i32_const(e.alloc(i));a.addCode(o.call(r+`_square`,s,p),o.call(r+`_square`,c,m),o.call(r+`_square`,l,h),o.call(r+`_mul`,s,c,g),o.call(r+`_mul`,s,l,_),o.call(r+`_mul`,c,l,v),o.call(t,v,y),o.call(r+`_sub`,p,y,y),o.call(t,h,b),o.call(r+`_sub`,b,g,b),o.call(r+`_sub`,m,_,x),o.call(r+`_mul`,l,b,S),o.call(r+`_mul`,c,x,C),o.call(r+`_add`,S,C,S),o.call(t,S,S),o.call(r+`_mul`,s,y,C),o.call(r+`_add`,C,S,S),o.call(r+`_inverse`,S,S),o.call(r+`_mul`,S,y,u),o.call(r+`_mul`,S,b,d),o.call(r+`_mul`,S,x,f))}function b(){let t=e.addFunction(n+`_sign`);t.addParam(`x`,`i32`),t.addLocal(`s`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(2*i));t.addCode(a.setLocal(`s`,a.call(r+`_sign`,c)),a.if(a.getLocal(`s`),a.ret(a.getLocal(`s`))),a.setLocal(`s`,a.call(r+`_sign`,s)),a.if(a.getLocal(`s`),a.ret(a.getLocal(`s`))),a.ret(a.call(r+`_sign`,o)))}function x(){let t=e.addFunction(n+`_isOne`);t.addParam(`x`,`i32`),t.setReturnType(`i32`);let a=t.getCodeBuilder(),o=a.getLocal(`x`),s=a.i32_add(a.getLocal(`x`),a.i32_const(i)),c=a.i32_add(a.getLocal(`x`),a.i32_const(i*2));t.addCode(a.ret(a.i32_and(a.i32_and(a.call(r+`_isOne`,o),a.call(r+`_isZero`,s)),a.call(r+`_isZero`,c))))}return v(),x(),h(),g(),m(),u(),d(),a(),s(),c(),b(),f(),p(),_(),y(),o(),l(),e.exportFunction(n+`_isZero`),e.exportFunction(n+`_isOne`),e.exportFunction(n+`_zero`),e.exportFunction(n+`_one`),e.exportFunction(n+`_copy`),e.exportFunction(n+`_mul`),e.exportFunction(n+`_square`),e.exportFunction(n+`_add`),e.exportFunction(n+`_sub`),e.exportFunction(n+`_neg`),e.exportFunction(n+`_sign`),e.exportFunction(n+`_fromMontgomery`),e.exportFunction(n+`_toMontgomery`),e.exportFunction(n+`_eq`),e.exportFunction(n+`_inverse`),Dn(e,n),wn(e,n+`_exp`,i*3,n+`_mul`,n+`_square`,n+`_copy`,n+`_one`),e.exportFunction(n+`_exp`),e.exportFunction(n+`_timesScalar`),e.exportFunction(n+`_batchInverse`),e.exportFunction(n+`_isNegative`),n}var sr=s((()=>{Tn(),On()}));function cr(e,t,n,r,i,a,o,s){let c=e.addFunction(t);c.addParam(`base`,`i32`),c.addParam(`scalar`,`i32`),c.addParam(`scalarLength`,`i32`),c.addParam(`r`,`i32`),c.addLocal(`old0`,`i32`),c.addLocal(`nbits`,`i32`),c.addLocal(`i`,`i32`),c.addLocal(`last`,`i32`),c.addLocal(`cur`,`i32`),c.addLocal(`carry`,`i32`),c.addLocal(`p`,`i32`);let l=c.getCodeBuilder(),u=l.i32_const(e.alloc(n));function d(e){return l.i32_and(l.i32_shr_u(l.i32_load(l.i32_add(l.getLocal(`scalar`),l.i32_and(l.i32_shr_u(e,l.i32_const(3)),l.i32_const(4294967292)))),l.i32_and(e,l.i32_const(31))),l.i32_const(1))}function f(e){return[...l.i32_store8(l.getLocal(`p`),l.i32_const(e)),...l.setLocal(`p`,l.i32_add(l.getLocal(`p`),l.i32_const(1)))]}c.addCode(l.if(l.i32_eqz(l.getLocal(`scalarLength`)),[...l.call(s,l.getLocal(`r`)),...l.ret([])]),l.setLocal(`nbits`,l.i32_shl(l.getLocal(`scalarLength`),l.i32_const(3))),l.setLocal(`old0`,l.i32_load(l.i32_const(0))),l.setLocal(`p`,l.getLocal(`old0`)),l.i32_store(l.i32_const(0),l.i32_and(l.i32_add(l.i32_add(l.getLocal(`old0`),l.i32_const(32)),l.getLocal(`nbits`)),l.i32_const(4294967288))),l.setLocal(`i`,l.i32_const(1)),l.setLocal(`last`,d(l.i32_const(0))),l.setLocal(`carry`,l.i32_const(0)),l.block(l.loop(l.br_if(1,l.i32_eq(l.getLocal(`i`),l.getLocal(`nbits`))),l.setLocal(`cur`,d(l.getLocal(`i`))),l.if(l.getLocal(`last`),l.if(l.getLocal(`cur`),l.if(l.getLocal(`carry`),[...l.setLocal(`last`,l.i32_const(0)),...l.setLocal(`carry`,l.i32_const(1)),...f(1)],[...l.setLocal(`last`,l.i32_const(0)),...l.setLocal(`carry`,l.i32_const(1)),...f(255)]),l.if(l.getLocal(`carry`),[...l.setLocal(`last`,l.i32_const(0)),...l.setLocal(`carry`,l.i32_const(1)),...f(255)],[...l.setLocal(`last`,l.i32_const(0)),...l.setLocal(`carry`,l.i32_const(0)),...f(1)])),l.if(l.getLocal(`cur`),l.if(l.getLocal(`carry`),[...l.setLocal(`last`,l.i32_const(0)),...l.setLocal(`carry`,l.i32_const(1)),...f(0)],[...l.setLocal(`last`,l.i32_const(1)),...l.setLocal(`carry`,l.i32_const(0)),...f(0)]),l.if(l.getLocal(`carry`),[...l.setLocal(`last`,l.i32_const(1)),...l.setLocal(`carry`,l.i32_const(0)),...f(0)],[...l.setLocal(`last`,l.i32_const(0)),...l.setLocal(`carry`,l.i32_const(0)),...f(0)]))),l.setLocal(`i`,l.i32_add(l.getLocal(`i`),l.i32_const(1))),l.br(0))),l.if(l.getLocal(`last`),l.if(l.getLocal(`carry`),[...f(255),...f(0),...f(1)],[...f(1)]),l.if(l.getLocal(`carry`),[...f(0),...f(1)])),l.setLocal(`p`,l.i32_sub(l.getLocal(`p`),l.i32_const(1))),l.call(o,l.getLocal(`base`),u),l.call(s,l.getLocal(`r`)),l.block(l.loop(l.call(i,l.getLocal(`r`),l.getLocal(`r`)),l.setLocal(`cur`,l.i32_load8_u(l.getLocal(`p`))),l.if(l.getLocal(`cur`),l.if(l.i32_eq(l.getLocal(`cur`),l.i32_const(1)),l.call(r,l.getLocal(`r`),u,l.getLocal(`r`)),l.call(a,l.getLocal(`r`),u,l.getLocal(`r`)))),l.br_if(1,l.i32_eq(l.getLocal(`old0`),l.getLocal(`p`))),l.setLocal(`p`,l.i32_sub(l.getLocal(`p`),l.i32_const(1))),l.br(0))),l.i32_store(l.i32_const(0),l.getLocal(`old0`)))}var lr=s((()=>{}));function ur(e,t,n,r,i){let a=e.modules[t].n64*8;function o(){let t=e.addFunction(n+`_getChunk`);t.addParam(`pScalar`,`i32`),t.addParam(`scalarSize`,`i32`),t.addParam(`startBit`,`i32`),t.addParam(`chunkSize`,`i32`),t.addLocal(`bitsToEnd`,`i32`),t.addLocal(`mask`,`i32`),t.setReturnType(`i32`);let r=t.getCodeBuilder();t.addCode(r.setLocal(`bitsToEnd`,r.i32_sub(r.i32_mul(r.getLocal(`scalarSize`),r.i32_const(8)),r.getLocal(`startBit`))),r.if(r.i32_gt_s(r.getLocal(`chunkSize`),r.getLocal(`bitsToEnd`)),r.setLocal(`mask`,r.i32_sub(r.i32_shl(r.i32_const(1),r.getLocal(`bitsToEnd`)),r.i32_const(1))),r.setLocal(`mask`,r.i32_sub(r.i32_shl(r.i32_const(1),r.getLocal(`chunkSize`)),r.i32_const(1)))),r.i32_and(r.i32_shr_u(r.i32_load(r.i32_add(r.getLocal(`pScalar`),r.i32_shr_u(r.getLocal(`startBit`),r.i32_const(3))),0,0),r.i32_and(r.getLocal(`startBit`),r.i32_const(7))),r.getLocal(`mask`)))}function s(){let o=e.addFunction(n+`_chunk`);o.addParam(`pBases`,`i32`),o.addParam(`pScalars`,`i32`),o.addParam(`scalarSize`,`i32`),o.addParam(`n`,`i32`),o.addParam(`startBit`,`i32`),o.addParam(`chunkSize`,`i32`),o.addParam(`pr`,`i32`),o.addLocal(`nChunks`,`i32`),o.addLocal(`itScalar`,`i32`),o.addLocal(`endScalar`,`i32`),o.addLocal(`itBase`,`i32`),o.addLocal(`i`,`i32`),o.addLocal(`j`,`i32`),o.addLocal(`nTable`,`i32`),o.addLocal(`pTable`,`i32`),o.addLocal(`idx`,`i32`),o.addLocal(`pIdxTable`,`i32`);let s=o.getCodeBuilder();o.addCode(s.if(s.i32_eqz(s.getLocal(`n`)),[...s.call(t+`_zero`,s.getLocal(`pr`)),...s.ret([])]),s.setLocal(`nTable`,s.i32_shl(s.i32_const(1),s.getLocal(`chunkSize`))),s.setLocal(`pTable`,s.i32_load(s.i32_const(0))),s.i32_store(s.i32_const(0),s.i32_add(s.getLocal(`pTable`),s.i32_mul(s.getLocal(`nTable`),s.i32_const(a)))),s.setLocal(`j`,s.i32_const(0)),s.block(s.loop(s.br_if(1,s.i32_eq(s.getLocal(`j`),s.getLocal(`nTable`))),s.call(t+`_zero`,s.i32_add(s.getLocal(`pTable`),s.i32_mul(s.getLocal(`j`),s.i32_const(a)))),s.setLocal(`j`,s.i32_add(s.getLocal(`j`),s.i32_const(1))),s.br(0))),s.setLocal(`itBase`,s.getLocal(`pBases`)),s.setLocal(`itScalar`,s.getLocal(`pScalars`)),s.setLocal(`endScalar`,s.i32_add(s.getLocal(`pScalars`),s.i32_mul(s.getLocal(`n`),s.getLocal(`scalarSize`)))),s.block(s.loop(s.br_if(1,s.i32_eq(s.getLocal(`itScalar`),s.getLocal(`endScalar`))),s.setLocal(`idx`,s.call(n+`_getChunk`,s.getLocal(`itScalar`),s.getLocal(`scalarSize`),s.getLocal(`startBit`),s.getLocal(`chunkSize`))),s.if(s.getLocal(`idx`),[...s.setLocal(`pIdxTable`,s.i32_add(s.getLocal(`pTable`),s.i32_mul(s.i32_sub(s.getLocal(`idx`),s.i32_const(1)),s.i32_const(a)))),...s.call(r,s.getLocal(`pIdxTable`),s.getLocal(`itBase`),s.getLocal(`pIdxTable`))]),s.setLocal(`itScalar`,s.i32_add(s.getLocal(`itScalar`),s.getLocal(`scalarSize`))),s.setLocal(`itBase`,s.i32_add(s.getLocal(`itBase`),s.i32_const(i))),s.br(0))),s.call(n+`_reduceTable`,s.getLocal(`pTable`),s.getLocal(`chunkSize`)),s.call(t+`_copy`,s.getLocal(`pTable`),s.getLocal(`pr`)),s.i32_store(s.i32_const(0),s.getLocal(`pTable`)))}function c(){let r=e.addFunction(n);r.addParam(`pBases`,`i32`),r.addParam(`pScalars`,`i32`),r.addParam(`scalarSize`,`i32`),r.addParam(`n`,`i32`),r.addParam(`pr`,`i32`),r.addLocal(`chunkSize`,`i32`),r.addLocal(`nChunks`,`i32`),r.addLocal(`itScalar`,`i32`),r.addLocal(`endScalar`,`i32`),r.addLocal(`itBase`,`i32`),r.addLocal(`itBit`,`i32`),r.addLocal(`i`,`i32`),r.addLocal(`j`,`i32`),r.addLocal(`nTable`,`i32`),r.addLocal(`pTable`,`i32`),r.addLocal(`idx`,`i32`),r.addLocal(`pIdxTable`,`i32`);let i=r.getCodeBuilder(),o=i.i32_const(e.alloc(a)),s=e.alloc([17,17,17,17,17,17,17,17,17,17,16,16,15,14,13,13,12,11,10,9,8,7,7,6,5,4,3,2,1,1,1,1]);r.addCode(i.call(t+`_zero`,i.getLocal(`pr`)),i.if(i.i32_eqz(i.getLocal(`n`)),i.ret([])),i.setLocal(`chunkSize`,i.i32_load8_u(i.i32_clz(i.getLocal(`n`)),s)),i.setLocal(`nChunks`,i.i32_add(i.i32_div_u(i.i32_sub(i.i32_shl(i.getLocal(`scalarSize`),i.i32_const(3)),i.i32_const(1)),i.getLocal(`chunkSize`)),i.i32_const(1))),i.setLocal(`itBit`,i.i32_mul(i.i32_sub(i.getLocal(`nChunks`),i.i32_const(1)),i.getLocal(`chunkSize`))),i.block(i.loop(i.br_if(1,i.i32_lt_s(i.getLocal(`itBit`),i.i32_const(0))),i.if(i.i32_eqz(i.call(t+`_isZero`,i.getLocal(`pr`))),[...i.setLocal(`j`,i.i32_const(0)),...i.block(i.loop(i.br_if(1,i.i32_eq(i.getLocal(`j`),i.getLocal(`chunkSize`))),i.call(t+`_double`,i.getLocal(`pr`),i.getLocal(`pr`)),i.setLocal(`j`,i.i32_add(i.getLocal(`j`),i.i32_const(1))),i.br(0)))]),i.call(n+`_chunk`,i.getLocal(`pBases`),i.getLocal(`pScalars`),i.getLocal(`scalarSize`),i.getLocal(`n`),i.getLocal(`itBit`),i.getLocal(`chunkSize`),o),i.call(t+`_add`,i.getLocal(`pr`),o,i.getLocal(`pr`)),i.setLocal(`itBit`,i.i32_sub(i.getLocal(`itBit`),i.getLocal(`chunkSize`))),i.br(0))))}function l(){let r=e.addFunction(n+`_reduceTable`);r.addParam(`pTable`,`i32`),r.addParam(`p`,`i32`),r.addLocal(`half`,`i32`),r.addLocal(`it1`,`i32`),r.addLocal(`it2`,`i32`),r.addLocal(`pAcc`,`i32`);let i=r.getCodeBuilder();r.addCode(i.if(i.i32_eq(i.getLocal(`p`),i.i32_const(1)),i.ret([])),i.setLocal(`half`,i.i32_shl(i.i32_const(1),i.i32_sub(i.getLocal(`p`),i.i32_const(1)))),i.setLocal(`it1`,i.getLocal(`pTable`)),i.setLocal(`it2`,i.i32_add(i.getLocal(`pTable`),i.i32_mul(i.getLocal(`half`),i.i32_const(a)))),i.setLocal(`pAcc`,i.i32_sub(i.getLocal(`it2`),i.i32_const(a))),i.block(i.loop(i.br_if(1,i.i32_eq(i.getLocal(`it1`),i.getLocal(`pAcc`))),i.call(t+`_add`,i.getLocal(`it1`),i.getLocal(`it2`),i.getLocal(`it1`)),i.call(t+`_add`,i.getLocal(`pAcc`),i.getLocal(`it2`),i.getLocal(`pAcc`)),i.setLocal(`it1`,i.i32_add(i.getLocal(`it1`),i.i32_const(a))),i.setLocal(`it2`,i.i32_add(i.getLocal(`it2`),i.i32_const(a))),i.br(0))),i.call(n+`_reduceTable`,i.getLocal(`pTable`),i.i32_sub(i.getLocal(`p`),i.i32_const(1))),i.setLocal(`p`,i.i32_sub(i.getLocal(`p`),i.i32_const(1))),i.block(i.loop(i.br_if(1,i.i32_eqz(i.getLocal(`p`))),i.call(t+`_double`,i.getLocal(`pAcc`),i.getLocal(`pAcc`)),i.setLocal(`p`,i.i32_sub(i.getLocal(`p`),i.i32_const(1))),i.br(0))),i.call(t+`_add`,i.getLocal(`pTable`),i.getLocal(`pAcc`),i.getLocal(`pTable`)))}o(),l(),s(),c(),e.exportFunction(n),e.exportFunction(n+`_chunk`)}var dr=s((()=>{}));function fr(e,t,n,r){let i=e.modules[n].n64,a=i*8;if(e.modules[t])return t;e.modules[t]={n64:i*3};function o(){let r=e.addFunction(t+`_isZero`);r.addParam(`p1`,`i32`),r.setReturnType(`i32`);let i=r.getCodeBuilder();r.addCode(i.call(n+`_isZero`,i.i32_add(i.getLocal(`p1`),i.i32_const(a*2))))}function s(){let r=e.addFunction(t+`_isZeroAffine`);r.addParam(`p1`,`i32`),r.setReturnType(`i32`);let i=r.getCodeBuilder();r.addCode(i.i32_and(i.call(n+`_isZero`,i.getLocal(`p1`)),i.call(n+`_isZero`,i.i32_add(i.getLocal(`p1`),i.i32_const(a)))))}function c(){let n=e.addFunction(t+`_copy`);n.addParam(`ps`,`i32`),n.addParam(`pd`,`i32`);let r=n.getCodeBuilder();for(let e=0;e{lr(),jn(),dr()}));function mr(e,t,n,r,i){let a=e.modules[r].n64*8,o=e.modules[n].n64*8,s=e.modules[r].q,c=s-1n,l=0;for(;!Ln(c);)l++,c>>=1n;let u=2n;for(;Gn(u,s>>1n,s)===1n;)u+=1n;let d=Array(l+1);d[l]=Gn(u,c,s);let f=l-1;for(;f>=0;)d[f]=Gn(d[f+1],2n,s),f--;let p=[],m=(1n<>n);return t}let T=Array(256);for(let e=0;e<256;e++)T[e]=w(e);let E=e.alloc(T);function D(){let n=e.addFunction(t+`__log2`);n.addParam(`n`,`i32`),n.setReturnType(`i32`),n.addLocal(`bits`,`i32`),n.addLocal(`aux`,`i32`);let r=n.getCodeBuilder();n.addCode(r.setLocal(`aux`,r.i32_shr_u(r.getLocal(`n`),r.i32_const(1)))),n.addCode(r.setLocal(`bits`,r.i32_const(0))),n.addCode(r.block(r.loop(r.br_if(1,r.i32_eqz(r.getLocal(`aux`))),r.setLocal(`aux`,r.i32_shr_u(r.getLocal(`aux`),r.i32_const(1))),r.setLocal(`bits`,r.i32_add(r.getLocal(`bits`),r.i32_const(1))),r.br(0)))),n.addCode(r.if(r.i32_ne(r.getLocal(`n`),r.i32_shl(r.i32_const(1),r.getLocal(`bits`))),r.unreachable())),n.addCode(r.if(r.i32_gt_u(r.getLocal(`bits`),r.i32_const(l)),r.unreachable())),n.addCode(r.getLocal(`bits`))}function O(){let n=e.addFunction(t+`_fft`);n.addParam(`px`,`i32`),n.addParam(`n`,`i32`),n.addLocal(`bits`,`i32`);let i=n.getCodeBuilder(),o=i.i32_const(e.alloc(a));n.addCode(i.setLocal(`bits`,i.call(t+`__log2`,i.getLocal(`n`))),i.call(r+`_one`,o),i.call(t+`_rawfft`,i.getLocal(`px`),i.getLocal(`bits`),i.i32_const(0),o))}function k(){let n=e.addFunction(t+`_ifft`);n.addParam(`px`,`i32`),n.addParam(`n`,`i32`),n.addLocal(`bits`,`i32`),n.addLocal(`pInv2`,`i32`);let r=n.getCodeBuilder();n.addCode(r.setLocal(`bits`,r.call(t+`__log2`,r.getLocal(`n`))),r.setLocal(`pInv2`,r.i32_add(r.i32_const(v),r.i32_mul(r.getLocal(`bits`),r.i32_const(a)))),r.call(t+`_rawfft`,r.getLocal(`px`),r.getLocal(`bits`),r.i32_const(1),r.getLocal(`pInv2`)))}function A(){let s=e.addFunction(t+`_rawfft`);s.addParam(`px`,`i32`),s.addParam(`bits`,`i32`),s.addParam(`reverse`,`i32`),s.addParam(`mulFactor`,`i32`),s.addLocal(`s`,`i32`),s.addLocal(`k`,`i32`),s.addLocal(`j`,`i32`),s.addLocal(`m`,`i32`),s.addLocal(`mdiv2`,`i32`),s.addLocal(`n`,`i32`),s.addLocal(`pwm`,`i32`),s.addLocal(`idx1`,`i32`),s.addLocal(`idx2`,`i32`);let c=s.getCodeBuilder(),l=c.i32_const(e.alloc(a)),u=c.i32_const(e.alloc(o)),d=c.i32_const(e.alloc(o));s.addCode(c.call(t+`__reversePermutation`,c.getLocal(`px`),c.getLocal(`bits`)),c.setLocal(`n`,c.i32_shl(c.i32_const(1),c.getLocal(`bits`))),c.setLocal(`s`,c.i32_const(1)),c.block(c.loop(c.br_if(1,c.i32_gt_u(c.getLocal(`s`),c.getLocal(`bits`))),c.setLocal(`m`,c.i32_shl(c.i32_const(1),c.getLocal(`s`))),c.setLocal(`pwm`,c.i32_add(c.i32_const(h),c.i32_mul(c.getLocal(`s`),c.i32_const(a)))),c.setLocal(`k`,c.i32_const(0)),c.block(c.loop(c.br_if(1,c.i32_ge_u(c.getLocal(`k`),c.getLocal(`n`))),c.call(r+`_one`,l),c.setLocal(`mdiv2`,c.i32_shr_u(c.getLocal(`m`),c.i32_const(1))),c.setLocal(`j`,c.i32_const(0)),c.block(c.loop(c.br_if(1,c.i32_ge_u(c.getLocal(`j`),c.getLocal(`mdiv2`))),c.setLocal(`idx1`,c.i32_add(c.getLocal(`px`),c.i32_mul(c.i32_add(c.getLocal(`k`),c.getLocal(`j`)),c.i32_const(o)))),c.setLocal(`idx2`,c.i32_add(c.getLocal(`idx1`),c.i32_mul(c.getLocal(`mdiv2`),c.i32_const(o)))),c.call(i,c.getLocal(`idx2`),l,u),c.call(n+`_copy`,c.getLocal(`idx1`),d),c.call(n+`_add`,d,u,c.getLocal(`idx1`)),c.call(n+`_sub`,d,u,c.getLocal(`idx2`)),c.call(r+`_mul`,l,c.getLocal(`pwm`),l),c.setLocal(`j`,c.i32_add(c.getLocal(`j`),c.i32_const(1))),c.br(0))),c.setLocal(`k`,c.i32_add(c.getLocal(`k`),c.getLocal(`m`))),c.br(0))),c.setLocal(`s`,c.i32_add(c.getLocal(`s`),c.i32_const(1))),c.br(0))),c.call(t+`__fftFinal`,c.getLocal(`px`),c.getLocal(`bits`),c.getLocal(`reverse`),c.getLocal(`mulFactor`)))}function j(){let a=e.addFunction(t+`__fftFinal`);a.addParam(`px`,`i32`),a.addParam(`bits`,`i32`),a.addParam(`reverse`,`i32`),a.addParam(`mulFactor`,`i32`),a.addLocal(`n`,`i32`),a.addLocal(`ndiv2`,`i32`),a.addLocal(`pInv2`,`i32`),a.addLocal(`i`,`i32`),a.addLocal(`mask`,`i32`),a.addLocal(`idx1`,`i32`),a.addLocal(`idx2`,`i32`);let s=a.getCodeBuilder(),c=s.i32_const(e.alloc(o));a.addCode(s.if(s.i32_and(s.i32_eqz(s.getLocal(`reverse`)),s.call(r+`_isOne`,s.getLocal(`mulFactor`))),s.ret([])),s.setLocal(`n`,s.i32_shl(s.i32_const(1),s.getLocal(`bits`))),s.setLocal(`mask`,s.i32_sub(s.getLocal(`n`),s.i32_const(1))),s.setLocal(`i`,s.i32_const(1)),s.setLocal(`ndiv2`,s.i32_shr_u(s.getLocal(`n`),s.i32_const(1))),s.block(s.loop(s.br_if(1,s.i32_ge_u(s.getLocal(`i`),s.getLocal(`ndiv2`))),s.setLocal(`idx1`,s.i32_add(s.getLocal(`px`),s.i32_mul(s.getLocal(`i`),s.i32_const(o)))),s.setLocal(`idx2`,s.i32_add(s.getLocal(`px`),s.i32_mul(s.i32_sub(s.getLocal(`n`),s.getLocal(`i`)),s.i32_const(o)))),s.if(s.getLocal(`reverse`),s.if(s.call(r+`_isOne`,s.getLocal(`mulFactor`)),[...s.call(n+`_copy`,s.getLocal(`idx1`),c),...s.call(n+`_copy`,s.getLocal(`idx2`),s.getLocal(`idx1`)),...s.call(n+`_copy`,c,s.getLocal(`idx2`))],[...s.call(n+`_copy`,s.getLocal(`idx1`),c),...s.call(i,s.getLocal(`idx2`),s.getLocal(`mulFactor`),s.getLocal(`idx1`)),...s.call(i,c,s.getLocal(`mulFactor`),s.getLocal(`idx2`))]),s.if(s.call(r+`_isOne`,s.getLocal(`mulFactor`)),[],[...s.call(i,s.getLocal(`idx1`),s.getLocal(`mulFactor`),s.getLocal(`idx1`)),...s.call(i,s.getLocal(`idx2`),s.getLocal(`mulFactor`),s.getLocal(`idx2`))])),s.setLocal(`i`,s.i32_add(s.getLocal(`i`),s.i32_const(1))),s.br(0))),s.if(s.call(r+`_isOne`,s.getLocal(`mulFactor`)),[],[...s.call(i,s.getLocal(`px`),s.getLocal(`mulFactor`),s.getLocal(`px`)),...s.setLocal(`idx2`,s.i32_add(s.getLocal(`px`),s.i32_mul(s.getLocal(`ndiv2`),s.i32_const(o)))),...s.call(i,s.getLocal(`idx2`),s.getLocal(`mulFactor`),s.getLocal(`idx2`))]))}function M(){let r=e.addFunction(t+`__reversePermutation`);r.addParam(`px`,`i32`),r.addParam(`bits`,`i32`),r.addLocal(`n`,`i32`),r.addLocal(`i`,`i32`),r.addLocal(`ri`,`i32`),r.addLocal(`idx1`,`i32`),r.addLocal(`idx2`,`i32`);let i=r.getCodeBuilder(),a=i.i32_const(e.alloc(o));r.addCode(i.setLocal(`n`,i.i32_shl(i.i32_const(1),i.getLocal(`bits`))),i.setLocal(`i`,i.i32_const(0)),i.block(i.loop(i.br_if(1,i.i32_eq(i.getLocal(`i`),i.getLocal(`n`))),i.setLocal(`idx1`,i.i32_add(i.getLocal(`px`),i.i32_mul(i.getLocal(`i`),i.i32_const(o)))),i.setLocal(`ri`,i.call(t+`__rev`,i.getLocal(`i`),i.getLocal(`bits`))),i.setLocal(`idx2`,i.i32_add(i.getLocal(`px`),i.i32_mul(i.getLocal(`ri`),i.i32_const(o)))),i.if(i.i32_lt_u(i.getLocal(`i`),i.getLocal(`ri`)),[...i.call(n+`_copy`,i.getLocal(`idx1`),a),...i.call(n+`_copy`,i.getLocal(`idx2`),i.getLocal(`idx1`)),...i.call(n+`_copy`,a,i.getLocal(`idx2`))]),i.setLocal(`i`,i.i32_add(i.getLocal(`i`),i.i32_const(1))),i.br(0))))}function N(){let n=e.addFunction(t+`__rev`);n.addParam(`x`,`i32`),n.addParam(`bits`,`i32`),n.setReturnType(`i32`);let r=n.getCodeBuilder();n.addCode(r.i32_rotl(r.i32_add(r.i32_add(r.i32_shl(r.i32_load8_u(r.i32_and(r.getLocal(`x`),r.i32_const(255)),E,0),r.i32_const(24)),r.i32_shl(r.i32_load8_u(r.i32_and(r.i32_shr_u(r.getLocal(`x`),r.i32_const(8)),r.i32_const(255)),E,0),r.i32_const(16))),r.i32_add(r.i32_shl(r.i32_load8_u(r.i32_and(r.i32_shr_u(r.getLocal(`x`),r.i32_const(16)),r.i32_const(255)),E,0),r.i32_const(8)),r.i32_load8_u(r.i32_and(r.i32_shr_u(r.getLocal(`x`),r.i32_const(24)),r.i32_const(255)),E,0))),r.getLocal(`bits`)))}function P(){let s=e.addFunction(t+`_fftJoin`);s.addParam(`pBuff1`,`i32`),s.addParam(`pBuff2`,`i32`),s.addParam(`n`,`i32`),s.addParam(`first`,`i32`),s.addParam(`inc`,`i32`),s.addLocal(`idx1`,`i32`),s.addLocal(`idx2`,`i32`),s.addLocal(`i`,`i32`);let c=s.getCodeBuilder(),l=c.i32_const(e.alloc(a)),u=c.i32_const(e.alloc(o)),d=c.i32_const(e.alloc(o));s.addCode(c.call(r+`_copy`,c.getLocal(`first`),l),c.setLocal(`i`,c.i32_const(0)),c.block(c.loop(c.br_if(1,c.i32_eq(c.getLocal(`i`),c.getLocal(`n`))),c.setLocal(`idx1`,c.i32_add(c.getLocal(`pBuff1`),c.i32_mul(c.getLocal(`i`),c.i32_const(o)))),c.setLocal(`idx2`,c.i32_add(c.getLocal(`pBuff2`),c.i32_mul(c.getLocal(`i`),c.i32_const(o)))),c.call(i,c.getLocal(`idx2`),l,u),c.call(n+`_copy`,c.getLocal(`idx1`),d),c.call(n+`_add`,d,u,c.getLocal(`idx1`)),c.call(n+`_sub`,d,u,c.getLocal(`idx2`)),c.call(r+`_mul`,l,c.getLocal(`inc`),l),c.setLocal(`i`,c.i32_add(c.getLocal(`i`),c.i32_const(1))),c.br(0))))}function F(){let s=e.addFunction(t+`_fftJoinExt`);s.addParam(`pBuff1`,`i32`),s.addParam(`pBuff2`,`i32`),s.addParam(`n`,`i32`),s.addParam(`first`,`i32`),s.addParam(`inc`,`i32`),s.addParam(`totalBits`,`i32`),s.addLocal(`idx1`,`i32`),s.addLocal(`idx2`,`i32`),s.addLocal(`i`,`i32`),s.addLocal(`pShiftToM`,`i32`);let c=s.getCodeBuilder(),l=c.i32_const(e.alloc(a)),u=c.i32_const(e.alloc(o));s.addCode(c.setLocal(`pShiftToM`,c.i32_add(c.i32_const(S),c.i32_mul(c.getLocal(`totalBits`),c.i32_const(a)))),c.call(r+`_copy`,c.getLocal(`first`),l),c.setLocal(`i`,c.i32_const(0)),c.block(c.loop(c.br_if(1,c.i32_eq(c.getLocal(`i`),c.getLocal(`n`))),c.setLocal(`idx1`,c.i32_add(c.getLocal(`pBuff1`),c.i32_mul(c.getLocal(`i`),c.i32_const(o)))),c.setLocal(`idx2`,c.i32_add(c.getLocal(`pBuff2`),c.i32_mul(c.getLocal(`i`),c.i32_const(o)))),c.call(n+`_add`,c.getLocal(`idx1`),c.getLocal(`idx2`),u),c.call(i,c.getLocal(`idx2`),c.getLocal(`pShiftToM`),c.getLocal(`idx2`)),c.call(n+`_add`,c.getLocal(`idx1`),c.getLocal(`idx2`),c.getLocal(`idx2`)),c.call(i,c.getLocal(`idx2`),l,c.getLocal(`idx2`)),c.call(n+`_copy`,u,c.getLocal(`idx1`)),c.call(r+`_mul`,l,c.getLocal(`inc`),l),c.setLocal(`i`,c.i32_add(c.getLocal(`i`),c.i32_const(1))),c.br(0))))}function I(){let s=e.addFunction(t+`_fftJoinExtInv`);s.addParam(`pBuff1`,`i32`),s.addParam(`pBuff2`,`i32`),s.addParam(`n`,`i32`),s.addParam(`first`,`i32`),s.addParam(`inc`,`i32`),s.addParam(`totalBits`,`i32`),s.addLocal(`idx1`,`i32`),s.addLocal(`idx2`,`i32`),s.addLocal(`i`,`i32`),s.addLocal(`pShiftToM`,`i32`),s.addLocal(`pSConst`,`i32`);let c=s.getCodeBuilder(),l=c.i32_const(e.alloc(a)),u=c.i32_const(e.alloc(o));s.addCode(c.setLocal(`pShiftToM`,c.i32_add(c.i32_const(S),c.i32_mul(c.getLocal(`totalBits`),c.i32_const(a)))),c.setLocal(`pSConst`,c.i32_add(c.i32_const(C),c.i32_mul(c.getLocal(`totalBits`),c.i32_const(a)))),c.call(r+`_copy`,c.getLocal(`first`),l),c.setLocal(`i`,c.i32_const(0)),c.block(c.loop(c.br_if(1,c.i32_eq(c.getLocal(`i`),c.getLocal(`n`))),c.setLocal(`idx1`,c.i32_add(c.getLocal(`pBuff1`),c.i32_mul(c.getLocal(`i`),c.i32_const(o)))),c.setLocal(`idx2`,c.i32_add(c.getLocal(`pBuff2`),c.i32_mul(c.getLocal(`i`),c.i32_const(o)))),c.call(i,c.getLocal(`idx2`),l,u),c.call(n+`_sub`,c.getLocal(`idx1`),u,c.getLocal(`idx2`)),c.call(i,c.getLocal(`idx2`),c.getLocal(`pSConst`),c.getLocal(`idx2`)),c.call(i,c.getLocal(`idx1`),c.getLocal(`pShiftToM`),c.getLocal(`idx1`)),c.call(n+`_sub`,u,c.getLocal(`idx1`),c.getLocal(`idx1`)),c.call(i,c.getLocal(`idx1`),c.getLocal(`pSConst`),c.getLocal(`idx1`)),c.call(r+`_mul`,l,c.getLocal(`inc`),l),c.setLocal(`i`,c.i32_add(c.getLocal(`i`),c.i32_const(1))),c.br(0))))}function L(){let s=e.addFunction(t+`_prepareLagrangeEvaluation`);s.addParam(`pBuff1`,`i32`),s.addParam(`pBuff2`,`i32`),s.addParam(`n`,`i32`),s.addParam(`first`,`i32`),s.addParam(`inc`,`i32`),s.addParam(`totalBits`,`i32`),s.addLocal(`idx1`,`i32`),s.addLocal(`idx2`,`i32`),s.addLocal(`i`,`i32`),s.addLocal(`pShiftToM`,`i32`),s.addLocal(`pSConst`,`i32`);let c=s.getCodeBuilder(),l=c.i32_const(e.alloc(a)),u=c.i32_const(e.alloc(o));s.addCode(c.setLocal(`pShiftToM`,c.i32_add(c.i32_const(S),c.i32_mul(c.getLocal(`totalBits`),c.i32_const(a)))),c.setLocal(`pSConst`,c.i32_add(c.i32_const(C),c.i32_mul(c.getLocal(`totalBits`),c.i32_const(a)))),c.call(r+`_copy`,c.getLocal(`first`),l),c.setLocal(`i`,c.i32_const(0)),c.block(c.loop(c.br_if(1,c.i32_eq(c.getLocal(`i`),c.getLocal(`n`))),c.setLocal(`idx1`,c.i32_add(c.getLocal(`pBuff1`),c.i32_mul(c.getLocal(`i`),c.i32_const(o)))),c.setLocal(`idx2`,c.i32_add(c.getLocal(`pBuff2`),c.i32_mul(c.getLocal(`i`),c.i32_const(o)))),c.call(i,c.getLocal(`idx1`),c.getLocal(`pShiftToM`),u),c.call(n+`_sub`,c.getLocal(`idx2`),u,u),c.call(n+`_sub`,c.getLocal(`idx1`),c.getLocal(`idx2`),c.getLocal(`idx2`)),c.call(i,u,c.getLocal(`pSConst`),c.getLocal(`idx1`)),c.call(i,c.getLocal(`idx2`),l,c.getLocal(`idx2`)),c.call(r+`_mul`,l,c.getLocal(`inc`),l),c.setLocal(`i`,c.i32_add(c.getLocal(`i`),c.i32_const(1))),c.br(0))))}function R(){let s=e.addFunction(t+`_fftMix`);s.addParam(`pBuff`,`i32`),s.addParam(`n`,`i32`),s.addParam(`exp`,`i32`),s.addLocal(`nGroups`,`i32`),s.addLocal(`nPerGroup`,`i32`),s.addLocal(`nPerGroupDiv2`,`i32`),s.addLocal(`pairOffset`,`i32`),s.addLocal(`idx1`,`i32`),s.addLocal(`idx2`,`i32`),s.addLocal(`i`,`i32`),s.addLocal(`j`,`i32`),s.addLocal(`pwm`,`i32`);let c=s.getCodeBuilder(),l=c.i32_const(e.alloc(a)),u=c.i32_const(e.alloc(o)),d=c.i32_const(e.alloc(o));s.addCode(c.setLocal(`nPerGroup`,c.i32_shl(c.i32_const(1),c.getLocal(`exp`))),c.setLocal(`nPerGroupDiv2`,c.i32_shr_u(c.getLocal(`nPerGroup`),c.i32_const(1))),c.setLocal(`nGroups`,c.i32_shr_u(c.getLocal(`n`),c.getLocal(`exp`))),c.setLocal(`pairOffset`,c.i32_mul(c.getLocal(`nPerGroupDiv2`),c.i32_const(o))),c.setLocal(`pwm`,c.i32_add(c.i32_const(h),c.i32_mul(c.getLocal(`exp`),c.i32_const(a)))),c.setLocal(`i`,c.i32_const(0)),c.block(c.loop(c.br_if(1,c.i32_eq(c.getLocal(`i`),c.getLocal(`nGroups`))),c.call(r+`_one`,l),c.setLocal(`j`,c.i32_const(0)),c.block(c.loop(c.br_if(1,c.i32_eq(c.getLocal(`j`),c.getLocal(`nPerGroupDiv2`))),c.setLocal(`idx1`,c.i32_add(c.getLocal(`pBuff`),c.i32_mul(c.i32_add(c.i32_mul(c.getLocal(`i`),c.getLocal(`nPerGroup`)),c.getLocal(`j`)),c.i32_const(o)))),c.setLocal(`idx2`,c.i32_add(c.getLocal(`idx1`),c.getLocal(`pairOffset`))),c.call(i,c.getLocal(`idx2`),l,u),c.call(n+`_copy`,c.getLocal(`idx1`),d),c.call(n+`_add`,d,u,c.getLocal(`idx1`)),c.call(n+`_sub`,d,u,c.getLocal(`idx2`)),c.call(r+`_mul`,l,c.getLocal(`pwm`),l),c.setLocal(`j`,c.i32_add(c.getLocal(`j`),c.i32_const(1))),c.br(0))),c.setLocal(`i`,c.i32_add(c.getLocal(`i`),c.i32_const(1))),c.br(0))))}function z(){let r=e.addFunction(t+`_fftFinal`);r.addParam(`pBuff`,`i32`),r.addParam(`n`,`i32`),r.addParam(`factor`,`i32`),r.addLocal(`idx1`,`i32`),r.addLocal(`idx2`,`i32`),r.addLocal(`i`,`i32`),r.addLocal(`ndiv2`,`i32`);let a=r.getCodeBuilder(),s=a.i32_const(e.alloc(o));r.addCode(a.setLocal(`ndiv2`,a.i32_shr_u(a.getLocal(`n`),a.i32_const(1))),a.if(a.i32_and(a.getLocal(`n`),a.i32_const(1)),a.call(i,a.i32_add(a.getLocal(`pBuff`),a.i32_mul(a.getLocal(`ndiv2`),a.i32_const(o))),a.getLocal(`factor`),a.i32_add(a.getLocal(`pBuff`),a.i32_mul(a.getLocal(`ndiv2`),a.i32_const(o))))),a.setLocal(`i`,a.i32_const(0)),a.block(a.loop(a.br_if(1,a.i32_ge_u(a.getLocal(`i`),a.getLocal(`ndiv2`))),a.setLocal(`idx1`,a.i32_add(a.getLocal(`pBuff`),a.i32_mul(a.getLocal(`i`),a.i32_const(o)))),a.setLocal(`idx2`,a.i32_add(a.getLocal(`pBuff`),a.i32_mul(a.i32_sub(a.i32_sub(a.getLocal(`n`),a.i32_const(1)),a.getLocal(`i`)),a.i32_const(o)))),a.call(i,a.getLocal(`idx2`),a.getLocal(`factor`),s),a.call(i,a.getLocal(`idx1`),a.getLocal(`factor`),a.getLocal(`idx2`)),a.call(n+`_copy`,s,a.getLocal(`idx1`)),a.setLocal(`i`,a.i32_add(a.getLocal(`i`),a.i32_const(1))),a.br(0))))}N(),M(),j(),A(),D(),O(),k(),P(),F(),I(),R(),z(),L(),e.exportFunction(t+`__reversePermutation`),e.exportFunction(t+`_fft`),e.exportFunction(t+`_ifft`),e.exportFunction(t+`_rawfft`),e.exportFunction(t+`_fftJoin`),e.exportFunction(t+`_fftJoinExt`),e.exportFunction(t+`_fftJoinExtInv`),e.exportFunction(t+`_fftMix`),e.exportFunction(t+`_fftFinal`),e.exportFunction(t+`_prepareLagrangeEvaluation`)}var hr=s((()=>{$n(),xn()}));function gr(e,t,n){let r=e.modules[n].n64*8;function i(){let i=e.addFunction(t+`_zero`);i.addParam(`px`,`i32`),i.addParam(`n`,`i32`),i.addLocal(`lastp`,`i32`),i.addLocal(`p`,`i32`);let a=i.getCodeBuilder();i.addCode(a.setLocal(`p`,a.getLocal(`px`)),a.setLocal(`lastp`,a.i32_add(a.getLocal(`px`),a.i32_mul(a.getLocal(`n`),a.i32_const(r)))),a.block(a.loop(a.br_if(1,a.i32_eq(a.getLocal(`p`),a.getLocal(`lastp`))),a.call(n+`_zero`,a.getLocal(`p`)),a.setLocal(`p`,a.i32_add(a.getLocal(`p`),a.i32_const(r))),a.br(0))))}function a(){let i=e.addFunction(t+`_constructLC`);i.addParam(`ppolynomials`,`i32`),i.addParam(`psignals`,`i32`),i.addParam(`nSignals`,`i32`),i.addParam(`pres`,`i32`),i.addLocal(`i`,`i32`),i.addLocal(`j`,`i32`),i.addLocal(`pp`,`i32`),i.addLocal(`ps`,`i32`),i.addLocal(`pd`,`i32`),i.addLocal(`ncoefs`,`i32`);let a=i.getCodeBuilder(),o=a.i32_const(e.alloc(r));i.addCode(a.setLocal(`i`,a.i32_const(0)),a.setLocal(`pp`,a.getLocal(`ppolynomials`)),a.setLocal(`ps`,a.getLocal(`psignals`)),a.block(a.loop(a.br_if(1,a.i32_eq(a.getLocal(`i`),a.getLocal(`nSignals`))),a.setLocal(`ncoefs`,a.i32_load(a.getLocal(`pp`))),a.setLocal(`pp`,a.i32_add(a.getLocal(`pp`),a.i32_const(4))),a.setLocal(`j`,a.i32_const(0)),a.block(a.loop(a.br_if(1,a.i32_eq(a.getLocal(`j`),a.getLocal(`ncoefs`))),a.setLocal(`pd`,a.i32_add(a.getLocal(`pres`),a.i32_mul(a.i32_load(a.getLocal(`pp`)),a.i32_const(r)))),a.setLocal(`pp`,a.i32_add(a.getLocal(`pp`),a.i32_const(4))),a.call(n+`_mul`,a.getLocal(`ps`),a.getLocal(`pp`),o),a.call(n+`_add`,o,a.getLocal(`pd`),a.getLocal(`pd`)),a.setLocal(`pp`,a.i32_add(a.getLocal(`pp`),a.i32_const(r))),a.setLocal(`j`,a.i32_add(a.getLocal(`j`),a.i32_const(1))),a.br(0))),a.setLocal(`ps`,a.i32_add(a.getLocal(`ps`),a.i32_const(r))),a.setLocal(`i`,a.i32_add(a.getLocal(`i`),a.i32_const(1))),a.br(0))))}return i(),a(),e.exportFunction(t+`_zero`),e.exportFunction(t+`_constructLC`),t}var _r=s((()=>{}));function vr(e,t,n){let r=e.modules[n].n64*8;function i(){let i=e.addFunction(t+`_buildABC`);i.addParam(`pCoefs`,`i32`),i.addParam(`nCoefs`,`i32`),i.addParam(`pWitness`,`i32`),i.addParam(`pA`,`i32`),i.addParam(`pB`,`i32`),i.addParam(`pC`,`i32`),i.addParam(`offsetOut`,`i32`),i.addParam(`nOut`,`i32`),i.addParam(`offsetWitness`,`i32`),i.addParam(`nWitness`,`i32`),i.addLocal(`it`,`i32`),i.addLocal(`ita`,`i32`),i.addLocal(`itb`,`i32`),i.addLocal(`last`,`i32`),i.addLocal(`m`,`i32`),i.addLocal(`c`,`i32`),i.addLocal(`s`,`i32`),i.addLocal(`pOut`,`i32`);let a=i.getCodeBuilder(),o=a.i32_const(e.alloc(r));i.addCode(a.setLocal(`ita`,a.getLocal(`pA`)),a.setLocal(`itb`,a.getLocal(`pB`)),a.setLocal(`last`,a.i32_add(a.getLocal(`pA`),a.i32_mul(a.getLocal(`nOut`),a.i32_const(r)))),a.block(a.loop(a.br_if(1,a.i32_eq(a.getLocal(`ita`),a.getLocal(`last`))),a.call(n+`_zero`,a.getLocal(`ita`)),a.call(n+`_zero`,a.getLocal(`itb`)),a.setLocal(`ita`,a.i32_add(a.getLocal(`ita`),a.i32_const(r))),a.setLocal(`itb`,a.i32_add(a.getLocal(`itb`),a.i32_const(r))),a.br(0))),a.setLocal(`it`,a.getLocal(`pCoefs`)),a.setLocal(`last`,a.i32_add(a.getLocal(`pCoefs`),a.i32_mul(a.getLocal(`nCoefs`),a.i32_const(r+12)))),a.block(a.loop(a.br_if(1,a.i32_eq(a.getLocal(`it`),a.getLocal(`last`))),a.setLocal(`s`,a.i32_load(a.getLocal(`it`),8)),a.if(a.i32_or(a.i32_lt_u(a.getLocal(`s`),a.getLocal(`offsetWitness`)),a.i32_ge_u(a.getLocal(`s`),a.i32_add(a.getLocal(`offsetWitness`),a.getLocal(`nWitness`)))),[...a.setLocal(`it`,a.i32_add(a.getLocal(`it`),a.i32_const(r+12))),...a.br(1)]),a.setLocal(`m`,a.i32_load(a.getLocal(`it`))),a.if(a.i32_eq(a.getLocal(`m`),a.i32_const(0)),a.setLocal(`pOut`,a.getLocal(`pA`)),a.if(a.i32_eq(a.getLocal(`m`),a.i32_const(1)),a.setLocal(`pOut`,a.getLocal(`pB`)),[...a.setLocal(`it`,a.i32_add(a.getLocal(`it`),a.i32_const(r+12))),...a.br(1)])),a.setLocal(`c`,a.i32_load(a.getLocal(`it`),4)),a.if(a.i32_or(a.i32_lt_u(a.getLocal(`c`),a.getLocal(`offsetOut`)),a.i32_ge_u(a.getLocal(`c`),a.i32_add(a.getLocal(`offsetOut`),a.getLocal(`nOut`)))),[...a.setLocal(`it`,a.i32_add(a.getLocal(`it`),a.i32_const(r+12))),...a.br(1)]),a.setLocal(`pOut`,a.i32_add(a.getLocal(`pOut`),a.i32_mul(a.i32_sub(a.getLocal(`c`),a.getLocal(`offsetOut`)),a.i32_const(r)))),a.call(n+`_mul`,a.i32_add(a.getLocal(`pWitness`),a.i32_mul(a.i32_sub(a.getLocal(`s`),a.getLocal(`offsetWitness`)),a.i32_const(r))),a.i32_add(a.getLocal(`it`),a.i32_const(12)),o),a.call(n+`_add`,a.getLocal(`pOut`),o,a.getLocal(`pOut`)),a.setLocal(`it`,a.i32_add(a.getLocal(`it`),a.i32_const(r+12))),a.br(0))),a.setLocal(`ita`,a.getLocal(`pA`)),a.setLocal(`itb`,a.getLocal(`pB`)),a.setLocal(`it`,a.getLocal(`pC`)),a.setLocal(`last`,a.i32_add(a.getLocal(`pA`),a.i32_mul(a.getLocal(`nOut`),a.i32_const(r)))),a.block(a.loop(a.br_if(1,a.i32_eq(a.getLocal(`ita`),a.getLocal(`last`))),a.call(n+`_mul`,a.getLocal(`ita`),a.getLocal(`itb`),a.getLocal(`it`)),a.setLocal(`ita`,a.i32_add(a.getLocal(`ita`),a.i32_const(r))),a.setLocal(`itb`,a.i32_add(a.getLocal(`itb`),a.i32_const(r))),a.setLocal(`it`,a.i32_add(a.getLocal(`it`),a.i32_const(r))),a.br(0))))}function a(){let i=e.addFunction(t+`_joinABC`);i.addParam(`pA`,`i32`),i.addParam(`pB`,`i32`),i.addParam(`pC`,`i32`),i.addParam(`n`,`i32`),i.addParam(`pP`,`i32`),i.addLocal(`ita`,`i32`),i.addLocal(`itb`,`i32`),i.addLocal(`itc`,`i32`),i.addLocal(`itp`,`i32`),i.addLocal(`last`,`i32`);let a=i.getCodeBuilder(),o=a.i32_const(e.alloc(r));i.addCode(a.setLocal(`ita`,a.getLocal(`pA`)),a.setLocal(`itb`,a.getLocal(`pB`)),a.setLocal(`itc`,a.getLocal(`pC`)),a.setLocal(`itp`,a.getLocal(`pP`)),a.setLocal(`last`,a.i32_add(a.getLocal(`pA`),a.i32_mul(a.getLocal(`n`),a.i32_const(r)))),a.block(a.loop(a.br_if(1,a.i32_eq(a.getLocal(`ita`),a.getLocal(`last`))),a.call(n+`_mul`,a.getLocal(`ita`),a.getLocal(`itb`),o),a.call(n+`_sub`,o,a.getLocal(`itc`),a.getLocal(`itp`)),a.setLocal(`ita`,a.i32_add(a.getLocal(`ita`),a.i32_const(r))),a.setLocal(`itb`,a.i32_add(a.getLocal(`itb`),a.i32_const(r))),a.setLocal(`itc`,a.i32_add(a.getLocal(`itc`),a.i32_const(r))),a.setLocal(`itp`,a.i32_add(a.getLocal(`itp`),a.i32_const(r))),a.br(0))))}function o(){let i=e.addFunction(t+`_batchAdd`);i.addParam(`pa`,`i32`),i.addParam(`pb`,`i32`),i.addParam(`n`,`i32`),i.addParam(`pr`,`i32`),i.addLocal(`ita`,`i32`),i.addLocal(`itb`,`i32`),i.addLocal(`itr`,`i32`),i.addLocal(`last`,`i32`);let a=i.getCodeBuilder();i.addCode(a.setLocal(`ita`,a.getLocal(`pa`)),a.setLocal(`itb`,a.getLocal(`pb`)),a.setLocal(`itr`,a.getLocal(`pr`)),a.setLocal(`last`,a.i32_add(a.getLocal(`pa`),a.i32_mul(a.getLocal(`n`),a.i32_const(r)))),a.block(a.loop(a.br_if(1,a.i32_eq(a.getLocal(`ita`),a.getLocal(`last`))),a.call(n+`_add`,a.getLocal(`ita`),a.getLocal(`itb`),a.getLocal(`itr`)),a.setLocal(`ita`,a.i32_add(a.getLocal(`ita`),a.i32_const(r))),a.setLocal(`itb`,a.i32_add(a.getLocal(`itb`),a.i32_const(r))),a.setLocal(`itr`,a.i32_add(a.getLocal(`itr`),a.i32_const(r))),a.br(0))))}return i(),a(),o(),e.exportFunction(t+`_buildABC`),e.exportFunction(t+`_joinABC`),e.exportFunction(t+`_batchAdd`),t}var yr=s((()=>{}));function $(e,t,n,r,i,a,o,s){let c=e.addFunction(t);c.addParam(`pIn`,`i32`),c.addParam(`n`,`i32`),c.addParam(`pFirst`,`i32`),c.addParam(`pInc`,`i32`),c.addParam(`pOut`,`i32`),c.addLocal(`pOldFree`,`i32`),c.addLocal(`i`,`i32`),c.addLocal(`pFrom`,`i32`),c.addLocal(`pTo`,`i32`);let l=c.getCodeBuilder(),u=l.i32_const(e.alloc(o));c.addCode(l.setLocal(`pFrom`,l.getLocal(`pIn`)),l.setLocal(`pTo`,l.getLocal(`pOut`))),c.addCode(l.call(r+`_copy`,l.getLocal(`pFirst`),u)),c.addCode(l.setLocal(`i`,l.i32_const(0)),l.block(l.loop(l.br_if(1,l.i32_eq(l.getLocal(`i`),l.getLocal(`n`))),l.call(s,l.getLocal(`pFrom`),u,l.getLocal(`pTo`)),l.setLocal(`pFrom`,l.i32_add(l.getLocal(`pFrom`),l.i32_const(i))),l.setLocal(`pTo`,l.i32_add(l.getLocal(`pTo`),l.i32_const(a))),l.call(r+`_mul`,u,l.getLocal(`pInc`),u),l.setLocal(`i`,l.i32_add(l.getLocal(`i`),l.i32_const(1))),l.br(0)))),e.exportFunction(t)}var br=s((()=>{}));function xr(e,t){let n=t||`bn128`;if(e.modules[n])return n;let r=21888242871839275222246405745257275088696311157297823662689037894645226208583n,i=21888242871839275222246405745257275088548364400416034343698204186575808495617n,a=Math.floor((Vn(r-1n)-1)/64)+1,o=a*8,s=o,c=o,l=c*2,u=c*12,d=e.alloc(Q(i,s)),f=er(e,r,`f1m`);nr(e,i,`fr`,`frm`);let p=e.alloc(Q(y(3n),c)),m=fr(e,`g1m`,`f1m`,p);mr(e,`frm`,`frm`,`frm`,`frm_mul`),gr(e,`pol`,`frm`),vr(e,`qap`,`frm`);let h=ir(e,`f1m_neg`,`f2m`,`f1m`),g=e.alloc([...Q(y(19485874751759354771024239261021720505790618469301721065564631296452457478373n),c),...Q(y(266929791119991161246907387137283842545076965332900288569378510910307636690n),c)]),_=fr(e,`g2m`,`f2m`,g);function v(t,n){let r=e.addFunction(t);r.addParam(`pG`,`i32`),r.addParam(`pFr`,`i32`),r.addParam(`pr`,`i32`);let i=r.getCodeBuilder(),a=i.i32_const(e.alloc(o));r.addCode(i.call(`frm_fromMontgomery`,i.getLocal(`pFr`),a),i.call(n,i.getLocal(`pG`),a,i.i32_const(o),i.getLocal(`pr`))),e.exportFunction(t)}v(`g1m_timesFr`,`g1m_timesScalar`),mr(e,`g1m`,`g1m`,`frm`,`g1m_timesFr`),v(`g2m_timesFr`,`g2m_timesScalar`),mr(e,`g2m`,`g2m`,`frm`,`g2m_timesFr`),v(`g1m_timesFrAffine`,`g1m_timesScalarAffine`),v(`g2m_timesFrAffine`,`g2m_timesScalarAffine`),$(e,`frm_batchApplyKey`,`fmr`,`frm`,o,o,o,`frm_mul`),$(e,`g1m_batchApplyKey`,`g1m`,`frm`,o*3,o*3,o,`g1m_timesFr`),$(e,`g1m_batchApplyKeyMixed`,`g1m`,`frm`,o*2,o*3,o,`g1m_timesFrAffine`),$(e,`g2m_batchApplyKey`,`g2m`,`frm`,o*2*3,o*3*2,o,`g2m_timesFr`),$(e,`g2m_batchApplyKeyMixed`,`g2m`,`frm`,o*2*2,o*3*2,o,`g2m_timesFrAffine`);function y(e){return BigInt(e)*(1n<e+(t==0?0:1),0)+ee+1,B=6*o,V=3*o*2+te*z;e.modules[n]={n64:a,pG1gen:x,pG1zero:C,pG1b:p,pG2gen:T,pG2zero:D,pG2b:g,pq:e.modules.f1m.pq,pr:d,pOneT:O,prePSize:B,preQSize:V,r:`21888242871839275222246405745257275088548364400416034343698204186575808495617`,q:`21888242871839275222246405745257275088696311157297823662689037894645226208583`};function ne(e){let t=e,n=[];for(;t>0n;){if(Ln(t)){let e=2-Number(t%4n);n.push(e),t-=BigInt(e)}else n.push(0);t>>=1n}return n}function re(e){let t=e,n=[];for(;t>0n;)Ln(t)?n.push(1):n.push(0),t>>=1n;return n}function ie(){let t=e.addFunction(n+`_prepareG1`);t.addParam(`pP`,`i32`),t.addParam(`ppreP`,`i32`);let r=t.getCodeBuilder();t.addCode(r.call(m+`_normalize`,r.getLocal(`pP`),r.getLocal(`ppreP`)))}function ae(){let t=e.addFunction(n+`_prepAddStep`);t.addParam(`pQ`,`i32`),t.addParam(`pR`,`i32`),t.addParam(`pCoef`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`pQ`),a=r.i32_add(r.getLocal(`pQ`),r.i32_const(l)),o=r.getLocal(`pR`),s=r.i32_add(r.getLocal(`pR`),r.i32_const(l)),c=r.i32_add(r.getLocal(`pR`),r.i32_const(2*l)),u=r.getLocal(`pCoef`),d=r.i32_add(r.getLocal(`pCoef`),r.i32_const(l)),f=r.i32_add(r.getLocal(`pCoef`),r.i32_const(2*l)),p=d,m=r.i32_const(e.alloc(l)),g=r.i32_const(e.alloc(l)),_=r.i32_const(e.alloc(l)),v=r.i32_const(e.alloc(l)),y=r.i32_const(e.alloc(l)),b=r.i32_const(e.alloc(l)),x=r.i32_const(e.alloc(l));t.addCode(r.call(h+`_mul`,i,c,p),r.call(h+`_sub`,o,p,p),r.call(h+`_mul`,a,c,m),r.call(h+`_sub`,s,m,m),r.call(h+`_square`,p,g),r.call(h+`_square`,m,_),r.call(h+`_mul`,p,g,v),r.call(h+`_mul`,o,g,y),r.call(h+`_add`,y,y,x),r.call(h+`_mul`,c,_,b),r.call(h+`_add`,v,b,b),r.call(h+`_sub`,b,x,b),r.call(h+`_mul`,p,b,o),r.call(h+`_mul`,v,s,s),r.call(h+`_sub`,y,b,x),r.call(h+`_mul`,m,x,x),r.call(h+`_sub`,x,s,s),r.call(h+`_mul`,c,v,c),r.call(h+`_mul`,p,a,x),r.call(h+`_mul`,m,i,u),r.call(h+`_sub`,u,x,u),r.call(h+`_mul`,u,r.i32_const(j),u),r.call(h+`_neg`,m,f))}function oe(){let t=e.addFunction(n+`_prepDblStep`);t.addParam(`pR`,`i32`),t.addParam(`pCoef`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`pR`),a=r.i32_add(r.getLocal(`pR`),r.i32_const(l)),o=r.i32_add(r.getLocal(`pR`),r.i32_const(2*l)),s=r.getLocal(`pCoef`),c=r.i32_add(r.getLocal(`pCoef`),r.i32_const(l)),u=r.i32_add(r.getLocal(`pCoef`),r.i32_const(2*l)),d=r.i32_const(e.alloc(l)),f=r.i32_const(e.alloc(l)),p=r.i32_const(e.alloc(l)),m=r.i32_const(e.alloc(l)),g=r.i32_const(e.alloc(l)),_=r.i32_const(e.alloc(l)),v=r.i32_const(e.alloc(l)),y=r.i32_const(e.alloc(l)),b=r.i32_const(e.alloc(l)),x=r.i32_const(e.alloc(l)),S=r.i32_const(e.alloc(l)),C=r.i32_const(e.alloc(l));t.addCode(r.call(h+`_mul`,a,r.i32_const(A),d),r.call(h+`_mul`,i,d,d),r.call(h+`_square`,a,f),r.call(h+`_square`,o,p),r.call(h+`_add`,p,p,m),r.call(h+`_add`,m,p,m),r.call(h+`_mul`,r.i32_const(M),m,g),r.call(h+`_add`,g,g,_),r.call(h+`_add`,g,_,_),r.call(h+`_add`,f,_,v),r.call(h+`_mul`,v,r.i32_const(A),v),r.call(h+`_add`,f,p,C),r.call(h+`_add`,a,o,y),r.call(h+`_square`,y,y),r.call(h+`_sub`,y,C,y),r.call(h+`_sub`,g,f,b),r.call(h+`_square`,i,x),r.call(h+`_square`,g,S),r.call(h+`_sub`,f,_,C),r.call(h+`_mul`,d,C,i),r.call(h+`_add`,S,S,C),r.call(h+`_add`,S,C,C),r.call(h+`_square`,v,a),r.call(h+`_sub`,a,C,a),r.call(h+`_mul`,f,y,o),r.call(h+`_mul`,r.i32_const(j),b,s),r.call(h+`_neg`,y,c),r.call(h+`_add`,x,x,u),r.call(h+`_add`,x,u,u))}function se(){let t=e.addFunction(n+`_mulByQ`);t.addParam(`p1`,`i32`),t.addParam(`pr`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`p1`),a=r.i32_add(r.getLocal(`p1`),r.i32_const(l)),o=r.i32_add(r.getLocal(`p1`),r.i32_const(l*2)),s=r.getLocal(`pr`),u=r.i32_add(r.getLocal(`pr`),r.i32_const(l)),d=r.i32_add(r.getLocal(`pr`),r.i32_const(l*2)),f=r.i32_const(e.alloc([...Q(y(`21575463638280843010398324269430826099269044274347216827212613867836435027261`),c),...Q(y(`10307601595873709700152284273816112264069230130616436755625194854815875713954`),c)])),p=r.i32_const(e.alloc([...Q(y(`2821565182194536844548159561693502659359617185244120367078079554186484126554`),c),...Q(y(`3505843767911556378687030309984248845540243509899259641013678093033130930403`),c)]));t.addCode(r.call(h+`_conjugate`,i,s),r.call(h+`_mul`,f,s,s),r.call(h+`_conjugate`,a,u),r.call(h+`_mul`,p,u,u),r.call(h+`_conjugate`,o,d))}function ce(){se();let t=e.addFunction(n+`_prepareG2`);t.addParam(`pQ`,`i32`),t.addParam(`ppreQ`,`i32`),t.addLocal(`pCoef`,`i32`),t.addLocal(`i`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`pQ`),a=e.alloc(l*3),o=r.i32_const(a),s=r.i32_const(a),c=r.i32_const(a+l),u=r.i32_const(a+2*l),d=r.i32_add(r.getLocal(`ppreQ`),r.i32_const(0)),f=r.i32_add(r.getLocal(`ppreQ`),r.i32_const(l)),p=e.alloc(l*3),m=r.i32_const(p),g=e.alloc(l*3),v=r.i32_const(g),y=r.i32_const(g+l);t.addCode(r.call(_+`_normalize`,i,d),r.call(h+`_copy`,d,s),r.call(h+`_copy`,f,c),r.call(h+`_one`,u)),t.addCode(r.setLocal(`pCoef`,r.i32_add(r.getLocal(`ppreQ`),r.i32_const(l*3))),r.setLocal(`i`,r.i32_const(L.length-2)),r.block(r.loop(r.call(n+`_prepDblStep`,o,r.getLocal(`pCoef`)),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(z))),r.if(r.i32_load8_s(r.getLocal(`i`),R),[...r.call(n+`_prepAddStep`,d,o,r.getLocal(`pCoef`)),...r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(z)))]),r.br_if(1,r.i32_eqz(r.getLocal(`i`))),r.setLocal(`i`,r.i32_sub(r.getLocal(`i`),r.i32_const(1))),r.br(0)))),t.addCode(r.call(n+`_mulByQ`,d,m),r.call(n+`_mulByQ`,m,v)),t.addCode(r.call(h+`_neg`,y,y),r.call(n+`_prepAddStep`,m,o,r.getLocal(`pCoef`)),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(z))),r.call(n+`_prepAddStep`,v,o,r.getLocal(`pCoef`)),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(z))))}function le(){let t=e.addFunction(n+`__mulBy024Old`);t.addParam(`pEll0`,`i32`),t.addParam(`pEllVW`,`i32`),t.addParam(`pEllVV`,`i32`),t.addParam(`pR`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`pEll0`),a=r.getLocal(`pEllVV`),o=r.getLocal(`pEllVW`),s=r.getLocal(`pR`),c=e.alloc(u),d=r.i32_const(c),f=r.i32_const(c),p=r.i32_const(c+l),m=r.i32_const(c+l*2),g=r.i32_const(c+l*3),_=r.i32_const(c+l*4),v=r.i32_const(c+l*5);t.addCode(r.call(h+`_copy`,i,f),r.call(h+`_zero`,p),r.call(h+`_copy`,a,m),r.call(h+`_zero`,g),r.call(h+`_copy`,o,_),r.call(h+`_zero`,v),r.call(I+`_mul`,d,s,s))}function H(){let t=e.addFunction(n+`__mulBy024`);t.addParam(`pEll0`,`i32`),t.addParam(`pEllVW`,`i32`),t.addParam(`pEllVV`,`i32`),t.addParam(`pR`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`pEll0`),a=r.getLocal(`pEllVV`),s=r.getLocal(`pEllVW`),c=r.getLocal(`pR`),u=r.i32_add(r.getLocal(`pR`),r.i32_const(2*o)),d=r.i32_add(r.getLocal(`pR`),r.i32_const(4*o)),f=r.i32_add(r.getLocal(`pR`),r.i32_const(6*o)),p=r.i32_add(r.getLocal(`pR`),r.i32_const(8*o)),m=r.i32_add(r.getLocal(`pR`),r.i32_const(10*o)),g=r.i32_const(e.alloc(l)),_=r.i32_const(e.alloc(l)),v=r.i32_const(e.alloc(l)),y=r.i32_const(e.alloc(l)),b=r.i32_const(e.alloc(l)),x=r.i32_const(e.alloc(l)),S=r.i32_const(e.alloc(l)),C=r.i32_const(e.alloc(l)),w=r.i32_const(e.alloc(l)),T=r.i32_const(e.alloc(l)),E=r.i32_const(e.alloc(l));t.addCode(r.call(h+`_mul`,c,i,S),r.call(h+`_mul`,d,a,C),r.call(h+`_mul`,p,s,w),r.call(h+`_add`,c,p,v),r.call(h+`_add`,c,d,_),r.call(h+`_add`,u,f,y),r.call(h+`_add`,y,m,y),r.call(h+`_mul`,u,a,T),r.call(h+`_add`,T,w,b),r.call(h+`_mul`,r.i32_const(k),b,x),r.call(h+`_add`,x,S,c),r.call(h+`_mul`,m,s,b),r.call(h+`_add`,T,b,T),r.call(h+`_add`,b,C,b),r.call(h+`_mul`,r.i32_const(k),b,x),r.call(h+`_mul`,u,i,b),r.call(h+`_add`,T,b,T),r.call(h+`_add`,x,b,u),r.call(h+`_add`,i,a,g),r.call(h+`_mul`,_,g,b),r.call(h+`_add`,S,C,E),r.call(h+`_sub`,b,E,b),r.call(h+`_mul`,f,s,x),r.call(h+`_add`,T,x,T),r.call(h+`_add`,d,p,g),r.call(h+`_add`,b,x,d),r.call(h+`_add`,a,s,_),r.call(h+`_mul`,_,g,b),r.call(h+`_add`,C,w,E),r.call(h+`_sub`,b,E,b),r.call(h+`_mul`,r.i32_const(k),b,x),r.call(h+`_mul`,f,i,b),r.call(h+`_add`,T,b,T),r.call(h+`_add`,x,b,f),r.call(h+`_mul`,m,a,b),r.call(h+`_add`,T,b,T),r.call(h+`_mul`,r.i32_const(k),b,x),r.call(h+`_add`,i,s,g),r.call(h+`_mul`,v,g,b),r.call(h+`_add`,S,w,E),r.call(h+`_sub`,b,E,b),r.call(h+`_add`,x,b,p),r.call(h+`_add`,i,a,g),r.call(h+`_add`,g,s,g),r.call(h+`_mul`,y,g,b),r.call(h+`_sub`,b,T,m))}function ue(){let t=e.addFunction(n+`_millerLoop`);t.addParam(`ppreP`,`i32`),t.addParam(`ppreQ`,`i32`),t.addParam(`r`,`i32`),t.addLocal(`pCoef`,`i32`),t.addLocal(`i`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`ppreP`),a=r.i32_add(r.getLocal(`ppreP`),r.i32_const(c)),o=r.getLocal(`pCoef`),s=r.i32_add(r.getLocal(`pCoef`),r.i32_const(l)),u=r.i32_add(r.getLocal(`pCoef`),r.i32_const(2*l)),d=e.alloc(l),f=r.i32_const(d),p=e.alloc(l),m=r.i32_const(p),g=r.getLocal(`r`);t.addCode(r.call(I+`_one`,g),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`ppreQ`),r.i32_const(l*3))),r.setLocal(`i`,r.i32_const(L.length-2)),r.block(r.loop(r.call(I+`_square`,g,g),r.call(h+`_mul1`,s,a,f),r.call(h+`_mul1`,u,i,m),r.call(n+`__mulBy024`,o,f,m,g),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(z))),r.if(r.i32_load8_s(r.getLocal(`i`),R),[...r.call(h+`_mul1`,s,a,f),...r.call(h+`_mul1`,u,i,m),...r.call(n+`__mulBy024`,o,f,m,g),...r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(z)))]),r.br_if(1,r.i32_eqz(r.getLocal(`i`))),r.setLocal(`i`,r.i32_sub(r.getLocal(`i`),r.i32_const(1))),r.br(0)))),t.addCode(r.call(h+`_mul1`,s,a,f),r.call(h+`_mul1`,u,i,m),r.call(n+`__mulBy024`,o,f,m,g),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(z))),r.call(h+`_mul1`,s,a,f),r.call(h+`_mul1`,u,i,m),r.call(n+`__mulBy024`,o,f,m,g),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(z))))}function de(t){let i=[[[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n]],[[1n,0n],[8376118865763821496583973867626364092589906065868298776909617916018768340080n,16469823323077808223889137241176536799009286646108169935659301613961712198316n],[21888242871839275220042445260109153167277707414472061641714758635765020556617n,0n],[11697423496358154304825782922584725312912383441159505038794027105778954184319n,303847389135065887422783454877609941456349188919719272345083954437860409601n],[21888242871839275220042445260109153167277707414472061641714758635765020556616n,0n],[3321304630594332808241809054958361220322477375291206261884409189760185844239n,5722266937896532885780051958958348231143373700109372999374820235121374419868n],[21888242871839275222246405745257275088696311157297823662689037894645226208582n,0n],[13512124006075453725662431877630910996106405091429524885779419978626457868503n,5418419548761466998357268504080738289687024511189653727029736280683514010267n],[2203960485148121921418603742825762020974279258880205651966n,0n],[10190819375481120917420622822672549775783927716138318623895010788866272024264n,21584395482704209334823622290379665147239961968378104390343953940207365798982n],[2203960485148121921418603742825762020974279258880205651967n,0n],[18566938241244942414004596690298913868373833782006617400804628704885040364344n,16165975933942742336466353786298926857552937457188450663314217659523851788715n]]],a=[[[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n]],[[1n,0n],[21575463638280843010398324269430826099269044274347216827212613867836435027261n,10307601595873709700152284273816112264069230130616436755625194854815875713954n],[21888242871839275220042445260109153167277707414472061641714758635765020556616n,0n],[3772000881919853776433695186713858239009073593817195771773381919316419345261n,2236595495967245188281701248203181795121068902605861227855261137820944008926n],[2203960485148121921418603742825762020974279258880205651966n,0n],[18429021223477853657660792034369865839114504446431234726392080002137598044644n,9344045779998320333812420223237981029506012124075525679208581902008406485703n]],[[1n,0n],[2581911344467009335267311115468803099551665605076196740867805258568234346338n,19937756971775647987995932169929341994314640652964949448313374472400716661030n],[2203960485148121921418603742825762020974279258880205651966n,0n],[5324479202449903542726783395506214481928257762400643279780343368557297135718n,16208900380737693084919495127334387981393726419856888799917914180988844123039n],[21888242871839275220042445260109153167277707414472061641714758635765020556616n,0n],[13981852324922362344252311234282257507216387789820983642040889267519694726527n,7629828391165209371577384193250820201684255241773809077146787135900891633097n]]],o=e.addFunction(n+`__frobeniusMap`+t);o.addParam(`x`,`i32`),o.addParam(`r`,`i32`);let s=o.getCodeBuilder();for(let n=0;n<6;n++){let r=n==0?s.getLocal(`x`):s.i32_add(s.getLocal(`x`),s.i32_const(n*l)),d=r,p=s.i32_add(s.getLocal(`x`),s.i32_const(n*l+c)),m=n==0?s.getLocal(`r`):s.i32_add(s.getLocal(`r`),s.i32_const(n*l)),g=m,_=s.i32_add(s.getLocal(`r`),s.i32_const(n*l+c)),v=u(i[Math.floor(n/3)][t%12],a[n%3][t%6]),b=e.alloc([...Q(y(v[0]),32),...Q(y(v[1]),32)]);t%2==1?o.addCode(s.call(f+`_copy`,d,g),s.call(f+`_neg`,p,_),s.call(h+`_mul`,m,s.i32_const(b),m)):o.addCode(s.call(h+`_mul`,r,s.i32_const(b),m))}function u(e,t){let n=BigInt(e[0]),i=BigInt(e[1]),a=BigInt(t[0]),o=BigInt(t[1]),s=[(n*a-i*o)%r,(n*o+i*a)%r];return zn(s[0])&&(s[0]+=r),s}}function fe(){let t=e.addFunction(n+`__finalExponentiationFirstChunk`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`x`),a=i,s=r.i32_add(i,r.i32_const(o*6)),c=r.getLocal(`r`),l=e.alloc(u),d=r.i32_const(l),f=d,p=r.i32_const(l+o*6),m=r.i32_const(e.alloc(u)),h=r.i32_const(e.alloc(u)),g=r.i32_const(e.alloc(u));t.addCode(r.call(P+`_copy`,a,f),r.call(P+`_neg`,s,p),r.call(I+`_inverse`,i,m),r.call(I+`_mul`,d,m,h),r.call(n+`__frobeniusMap2`,h,g),r.call(I+`_mul`,h,g,c))}function U(){let t=e.addFunction(n+`__cyclotomicSquare`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`x`),a=r.i32_add(r.getLocal(`x`),r.i32_const(l)),o=r.i32_add(r.getLocal(`x`),r.i32_const(2*l)),s=r.i32_add(r.getLocal(`x`),r.i32_const(3*l)),c=r.i32_add(r.getLocal(`x`),r.i32_const(4*l)),u=r.i32_add(r.getLocal(`x`),r.i32_const(5*l)),d=r.getLocal(`r`),f=r.i32_add(r.getLocal(`r`),r.i32_const(l)),p=r.i32_add(r.getLocal(`r`),r.i32_const(2*l)),m=r.i32_add(r.getLocal(`r`),r.i32_const(3*l)),g=r.i32_add(r.getLocal(`r`),r.i32_const(4*l)),_=r.i32_add(r.getLocal(`r`),r.i32_const(5*l)),v=r.i32_const(e.alloc(l)),y=r.i32_const(e.alloc(l)),b=r.i32_const(e.alloc(l)),x=r.i32_const(e.alloc(l)),S=r.i32_const(e.alloc(l)),C=r.i32_const(e.alloc(l)),w=r.i32_const(e.alloc(l)),T=r.i32_const(e.alloc(l));t.addCode(r.call(h+`_mul`,i,c,w),r.call(h+`_mul`,c,r.i32_const(k),v),r.call(h+`_add`,i,v,v),r.call(h+`_add`,i,c,T),r.call(h+`_mul`,T,v,v),r.call(h+`_mul`,r.i32_const(k),w,T),r.call(h+`_add`,w,T,T),r.call(h+`_sub`,v,T,v),r.call(h+`_add`,w,w,y),r.call(h+`_mul`,s,o,w),r.call(h+`_mul`,o,r.i32_const(k),b),r.call(h+`_add`,s,b,b),r.call(h+`_add`,s,o,T),r.call(h+`_mul`,T,b,b),r.call(h+`_mul`,r.i32_const(k),w,T),r.call(h+`_add`,w,T,T),r.call(h+`_sub`,b,T,b),r.call(h+`_add`,w,w,x),r.call(h+`_mul`,a,u,w),r.call(h+`_mul`,u,r.i32_const(k),S),r.call(h+`_add`,a,S,S),r.call(h+`_add`,a,u,T),r.call(h+`_mul`,T,S,S),r.call(h+`_mul`,r.i32_const(k),w,T),r.call(h+`_add`,w,T,T),r.call(h+`_sub`,S,T,S),r.call(h+`_add`,w,w,C),r.call(h+`_sub`,v,i,d),r.call(h+`_add`,d,d,d),r.call(h+`_add`,v,d,d),r.call(h+`_add`,y,c,g),r.call(h+`_add`,g,g,g),r.call(h+`_add`,y,g,g),r.call(h+`_mul`,C,r.i32_const(j),T),r.call(h+`_add`,T,s,m),r.call(h+`_add`,m,m,m),r.call(h+`_add`,T,m,m),r.call(h+`_sub`,S,o,p),r.call(h+`_add`,p,p,p),r.call(h+`_add`,S,p,p),r.call(h+`_sub`,b,a,f),r.call(h+`_add`,f,f,f),r.call(h+`_add`,b,f,f),r.call(h+`_add`,x,u,_),r.call(h+`_add`,_,_,_),r.call(h+`_add`,x,_,_))}function pe(t,r){let i=ne(t).map(e=>e==-1?255:e),a=e.alloc(i),o=e.addFunction(n+`__cyclotomicExp_`+r);o.addParam(`x`,`i32`),o.addParam(`r`,`i32`),o.addLocal(`bit`,`i32`),o.addLocal(`i`,`i32`);let s=o.getCodeBuilder(),c=s.getLocal(`x`),l=s.getLocal(`r`),d=s.i32_const(e.alloc(u));o.addCode(s.call(I+`_conjugate`,c,d),s.call(I+`_one`,l),s.if(s.teeLocal(`bit`,s.i32_load8_s(s.i32_const(i.length-1),a)),s.if(s.i32_eq(s.getLocal(`bit`),s.i32_const(1)),s.call(I+`_mul`,l,c,l),s.call(I+`_mul`,l,d,l))),s.setLocal(`i`,s.i32_const(i.length-2)),s.block(s.loop(s.call(n+`__cyclotomicSquare`,l,l),s.if(s.teeLocal(`bit`,s.i32_load8_s(s.getLocal(`i`),a)),s.if(s.i32_eq(s.getLocal(`bit`),s.i32_const(1)),s.call(I+`_mul`,l,c,l),s.call(I+`_mul`,l,d,l))),s.br_if(1,s.i32_eqz(s.getLocal(`i`))),s.setLocal(`i`,s.i32_sub(s.getLocal(`i`),s.i32_const(1))),s.br(0))))}function W(){U(),pe(4965661367192848881n,`w0`);let t=e.addFunction(n+`__finalExponentiationLastChunk`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`x`),a=r.getLocal(`r`),o=r.i32_const(e.alloc(u)),s=r.i32_const(e.alloc(u)),c=r.i32_const(e.alloc(u)),l=r.i32_const(e.alloc(u)),d=r.i32_const(e.alloc(u)),f=r.i32_const(e.alloc(u)),p=r.i32_const(e.alloc(u)),m=r.i32_const(e.alloc(u)),h=r.i32_const(e.alloc(u)),g=r.i32_const(e.alloc(u)),_=r.i32_const(e.alloc(u)),v=r.i32_const(e.alloc(u)),y=r.i32_const(e.alloc(u)),b=r.i32_const(e.alloc(u)),x=r.i32_const(e.alloc(u)),S=r.i32_const(e.alloc(u)),C=r.i32_const(e.alloc(u)),w=r.i32_const(e.alloc(u)),T=r.i32_const(e.alloc(u)),E=r.i32_const(e.alloc(u)),D=r.i32_const(e.alloc(u));t.addCode(r.call(n+`__cyclotomicExp_w0`,i,o),r.call(I+`_conjugate`,o,o),r.call(n+`__cyclotomicSquare`,o,s),r.call(n+`__cyclotomicSquare`,s,c),r.call(I+`_mul`,c,s,l),r.call(n+`__cyclotomicExp_w0`,l,d),r.call(I+`_conjugate`,d,d),r.call(n+`__cyclotomicSquare`,d,f),r.call(n+`__cyclotomicExp_w0`,f,p),r.call(I+`_conjugate`,p,p),r.call(I+`_conjugate`,l,m),r.call(I+`_conjugate`,p,h),r.call(I+`_mul`,h,d,g),r.call(I+`_mul`,g,m,_),r.call(I+`_mul`,_,s,v),r.call(I+`_mul`,_,d,y),r.call(I+`_mul`,y,i,b),r.call(n+`__frobeniusMap1`,v,x),r.call(I+`_mul`,x,b,S),r.call(n+`__frobeniusMap2`,_,C),r.call(I+`_mul`,C,S,w),r.call(I+`_conjugate`,i,T),r.call(I+`_mul`,T,v,E),r.call(n+`__frobeniusMap3`,E,D),r.call(I+`_mul`,D,w,a))}function me(){fe(),W();let t=e.addFunction(n+`_finalExponentiation`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`x`),a=r.getLocal(`r`),o=r.i32_const(e.alloc(u));t.addCode(r.call(n+`__finalExponentiationFirstChunk`,i,o),r.call(n+`__finalExponentiationLastChunk`,o,a))}function G(){let t=e.addFunction(n+`_finalExponentiationOld`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let r=e.alloc(Q(552484233613224096312617126783173147097382103762957654188882734314196910839907541213974502761540629817009608548654680343627701153829446747810907373256841551006201639677726139946029199968412598804882391702273019083653272047566316584365559776493027495458238373902875937659943504873220554161550525926302303331747463515644711876653177129578303191095900909191624817826566688241804408081892785725967931714097716709526092261278071952560171111444072049229123565057483750161460024353346284167282452756217662335528813519139808291170539072125381230815729071544861602750936964829313608137325426383735122175229541155376346436093930287402089517426973178917569713384748081827255472576937471496195752727188261435633271238710131736096299798168852925540549342330775279877006784354801422249722573783561685179618816480037695005515426162362431072245638324744480n,352)),i=t.getCodeBuilder();t.addCode(i.call(I+`_exp`,i.getLocal(`x`),i.i32_const(r),i.i32_const(352),i.getLocal(`r`)))}let K=e.alloc(B),q=e.alloc(V);function he(t){let r=e.addFunction(n+`_pairingEq`+t);for(let e=0;e{xn(),tr(),rr(),ar(),sr(),pr(),hr(),_r(),yr(),br(),$n()}));function Cr(e,t){let n=t||`bls12381`;if(e.modules[n])return n;let r=4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559787n,i=52435875175126190479447740508185965837690552500527637822603658699938581184513n,a=Math.floor((Vn(r-1n)-1)/64)+1,o=a*8,s=o,c=s*2,l=s*12,u=Math.floor((Vn(i-1n)-1)/64)+1,d=u*8,f=d,p=e.alloc(Q(i,f)),m=er(e,r,`f1m`,`intq`);nr(e,i,`fr`,`frm`,`intr`);let h=e.alloc(Q(x(4n),s)),g=fr(e,`g1m`,`f1m`,h);mr(e,`frm`,`frm`,`frm`,`frm_mul`),gr(e,`pol`,`frm`),vr(e,`qap`,`frm`);let _=ir(e,`f1m_neg`,`f2m`,`f1m`),v=e.alloc([...Q(x(4n),s),...Q(x(4n),s)]),y=fr(e,`g2m`,`f2m`,v);function b(t,n){let r=e.addFunction(t);r.addParam(`pG`,`i32`),r.addParam(`pFr`,`i32`),r.addParam(`pr`,`i32`);let i=r.getCodeBuilder(),a=i.i32_const(e.alloc(d));r.addCode(i.call(`frm_fromMontgomery`,i.getLocal(`pFr`),a),i.call(n,i.getLocal(`pG`),a,i.i32_const(d),i.getLocal(`pr`))),e.exportFunction(t)}b(`g1m_timesFr`,`g1m_timesScalar`),mr(e,`g1m`,`g1m`,`frm`,`g1m_timesFr`),b(`g2m_timesFr`,`g2m_timesScalar`),mr(e,`g2m`,`g2m`,`frm`,`g2m_timesFr`),b(`g1m_timesFrAffine`,`g1m_timesScalarAffine`),b(`g2m_timesFrAffine`,`g2m_timesScalarAffine`),$(e,`frm_batchApplyKey`,`fmr`,`frm`,d,d,d,`frm_mul`),$(e,`g1m_batchApplyKey`,`g1m`,`frm`,o*3,o*3,d,`g1m_timesFr`),$(e,`g1m_batchApplyKeyMixed`,`g1m`,`frm`,o*2,o*3,d,`g1m_timesFrAffine`),$(e,`g2m_batchApplyKey`,`g2m`,`frm`,o*2*3,o*3*2,d,`g2m_timesFr`),$(e,`g2m_batchApplyKeyMixed`,`g2m`,`frm`,o*2*2,o*3*2,d,`g2m_timesFrAffine`);function x(e){return BigInt(e)*(1n<e+(t==0?0:1),0)+z+1,te=6*o,B=3*o*2+ee*R,V=15132376222941642752n;e.modules[n]={n64q:a,n64r:u,n8q:o,n8r:d,pG1gen:C,pG1zero:T,pG1b:h,pG2gen:D,pG2zero:k,pG2b:v,pq:e.modules.f1m.pq,pr:p,pOneT:A,r:i,q:r,prePSize:te,preQSize:B};function ne(e){let t=e,n=[];for(;t>0n;){if(Ln(t)){let e=2-Number(t%4n);n.push(e),t-=BigInt(e)}else n.push(0);t>>=1n}return n}function re(e){let t=e,n=[];for(;t>0n;)Ln(t)?n.push(1):n.push(0),t>>=1n;return n}function ie(){let t=e.addFunction(n+`_prepareG1`);t.addParam(`pP`,`i32`),t.addParam(`ppreP`,`i32`);let r=t.getCodeBuilder();t.addCode(r.call(g+`_normalize`,r.getLocal(`pP`),r.getLocal(`ppreP`)))}function ae(){let t=e.addFunction(n+`_prepDblStep`);t.addParam(`R`,`i32`),t.addParam(`r`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`R`),a=r.i32_add(r.getLocal(`R`),r.i32_const(2*o)),s=r.i32_add(r.getLocal(`R`),r.i32_const(4*o)),l=r.getLocal(`r`),u=r.i32_add(r.getLocal(`r`),r.i32_const(2*o)),d=r.i32_add(r.getLocal(`r`),r.i32_const(4*o)),f=r.i32_const(e.alloc(c)),p=r.i32_const(e.alloc(c)),m=r.i32_const(e.alloc(c)),h=r.i32_const(e.alloc(c)),g=r.i32_const(e.alloc(c));t.addCode(r.call(_+`_square`,i,l),r.call(_+`_square`,a,p),r.call(_+`_square`,p,m),r.call(_+`_add`,p,i,u),r.call(_+`_square`,u,u),r.call(_+`_sub`,u,l,u),r.call(_+`_sub`,u,m,u),r.call(_+`_add`,u,u,u),r.call(_+`_add`,l,l,h),r.call(_+`_add`,h,l,h),r.call(_+`_add`,i,h,d),r.call(_+`_square`,h,g),r.call(_+`_square`,s,f),r.call(_+`_sub`,g,u,i),r.call(_+`_sub`,i,u,i),r.call(_+`_add`,s,a,s),r.call(_+`_square`,s,s),r.call(_+`_sub`,s,p,s),r.call(_+`_sub`,s,f,s),r.call(_+`_sub`,u,i,a),r.call(_+`_mul`,a,h,a),r.call(_+`_add`,m,m,m),r.call(_+`_add`,m,m,m),r.call(_+`_add`,m,m,m),r.call(_+`_sub`,a,m,a),r.call(_+`_mul`,h,f,u),r.call(_+`_add`,u,u,u),r.call(_+`_neg`,u,u),r.call(_+`_square`,d,d),r.call(_+`_sub`,d,l,d),r.call(_+`_sub`,d,g,d),r.call(_+`_add`,p,p,p),r.call(_+`_add`,p,p,p),r.call(_+`_sub`,d,p,d),r.call(_+`_mul`,s,f,l),r.call(_+`_add`,l,l,l))}function oe(){let t=e.addFunction(n+`_prepAddStep`);t.addParam(`R`,`i32`),t.addParam(`Q`,`i32`),t.addParam(`r`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`R`),a=r.i32_add(r.getLocal(`R`),r.i32_const(2*o)),s=r.i32_add(r.getLocal(`R`),r.i32_const(4*o)),l=r.getLocal(`Q`),u=r.i32_add(r.getLocal(`Q`),r.i32_const(2*o)),d=r.getLocal(`r`),f=r.i32_add(r.getLocal(`r`),r.i32_const(2*o)),p=r.i32_add(r.getLocal(`r`),r.i32_const(4*o)),m=r.i32_const(e.alloc(c)),h=r.i32_const(e.alloc(c)),g=r.i32_const(e.alloc(c)),v=r.i32_const(e.alloc(c)),y=r.i32_const(e.alloc(c)),b=r.i32_const(e.alloc(c)),x=r.i32_const(e.alloc(c)),S=r.i32_const(e.alloc(c)),C=r.i32_const(e.alloc(c)),w=r.i32_const(e.alloc(c)),T=r.i32_const(e.alloc(c));t.addCode(r.call(_+`_square`,s,m),r.call(_+`_square`,u,h),r.call(_+`_mul`,m,l,v),r.call(_+`_add`,u,s,f),r.call(_+`_square`,f,f),r.call(_+`_sub`,f,h,f),r.call(_+`_sub`,f,m,f),r.call(_+`_mul`,f,m,f),r.call(_+`_sub`,v,i,y),r.call(_+`_square`,y,b),r.call(_+`_add`,b,b,x),r.call(_+`_add`,x,x,x),r.call(_+`_mul`,x,y,S),r.call(_+`_sub`,f,a,C),r.call(_+`_sub`,C,a,C),r.call(_+`_mul`,C,l,p),r.call(_+`_mul`,x,i,w),r.call(_+`_square`,C,i),r.call(_+`_sub`,i,S,i),r.call(_+`_sub`,i,w,i),r.call(_+`_sub`,i,w,i),r.call(_+`_add`,s,y,s),r.call(_+`_square`,s,s),r.call(_+`_sub`,s,m,s),r.call(_+`_sub`,s,b,s),r.call(_+`_add`,u,s,d),r.call(_+`_sub`,w,i,T),r.call(_+`_mul`,T,C,T),r.call(_+`_mul`,a,S,v),r.call(_+`_add`,v,v,v),r.call(_+`_sub`,T,v,a),r.call(_+`_square`,d,d),r.call(_+`_sub`,d,h,d),r.call(_+`_square`,s,g),r.call(_+`_sub`,d,g,d),r.call(_+`_add`,p,p,p),r.call(_+`_sub`,p,d,p),r.call(_+`_add`,s,s,d),r.call(_+`_neg`,C,C),r.call(_+`_add`,C,C,f))}function se(){let t=e.addFunction(n+`_prepareG2`);t.addParam(`pQ`,`i32`),t.addParam(`ppreQ`,`i32`),t.addLocal(`pCoef`,`i32`),t.addLocal(`i`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`pQ`),a=e.alloc(c*3),o=r.i32_const(a),s=r.getLocal(`ppreQ`);t.addCode(r.call(y+`_normalize`,i,s),r.if(r.call(y+`_isZero`,s),r.ret([])),r.call(y+`_copy`,s,o),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`ppreQ`),r.i32_const(c*3)))),t.addCode(r.setLocal(`i`,r.i32_const(I.length-2)),r.block(r.loop(r.call(n+`_prepDblStep`,o,r.getLocal(`pCoef`)),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(R))),r.if(r.i32_load8_s(r.getLocal(`i`),L),[...r.call(n+`_prepAddStep`,o,s,r.getLocal(`pCoef`)),...r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(R)))]),r.br_if(1,r.i32_eqz(r.getLocal(`i`))),r.setLocal(`i`,r.i32_sub(r.getLocal(`i`),r.i32_const(1))),r.br(0))))}function ce(){let t=e.addFunction(N+`_mul1`);t.addParam(`pA`,`i32`),t.addParam(`pC1`,`i32`),t.addParam(`pR`,`i32`);let n=t.getCodeBuilder(),r=n.getLocal(`pA`),i=n.i32_add(n.getLocal(`pA`),n.i32_const(s*2)),a=n.i32_add(n.getLocal(`pA`),n.i32_const(s*4)),o=n.getLocal(`pC1`),c=n.getLocal(`pR`),l=n.i32_add(n.getLocal(`pR`),n.i32_const(s*2)),u=n.i32_add(n.getLocal(`pR`),n.i32_const(s*4)),d=n.i32_const(e.alloc(s*2)),f=n.i32_const(e.alloc(s*2));t.addCode(n.call(_+`_add`,r,i,d),n.call(_+`_add`,i,a,f),n.call(_+`_mul`,i,o,u),n.call(_+`_mul`,f,o,c),n.call(_+`_sub`,c,u,c),n.call(_+`_mulNR`,c,c),n.call(_+`_mul`,d,o,l),n.call(_+`_sub`,l,u,l))}ce();function le(){let t=e.addFunction(N+`_mul01`);t.addParam(`pA`,`i32`),t.addParam(`pC0`,`i32`),t.addParam(`pC1`,`i32`),t.addParam(`pR`,`i32`);let n=t.getCodeBuilder(),r=n.getLocal(`pA`),i=n.i32_add(n.getLocal(`pA`),n.i32_const(s*2)),a=n.i32_add(n.getLocal(`pA`),n.i32_const(s*4)),o=n.getLocal(`pC0`),c=n.getLocal(`pC1`),l=n.getLocal(`pR`),u=n.i32_add(n.getLocal(`pR`),n.i32_const(s*2)),d=n.i32_add(n.getLocal(`pR`),n.i32_const(s*4)),f=n.i32_const(e.alloc(s*2)),p=n.i32_const(e.alloc(s*2)),m=n.i32_const(e.alloc(s*2)),h=n.i32_const(e.alloc(s*2));t.addCode(n.call(_+`_mul`,r,o,f),n.call(_+`_mul`,i,c,p),n.call(_+`_add`,r,i,m),n.call(_+`_add`,r,a,h),n.call(_+`_add`,i,a,l),n.call(_+`_mul`,l,c,l),n.call(_+`_sub`,l,p,l),n.call(_+`_mulNR`,l,l),n.call(_+`_add`,l,f,l),n.call(_+`_add`,o,c,u),n.call(_+`_mul`,u,m,u),n.call(_+`_sub`,u,f,u),n.call(_+`_sub`,u,p,u),n.call(_+`_mul`,h,o,d),n.call(_+`_sub`,d,f,d),n.call(_+`_add`,d,p,d))}le();function H(){let t=e.addFunction(F+`_mul014`);t.addParam(`pA`,`i32`),t.addParam(`pC0`,`i32`),t.addParam(`pC1`,`i32`),t.addParam(`pC4`,`i32`),t.addParam(`pR`,`i32`);let n=t.getCodeBuilder(),r=n.getLocal(`pA`),i=n.i32_add(n.getLocal(`pA`),n.i32_const(s*6)),a=n.getLocal(`pC0`),o=n.getLocal(`pC1`),c=n.getLocal(`pC4`),l=n.i32_const(e.alloc(s*6)),u=n.i32_const(e.alloc(s*6)),d=n.i32_const(e.alloc(s*2)),f=n.getLocal(`pR`),p=n.i32_add(n.getLocal(`pR`),n.i32_const(s*6));t.addCode(n.call(N+`_mul01`,r,a,o,l),n.call(N+`_mul1`,i,c,u),n.call(_+`_add`,o,c,d),n.call(N+`_add`,i,r,p),n.call(N+`_mul01`,p,a,d,p),n.call(N+`_sub`,p,l,p),n.call(N+`_sub`,p,u,p),n.call(N+`_copy`,u,f),n.call(N+`_mulNR`,f,f),n.call(N+`_add`,f,l,f))}H();function ue(){let t=e.addFunction(n+`_ell`);t.addParam(`pP`,`i32`),t.addParam(`pCoefs`,`i32`),t.addParam(`pF`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`pP`),a=r.i32_add(r.getLocal(`pP`),r.i32_const(o)),c=r.getLocal(`pF`),l=r.getLocal(`pCoefs`),u=r.i32_add(r.getLocal(`pCoefs`),r.i32_const(s)),d=r.i32_add(r.getLocal(`pCoefs`),r.i32_const(s*2)),f=r.i32_add(r.getLocal(`pCoefs`),r.i32_const(s*3)),p=r.i32_add(r.getLocal(`pCoefs`),r.i32_const(s*4)),h=e.alloc(s*2),g=r.i32_const(h),_=r.i32_const(h),v=r.i32_const(h+s),y=e.alloc(s*2),b=r.i32_const(y),x=r.i32_const(y),S=r.i32_const(y+s);t.addCode(r.call(m+`_mul`,l,a,_),r.call(m+`_mul`,u,a,v),r.call(m+`_mul`,d,i,x),r.call(m+`_mul`,f,i,S),r.call(F+`_mul014`,c,p,b,g,c))}ue();function de(){let t=e.addFunction(n+`_millerLoop`);t.addParam(`ppreP`,`i32`),t.addParam(`ppreQ`,`i32`),t.addParam(`r`,`i32`),t.addLocal(`pCoef`,`i32`),t.addLocal(`i`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`ppreP`),a=r.getLocal(`pCoef`),o=r.getLocal(`r`);t.addCode(r.call(F+`_one`,o),r.if(r.call(g+`_isZero`,i),r.ret([])),r.if(r.call(g+`_isZero`,r.getLocal(`ppreQ`)),r.ret([])),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`ppreQ`),r.i32_const(c*3))),r.setLocal(`i`,r.i32_const(I.length-2)),r.block(r.loop(r.call(n+`_ell`,i,a,o),r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(R))),r.if(r.i32_load8_s(r.getLocal(`i`),L),[...r.call(n+`_ell`,i,a,o),...r.setLocal(`pCoef`,r.i32_add(r.getLocal(`pCoef`),r.i32_const(R)))]),r.call(F+`_square`,o,o),r.br_if(1,r.i32_eq(r.getLocal(`i`),r.i32_const(1))),r.setLocal(`i`,r.i32_sub(r.getLocal(`i`),r.i32_const(1))),r.br(0))),r.call(n+`_ell`,i,a,o)),t.addCode(r.call(F+`_conjugate`,o,o))}function fe(t){let n=[[[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n]],[[1n,0n],[3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n,151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n],[793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n,0n],[2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n,1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n],[793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n,0n],[3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n,877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n],[4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n,0n],[151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n,3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n],[4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n,0n],[1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n,2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n],[4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n,0n],[877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n,3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n]]],i=[[[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n],[1n,0n]],[[1n,0n],[0n,4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n],[793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n,0n],[0n,1n],[4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n,0n],[0n,793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n]],[[1n,0n],[4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n,0n],[4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n,0n],[4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n,0n],[793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n,0n],[793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n,0n]]],a=e.addFunction(F+`_frobeniusMap`+t);a.addParam(`x`,`i32`),a.addParam(`r`,`i32`);let l=a.getCodeBuilder();for(let r=0;r<6;r++){let d=r==0?l.getLocal(`x`):l.i32_add(l.getLocal(`x`),l.i32_const(r*c)),f=d,p=l.i32_add(l.getLocal(`x`),l.i32_const(r*c+s)),h=r==0?l.getLocal(`r`):l.i32_add(l.getLocal(`r`),l.i32_const(r*c)),g=h,v=l.i32_add(l.getLocal(`r`),l.i32_const(r*c+s)),y=u(n[Math.floor(r/3)][t%12],i[r%3][t%6]),b=e.alloc([...Q(x(y[0]),o),...Q(x(y[1]),o)]);t%2==1?a.addCode(l.call(m+`_copy`,f,g),l.call(m+`_neg`,p,v),l.call(_+`_mul`,h,l.i32_const(b),h)):a.addCode(l.call(_+`_mul`,d,l.i32_const(b),h))}function u(e,t){let n=e[0],i=e[1],a=t[0],o=t[1],s=[(n*a-i*o)%r,(n*o+i*a)%r];return zn(s[0])&&(s[0]+=r),s}}function U(){let t=e.addFunction(n+`__cyclotomicSquare`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`x`),a=r.i32_add(r.getLocal(`x`),r.i32_const(c)),o=r.i32_add(r.getLocal(`x`),r.i32_const(2*c)),s=r.i32_add(r.getLocal(`x`),r.i32_const(3*c)),l=r.i32_add(r.getLocal(`x`),r.i32_const(4*c)),u=r.i32_add(r.getLocal(`x`),r.i32_const(5*c)),d=r.getLocal(`r`),f=r.i32_add(r.getLocal(`r`),r.i32_const(c)),p=r.i32_add(r.getLocal(`r`),r.i32_const(2*c)),m=r.i32_add(r.getLocal(`r`),r.i32_const(3*c)),h=r.i32_add(r.getLocal(`r`),r.i32_const(4*c)),g=r.i32_add(r.getLocal(`r`),r.i32_const(5*c)),v=r.i32_const(e.alloc(c)),y=r.i32_const(e.alloc(c)),b=r.i32_const(e.alloc(c)),x=r.i32_const(e.alloc(c)),S=r.i32_const(e.alloc(c)),C=r.i32_const(e.alloc(c)),w=r.i32_const(e.alloc(c)),T=r.i32_const(e.alloc(c));t.addCode(r.call(_+`_mul`,i,l,w),r.call(_+`_mulNR`,l,v),r.call(_+`_add`,i,v,v),r.call(_+`_add`,i,l,T),r.call(_+`_mul`,T,v,v),r.call(_+`_mulNR`,w,T),r.call(_+`_add`,w,T,T),r.call(_+`_sub`,v,T,v),r.call(_+`_add`,w,w,y),r.call(_+`_mul`,s,o,w),r.call(_+`_mulNR`,o,b),r.call(_+`_add`,s,b,b),r.call(_+`_add`,s,o,T),r.call(_+`_mul`,T,b,b),r.call(_+`_mulNR`,w,T),r.call(_+`_add`,w,T,T),r.call(_+`_sub`,b,T,b),r.call(_+`_add`,w,w,x),r.call(_+`_mul`,a,u,w),r.call(_+`_mulNR`,u,S),r.call(_+`_add`,a,S,S),r.call(_+`_add`,a,u,T),r.call(_+`_mul`,T,S,S),r.call(_+`_mulNR`,w,T),r.call(_+`_add`,w,T,T),r.call(_+`_sub`,S,T,S),r.call(_+`_add`,w,w,C),r.call(_+`_sub`,v,i,d),r.call(_+`_add`,d,d,d),r.call(_+`_add`,v,d,d),r.call(_+`_add`,y,l,h),r.call(_+`_add`,h,h,h),r.call(_+`_add`,y,h,h),r.call(_+`_mul`,C,r.i32_const(j),T),r.call(_+`_add`,T,s,m),r.call(_+`_add`,m,m,m),r.call(_+`_add`,T,m,m),r.call(_+`_sub`,S,o,p),r.call(_+`_add`,p,p,p),r.call(_+`_add`,S,p,p),r.call(_+`_sub`,b,a,f),r.call(_+`_add`,f,f,f),r.call(_+`_add`,b,f,f),r.call(_+`_add`,x,u,g),r.call(_+`_add`,g,g,g),r.call(_+`_add`,x,g,g))}function pe(t,r,i){let a=ne(t).map(e=>e==-1?255:e),o=e.alloc(a),s=e.addFunction(n+`__cyclotomicExp_`+i);s.addParam(`x`,`i32`),s.addParam(`r`,`i32`),s.addLocal(`bit`,`i32`),s.addLocal(`i`,`i32`);let c=s.getCodeBuilder(),u=c.getLocal(`x`),d=c.getLocal(`r`),f=c.i32_const(e.alloc(l));s.addCode(c.call(F+`_conjugate`,u,f),c.call(F+`_one`,d),c.if(c.teeLocal(`bit`,c.i32_load8_s(c.i32_const(a.length-1),o)),c.if(c.i32_eq(c.getLocal(`bit`),c.i32_const(1)),c.call(F+`_mul`,d,u,d),c.call(F+`_mul`,d,f,d))),c.setLocal(`i`,c.i32_const(a.length-2)),c.block(c.loop(c.call(n+`__cyclotomicSquare`,d,d),c.if(c.teeLocal(`bit`,c.i32_load8_s(c.getLocal(`i`),o)),c.if(c.i32_eq(c.getLocal(`bit`),c.i32_const(1)),c.call(F+`_mul`,d,u,d),c.call(F+`_mul`,d,f,d))),c.br_if(1,c.i32_eqz(c.getLocal(`i`))),c.setLocal(`i`,c.i32_sub(c.getLocal(`i`),c.i32_const(1))),c.br(0)))),r&&s.addCode(c.call(F+`_conjugate`,d,d))}function W(){U(),pe(V,!0,`w0`);let t=e.addFunction(n+`_finalExponentiation`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let r=t.getCodeBuilder(),i=r.getLocal(`x`),a=r.getLocal(`r`),o=r.i32_const(e.alloc(l)),s=r.i32_const(e.alloc(l)),c=r.i32_const(e.alloc(l)),u=r.i32_const(e.alloc(l)),d=r.i32_const(e.alloc(l)),f=r.i32_const(e.alloc(l)),p=r.i32_const(e.alloc(l));t.addCode(r.call(F+`_frobeniusMap6`,i,o),r.call(F+`_inverse`,i,s),r.call(F+`_mul`,o,s,c),r.call(F+`_copy`,c,s),r.call(F+`_frobeniusMap2`,c,c),r.call(F+`_mul`,c,s,c),r.call(n+`__cyclotomicSquare`,c,s),r.call(F+`_conjugate`,s,s),r.call(n+`__cyclotomicExp_w0`,c,u),r.call(n+`__cyclotomicSquare`,u,d),r.call(F+`_mul`,s,u,f),r.call(n+`__cyclotomicExp_w0`,f,s),r.call(n+`__cyclotomicExp_w0`,s,o),r.call(n+`__cyclotomicExp_w0`,o,p),r.call(F+`_mul`,p,d,p),r.call(n+`__cyclotomicExp_w0`,p,d),r.call(F+`_conjugate`,f,f),r.call(F+`_mul`,d,f,d),r.call(F+`_mul`,d,c,d),r.call(F+`_conjugate`,c,f),r.call(F+`_mul`,s,c,s),r.call(F+`_frobeniusMap3`,s,s),r.call(F+`_mul`,p,f,p),r.call(F+`_frobeniusMap1`,p,p),r.call(F+`_mul`,u,o,u),r.call(F+`_frobeniusMap2`,u,u),r.call(F+`_mul`,u,s,u),r.call(F+`_mul`,u,p,u),r.call(F+`_mul`,u,d,a))}function me(){let t=e.addFunction(n+`_finalExponentiationOld`);t.addParam(`x`,`i32`),t.addParam(`r`,`i32`);let r=e.alloc(Q(322277361516934140462891564586510139908379969514828494218366688025288661041104682794998680497580008899973249814104447692778988208376779573819485263026159588510513834876303014016798809919343532899164848730280942609956670917565618115867287399623286813270357901731510188149934363360381614501334086825442271920079363289954510565375378443704372994881406797882676971082200626541916413184642520269678897559532260949334760604962086348898118982248842634379637598665468817769075878555493752214492790122785850202957575200176084204422751485957336465472324810982833638490904279282696134323072515220044451592646885410572234451732790590013479358343841220074174848221722017083597872017638514103174122784843925578370430843522959600095676285723737049438346544753168912974976791528535276317256904336520179281145394686565050419250614107803233314658825463117900250701199181529205942363159325765991819433914303908860460720581408201373164047773794825411011922305820065611121544561808414055302212057471395719432072209245600258134364584636810093520285711072578721435517884103526483832733289802426157301542744476740008494780363354305116978805620671467071400711358839553375340724899735460480144599782014906586543813292157922220645089192130209334926661588737007768565838519456601560804957985667880395221049249803753582637708560n,544)),i=t.getCodeBuilder();t.addCode(i.call(F+`_exp`,i.getLocal(`x`),i.i32_const(r),i.i32_const(544),i.getLocal(`r`)))}let G=e.alloc(te),K=e.alloc(B);function q(t){let r=e.addFunction(n+`_pairingEq`+t);for(let e=0;e{xn(),tr(),rr(),ar(),sr(),pr(),hr(),_r(),yr(),br(),$n()})),Tr=l({bn128_wasm_gzip:()=>Ot,buildBls12381:()=>Cr,buildBn128:()=>xr,buildF1m:()=>er}),Er=s((()=>{Vt(),Sr(),wr(),tr()}));globalThis.curve_bn128=null;async function Dr(e,t){if(!e&&globalThis.curve_bn128)return globalThis.curve_bn128;let n={};if(t){let{ModuleBuilder:e}=await Promise.resolve().then(()=>(bn(),yn)),{buildBn128:r}=await Promise.resolve().then(()=>(Er(),Tr)),i=new e;i.setMemory(25),r(i),t&&t(i),n.code=i.build(),n.pq=i.modules.f1m.pq,n.pr=i.modules.frm.pq,n.pG1gen=i.modules.bn128.pG1gen,n.pG1zero=i.modules.bn128.pG1zero,n.pG1b=i.modules.bn128.pG1b,n.pG2gen=i.modules.bn128.pG2gen,n.pG2zero=i.modules.bn128.pG2zero,n.pG2b=i.modules.bn128.pG2b,n.pOneT=i.modules.bn128.pOneT,n.prePSize=i.modules.bn128.prePSize,n.preQSize=i.modules.bn128.preQSize,n.n8q=32,n.n8r=32,n.q=i.modules.bn128.q,n.r=i.modules.bn128.r}else{console.log(`Using prebuilt bn128 wasm`);let e=await Promise.resolve().then(()=>(Vt(),Ot));n.pq=e.pq,n.pr=e.pq,n.pG1gen=e.pG1gen,n.pG1zero=e.pG1zero,n.pG1b=e.pG1b,n.pG2gen=e.pG2gen,n.pG2zero=e.pG2zero,n.pG2b=e.pG2b,n.pOneT=e.pOneT,n.prePSize=e.prePSize,n.preQSize=e.preQSize,n.n8q=32,n.n8r=32,n.q=e.q,n.r=e.r;let t=Uint8Array.from(atob(e.gzipCode),e=>e.charCodeAt(0)),r=new Blob([t]),i=new DecompressionStream(`gzip`),a=r.stream().pipeThrough(i);n.code=await new Response(a).bytes()}let r={name:`bn128`,wasm:n,q:h(`21888242871839275222246405745257275088696311157297823662689037894645226208583`),r:h(`21888242871839275222246405745257275088548364400416034343698204186575808495617`),n8q:32,n8r:32,cofactorG2:h(`30644e72e131a029b85045b68181585e06ceecda572a2489345f2299c0f9fa8d`,16),singleThread:!!e},i=await Dt(r);return i.terminate=async function(){r.singleThread||(globalThis.curve_bn128=null,await this.tm.terminate())},e||(globalThis.curve_bn128=i),i}globalThis.curve_bls12381=null;async function Or(e,t){if(!e&&globalThis.curve_bls12381)return globalThis.curve_bls12381;let{ModuleBuilder:n}=await Promise.resolve().then(()=>(bn(),yn)),{buildBls12381:r}=await Promise.resolve().then(()=>(Er(),Tr)),i=new n;i.setMemory(25),r(i),t&&t(i);let a={};a.code=i.build(),a.pq=i.modules.f1m.pq,a.pr=i.modules.frm.pq,a.pG1gen=i.modules.bls12381.pG1gen,a.pG1zero=i.modules.bls12381.pG1zero,a.pG1b=i.modules.bls12381.pG1b,a.pG2gen=i.modules.bls12381.pG2gen,a.pG2zero=i.modules.bls12381.pG2zero,a.pG2b=i.modules.bls12381.pG2b,a.pOneT=i.modules.bls12381.pOneT,a.prePSize=i.modules.bls12381.prePSize,a.preQSize=i.modules.bls12381.preQSize,a.n8q=48,a.n8r=32,a.q=i.modules.bls12381.q,a.r=i.modules.bls12381.r;let o={name:`bls12381`,wasm:a,q:h(`1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab`,16),r:h(`73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001`,16),n8q:48,n8r:32,cofactorG1:h(`0x396c8c005555e1568c00aaab0000aaab`,16),cofactorG2:h(`0x5d543a95414e7f1091d50792876a202cd91de4547085abaa68a205b2e5a7ddfa628f1cb4d9e82ef21537e293a6691ae1616ec6e786f0c70cf1c38e31c7238e5`,16),singleThread:!!e},s=await Dt(o);return s.terminate=async function(){o.singleThread||(globalThis.curve_bls12381=null,await this.tm.terminate())},e||(globalThis.curve_bls12381=s),s}var kr=h(`73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001`,16),Ar=h(`21888242871839275222246405745257275088548364400416034343698204186575808495617`),jr=h(`1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab`,16),Mr=h(`21888242871839275222246405745257275088696311157297823662689037894645226208583`);async function Nr(e,t,n){let r;if(z(e,Ar))r=await Dr(t,n);else if(z(e,kr))r=await Or(t,n);else throw Error(`Curve not supported: ${fe(e)}`);return r}async function Pr(e,t,n){let r;if(z(e,Mr))r=await Dr(t,n);else if(z(e,jr))r=await Or(t,n);else throw Error(`Curve not supported: ${fe(e,16)}`);return r}async function Fr(e,t,n){let r,i=a(e);if([`BN128`,`BN254`,`ALTBN128`].indexOf(i)>=0)r=await Dr(t,n);else if([`BLS12381`].indexOf(i)>=0)r=await Or(t,n);else throw Error(`Curve not supported: ${e}`);return r;function a(e){return e.toUpperCase().match(/[A-Za-z0-9]+/g).join(``)}}var Ir=f,Lr=Ge;return e.BigBuffer=X,e.ChaCha=je,e.EC=We,e.F1Field=Be,e.ZqField=Be,e.F2Field=Ve,e.F3Field=He,e.PolField=me,e.Scalar=Ir,e.buildBls12381=Or,e.buildBn128=Dr,e.getCurveFromName=Fr,e.getCurveFromQ=Pr,e.getCurveFromR=Nr,e.utils=Lr,e})({}); +//# sourceMappingURL=browser.iife.js.map \ No newline at end of file diff --git a/build/browser/browser.iife.js.map b/build/browser/browser.iife.js.map new file mode 100644 index 0000000..5aaa323 --- /dev/null +++ b/build/browser/browser.iife.js.map @@ -0,0 +1 @@ +{"version":3,"file":"browser.iife.js","names":["bitLength","isNegative","isZero","isOdd","toNumber","square","exp","abs","log2","__fft","_revTable","_revSlow","Scalar.isZero","Scalar.naf","Scalar.bits","Scalar.eq","Scalar.mod","Scalar.pow","Scalar.sub","Scalar.isOdd","Scalar.div","Scalar.add","Scalar.mul","log2","Scalar.bitLength","FFFT","futils.exp","Scalar.fromRprLE","Scalar.fromRprBE","fUtils.mulScalar","fUtils.exp","fUtils.mulScalar","fUtils.exp","Scalar.gt","fUtils.mulScalar","Scalar.fromRprLE","Scalar.bitLength","Scalar.shiftRight","Scalar.one","Scalar.bitLength","Scalar.sub","Scalar.shiftLeft","Scalar.isOdd","Scalar.toLEBuff","Scalar.e","Scalar.isNegative","Scalar.neg","Scalar.gt","Scalar.mod","utils.leInt2Buff","Scalar.fromRprLE","Scalar.toString","Scalar.zero","Scalar.add","Scalar.band","Scalar.geq","utils.array2buffer","utils.buffer2array","Scalar.toLEBuff","Scalar.e","Scalar.toLEBuff","Scalar.e","Scalar.toLEBuff","Scalar.e","module","exports","workerScript","workerpool","buildMultiexp","buildFFT","Scalar.e","isNegative","bitLength","utils.varuint32","utils.varint64","utils.varint32","utils.varuint32","utils.u32","utils.toHexString","utils.varuint32","utils.string","utils.varint32","utils.ident","utils.ident","utils.ident","buildBatchConvertion","utils.bigInt2BytesLE","buildTimesScalar","buildTimesScalar","utils.bigInt2BytesLE","buildTimesScalar","utils.bigInt2BytesLE","utils.bigInt2BytesLE","utils.bigInt2BytesLE","Scalar.e","Scalar.e","Scalar.e","Scalar.eq","Scalar.toString","_Scalar","_utils"],"sources":["../../src/scalar.js","../../src/polfield.js","../../src/futils.js","../../src/fsqrt.js","../../src/chacha.js","../../__vite-browser-external","../../src/random.js","../../src/fft.js","../../src/f1field.js","../../src/f2field.js","../../src/f3field.js","../../src/ec.js","../../src/utils.js","../../src/bigbuffer.js","../../src/engine_batchconvert.js","../../src/wasm_field1.js","../../src/wasm_field2.js","../../src/wasm_field3.js","../../src/wasm_curve.js","../../src/threadman_thread.js","../../node_modules/workerpool/dist/workerpool.js","../../src/threadman.browser.js","../../src/threadman.js","../../src/engine_applykey.js","../../src/engine_pairing.js","../../src/engine_multiexp.js","../../src/engine_fft.js","../../src/engine.js","../../node_modules/wasmcurves/build/bn128_wasm_gzip.js","../../node_modules/wasmbuilder/src/utils.js","../../node_modules/wasmbuilder/src/codebuilder.js","../../node_modules/wasmbuilder/src/functionbuilder.js","../../node_modules/wasmbuilder/src/modulebuilder.js","../../node_modules/wasmbuilder/src/codebuilder_wat.js","../../node_modules/wasmbuilder/src/functionbuilder_wat.js","../../node_modules/wasmbuilder/src/modulebuilder_wat.js","../../node_modules/wasmbuilder/src/protoboard.js","../../node_modules/wasmbuilder/main.js","../../node_modules/wasmcurves/src/utils.js","../../node_modules/wasmcurves/src/build_int.js","../../node_modules/wasmcurves/src/build_timesscalar.js","../../node_modules/wasmcurves/src/build_batchinverse.js","../../node_modules/wasmcurves/src/build_batchconvertion.js","../../node_modules/wasmcurves/src/build_batchop.js","../../node_modules/wasmcurves/src/bigint.js","../../node_modules/wasmcurves/src/build_f1m.js","../../node_modules/wasmcurves/src/build_f1.js","../../node_modules/wasmcurves/src/build_f2m.js","../../node_modules/wasmcurves/src/build_f3m.js","../../node_modules/wasmcurves/src/build_timesscalarnaf.js","../../node_modules/wasmcurves/src/build_multiexp.js","../../node_modules/wasmcurves/src/build_curve_jacobian_a0.js","../../node_modules/wasmcurves/src/build_fft.js","../../node_modules/wasmcurves/src/build_pol.js","../../node_modules/wasmcurves/src/build_qap.js","../../node_modules/wasmcurves/src/build_applykey.js","../../node_modules/wasmcurves/src/bn128/build_bn128.js","../../node_modules/wasmcurves/src/bls12381/build_bls12381.js","../../node_modules/wasmcurves/index.js","../../src/bn128.js","../../src/bls12381.js","../../src/curves.js","../../main.js"],"sourcesContent":["\nconst hexLen = [ 0, 1, 2, 2, 3, 3, 3, 3, 4 ,4 ,4 ,4 ,4 ,4 ,4 ,4];\n\nexport function fromString(s, radix) {\n if ((!radix)||(radix==10)) {\n return BigInt(s);\n } else if (radix==16) {\n if (s.slice(0,2) == \"0x\") {\n return BigInt(s);\n } else {\n return BigInt(\"0x\"+s);\n }\n }\n}\n\nexport const e = fromString;\n\nexport function fromArray(a, radix) {\n let acc =BigInt(0);\n radix = BigInt(radix);\n for (let i=0; i> BigInt(n);\n}\n\nexport const shl = shiftLeft;\nexport const shr = shiftRight;\n\nexport function isOdd(a) {\n return (BigInt(a) & BigInt(1)) == BigInt(1);\n}\n\n\nexport function naf(n) {\n let E = BigInt(n);\n const res = [];\n while (E) {\n if (E & BigInt(1)) {\n const z = 2 - Number(E % BigInt(4));\n res.push( z );\n E = E - BigInt(z);\n } else {\n res.push( 0 );\n }\n E = E >> BigInt(1);\n }\n return res;\n}\n\n\nexport function bits(n) {\n let E = BigInt(n);\n const res = [];\n while (E) {\n if (E & BigInt(1)) {\n res.push(1);\n } else {\n res.push( 0 );\n }\n E = E >> BigInt(1);\n }\n return res;\n}\n\nexport function toNumber(s) {\n if (s>BigInt(Number.MAX_SAFE_INTEGER )) {\n throw new Error(\"Number too big\");\n }\n return Number(s);\n}\n\nexport function toArray(s, radix) {\n const res = [];\n let rem = BigInt(s);\n radix = BigInt(radix);\n while (rem) {\n res.unshift( Number(rem % radix));\n rem = rem / radix;\n }\n return res;\n}\n\n\nexport function add(a, b) {\n return BigInt(a) + BigInt(b);\n}\n\nexport function sub(a, b) {\n return BigInt(a) - BigInt(b);\n}\n\nexport function neg(a) {\n return -BigInt(a);\n}\n\nexport function mul(a, b) {\n return BigInt(a) * BigInt(b);\n}\n\nexport function square(a) {\n return BigInt(a) * BigInt(a);\n}\n\nexport function pow(a, b) {\n return BigInt(a) ** BigInt(b);\n}\n\nexport function exp(a, b) {\n return BigInt(a) ** BigInt(b);\n}\n\nexport function abs(a) {\n return BigInt(a) >= 0 ? BigInt(a) : -BigInt(a);\n}\n\nexport function div(a, b) {\n return BigInt(a) / BigInt(b);\n}\n\nexport function mod(a, b) {\n return BigInt(a) % BigInt(b);\n}\n\nexport function eq(a, b) {\n return BigInt(a) == BigInt(b);\n}\n\nexport function neq(a, b) {\n return BigInt(a) != BigInt(b);\n}\n\nexport function lt(a, b) {\n return BigInt(a) < BigInt(b);\n}\n\nexport function gt(a, b) {\n return BigInt(a) > BigInt(b);\n}\n\nexport function leq(a, b) {\n return BigInt(a) <= BigInt(b);\n}\n\nexport function geq(a, b) {\n return BigInt(a) >= BigInt(b);\n}\n\nexport function band(a, b) {\n return BigInt(a) & BigInt(b);\n}\n\nexport function bor(a, b) {\n return BigInt(a) | BigInt(b);\n}\n\nexport function bxor(a, b) {\n return BigInt(a) ^ BigInt(b);\n}\n\nexport function land(a, b) {\n return BigInt(a) && BigInt(b);\n}\n\nexport function lor(a, b) {\n return BigInt(a) || BigInt(b);\n}\n\nexport function lnot(a) {\n return !BigInt(a);\n}\n\n// Returns a buffer with Little Endian Representation\nexport function toRprLE(buff, o, e, n8) {\n const s = \"0000000\" + e.toString(16);\n const v = new Uint32Array(buff.buffer, buff.byteOffset + o, n8/4);\n const l = (((s.length-7)*4 - 1) >> 5)+1; // Number of 32bit words;\n for (let i=0; i> 5)+1; // Number of 32bit words;\n for (let i=0; i a[a.length-i-1] = ch.toString(16).padStart(8,\"0\") );\n return fromString(a.join(\"\"), 16);\n}\n\n// Pases a buffer with Big Endian Representation\nexport function fromRprBE(buff, o, n8) {\n n8 = n8 || buff.byteLength;\n o = o || 0;\n const v = new DataView(buff.buffer, buff.byteOffset + o, n8);\n const a = new Array(n8/4);\n for (let i=0; i.\n*/\n\n/*\n This library does operations on polynomials with coefficients in a field F.\n\n A polynomial P(x) = p0 + p1 * x + p2 * x^2 + ... + pn * x^n is represented\n by the array [ p0, p1, p2, ... , pn ].\n */\n\nexport default class PolField {\n constructor (F) {\n this.F = F;\n\n let rem = F.sqrt_t;\n let s = F.sqrt_s;\n\n const five = this.F.add(this.F.add(this.F.two, this.F.two), this.F.one);\n\n this.w = new Array(s+1);\n this.wi = new Array(s+1);\n this.w[s] = this.F.pow(five, rem);\n this.wi[s] = this.F.inv(this.w[s]);\n\n let n=s-1;\n while (n>=0) {\n this.w[n] = this.F.square(this.w[n+1]);\n this.wi[n] = this.F.square(this.wi[n+1]);\n n--;\n }\n\n\n this.roots = [];\n /* for (let i=0; i<16; i++) {\n let r = this.F.one;\n n = 1 << i;\n const rootsi = new Array(n);\n for (let j=0; j this.F.sqrt_s) n = this.s;\n for (let i=n; (i>=0) && (!this.roots[i]); i--) {\n let r = this.F.one;\n const nroots = 1 << i;\n const rootsi = new Array(nroots);\n for (let j=0; j a.length) {\n [b, a] = [a, b];\n }\n\n if ((b.length <= 2) || (b.length < log2(a.length))) {\n return this.mulNormal(a,b);\n } else {\n return this.mulFFT(a,b);\n }\n }\n\n mulNormal(a, b) {\n let res = [];\n for (let i=0; i0) {\n const z = new Array(n).fill(this.F.zero);\n return z.concat(p);\n } else {\n if (-n >= p.length) return [];\n return p.slice(-n);\n }\n }\n\n eval2(p, x) {\n let v = this.F.zero;\n let ix = this.F.one;\n for (let i=0; i> 1),\n F.mul(\n x,\n _eval(p, newX, offset+step , step << 1, n >> 1)));\n return res;\n }\n }\n\n lagrange(points) {\n let roots = [this.F.one];\n for (let i=0; i> 1;\n const p1 = this._fft(pall, bits-1, offset, step*2);\n const p2 = this._fft(pall, bits-1, offset+step, step*2);\n\n const out = new Array(n);\n\n let m= this.F.one;\n for (let i=0; i0 && this.F.eq(p[i], this.F.zero) ) i--;\n return p.slice(0, i+1);\n }\n\n eq(a, b) {\n const pa = this.reduce(a);\n const pb = this.reduce(b);\n\n if (pa.length != pb.length) return false;\n for (let i=0; i=0; i--) {\n res[i] = this.F.add(this.F.mul(res[i+1], r), p[i+1]);\n }\n return res;\n }\n\n _next2Power(v) {\n v--;\n v |= v >> 1;\n v |= v >> 2;\n v |= v >> 4;\n v |= v >> 8;\n v |= v >> 16;\n v++;\n return v;\n }\n\n toString(p) {\n const ap = this.normalize(p);\n let S = \"\";\n for (let i=ap.length-1; i>=0; i--) {\n if (!this.F.eq(p[i], this.F.zero)) {\n if (S!=\"\") S += \" + \";\n S = S + p[i].toString(10);\n if (i>0) {\n S = S + \"x\";\n if (i>1) {\n S = S + \"^\" +i;\n }\n }\n }\n }\n return S;\n }\n\n normalize(p) {\n const res = new Array(p.length);\n for (let i=0; i\n // rec = x^(k-2-scaleV)/ v\n //\n // res = x^m/v = x^(m + (2*k-2 - scaleV) - (2*k-2 - scaleV)) /v =>\n // res = rec * x^(m - (2*k-2 - scaleV)) =>\n // res = rec * x^(m - 2*k + 2 + scaleV)\n\n const rec = this._reciprocal(this.scaleX(v, scaleV), kbits);\n const res = this.scaleX(rec, m - 2*k + 2 + scaleV);\n\n return res;\n }\n\n div(_u, _v) {\n if (_u.length < _v.length) return [];\n const kbits = log2(_v.length-1)+1;\n const k = 1 << kbits;\n\n const u = this.scaleX(_u, k-_v.length);\n const v = this.scaleX(_v, k-_v.length);\n\n const n = v.length-1;\n let m = u.length-1;\n\n const s = this._reciprocal(v, kbits);\n let t;\n if (m>2*n) {\n t = this.sub(this.scaleX([this.F.one], 2*n), this.mul(s, v));\n }\n\n let q = [];\n let rem = u;\n let us, ut;\n let finish = false;\n\n while (!finish) {\n us = this.mul(rem, s);\n q = this.add(q, this.scaleX(us, -2*n));\n\n if ( m > 2*n ) {\n ut = this.mul(rem, t);\n rem = this.scaleX(ut, -2*n);\n m = rem.length-1;\n } else {\n finish = true;\n }\n }\n\n return q;\n }\n\n\n // returns the ith nth-root of one\n oneRoot(n, i) {\n let nbits = log2(n-1)+1;\n let res = this.F.one;\n let r = i;\n\n if(i>=n) {\n throw new Error(\"Given 'i' should be lower than 'n'\");\n }\n else if (1<0) {\n if (r & 1 == 1) {\n res = this.F.mul(res, this.w[nbits]);\n }\n r = r >> 1;\n nbits --;\n }\n return res;\n }\n\n computeVanishingPolinomial(bits, t) {\n const m = 1 << bits;\n return this.F.sub(this.F.pow(t, m), this.F.one);\n }\n\n evaluateLagrangePolynomials(bits, t) {\n const m= 1 << bits;\n const tm = this.F.pow(t, m);\n const u= new Array(m).fill(this.F.zero);\n this._setRoots(bits);\n const omega = this.w[bits];\n\n if (this.F.eq(tm, this.F.one)) {\n for (let i = 0; i < m; i++) {\n if (this.F.eq(this.roots[bits][0],t)) { // i.e., t equals omega^i\n u[i] = this.F.one;\n return u;\n }\n }\n }\n\n const z = this.F.sub(tm, this.F.one);\n // let l = this.F.mul(z, this.F.pow(this.F.twoinv, m));\n let l = this.F.mul(z, this.F.inv(this.F.e(m)));\n for (let i = 0; i < m; i++) {\n u[i] = this.F.mul(l, this.F.inv(this.F.sub(t,this.roots[bits][i])));\n l = this.F.mul(l, omega);\n }\n\n return u;\n }\n\n log2(V) {\n return log2(V);\n }\n}\n\nfunction log2( V )\n{\n return( ( ( V & 0xFFFF0000 ) !== 0 ? ( V &= 0xFFFF0000, 16 ) : 0 ) | ( ( V & 0xFF00FF00 ) !== 0 ? ( V &= 0xFF00FF00, 8 ) : 0 ) | ( ( V & 0xF0F0F0F0 ) !== 0 ? ( V &= 0xF0F0F0F0, 4 ) : 0 ) | ( ( V & 0xCCCCCCCC ) !== 0 ? ( V &= 0xCCCCCCCC, 2 ) : 0 ) | ( ( V & 0xAAAAAAAA ) !== 0 ) );\n}\n\n\nfunction __fft(PF, pall, bits, offset, step) {\n\n const n = 1 << bits;\n if (n==1) {\n return [ pall[offset] ];\n } else if (n==2) {\n return [\n PF.F.add(pall[offset], pall[offset + step]),\n PF.F.sub(pall[offset], pall[offset + step])];\n }\n\n const ndiv2 = n >> 1;\n const p1 = __fft(PF, pall, bits-1, offset, step*2);\n const p2 = __fft(PF, pall, bits-1, offset+step, step*2);\n\n const out = new Array(n);\n\n for (let i=0; i> 1;\n const p1 = __fft2(PF, pall.slice(0, ndiv2), bits-1);\n const p2 = __fft2(PF, pall.slice(ndiv2), bits-1);\n\n const out = new Array(n);\n\n for (let i=0; i>=1;\n }\n return res;\n}\n\nfunction rev(idx, bits) {\n return (\n _revTable[idx >>> 24] |\n (_revTable[(idx >>> 16) & 0xFF] << 8) |\n (_revTable[(idx >>> 8) & 0xFF] << 16) |\n (_revTable[idx & 0xFF] << 24)\n ) >>> (32-bits);\n}\n\nfunction __bitReverse(p, bits) {\n for (let k=0; kk) {\n const tmp= p[k];\n p[k] = p[r];\n p[r] = tmp;\n }\n }\n\n}\n\n\n","/*\n Copyright 2018 0kims association.\n\n This file is part of snarkjs.\n\n snarkjs is a free software: you can redistribute it and/or\n modify it under the terms of the GNU General Public License as published by the\n Free Software Foundation, either version 3 of the License, or (at your option)\n any later version.\n\n snarkjs is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n more details.\n\n You should have received a copy of the GNU General Public License along with\n snarkjs. If not, see .\n*/\n\nimport * as Scalar from \"./scalar.js\";\n\n\nexport function mulScalar(F, base, e) {\n let res;\n\n if (Scalar.isZero(e)) return F.zero;\n\n const n = Scalar.naf(e);\n\n if (n[n.length-1] == 1) {\n res = base;\n } else if (n[n.length-1] == -1) {\n res = F.neg(base);\n } else {\n throw new Error(\"invlaud NAF\");\n }\n\n for (let i=n.length-2; i>=0; i--) {\n\n res = F.double(res);\n\n if (n[i] == 1) {\n res = F.add(res, base);\n } else if (n[i] == -1) {\n res = F.sub(res, base);\n }\n }\n\n return res;\n}\n\n\n/*\nexports.mulScalar = (F, base, e) =>{\n let res = F.zero;\n let rem = bigInt(e);\n let exp = base;\n\n while (! rem.eq(bigInt.zero)) {\n if (rem.and(bigInt.one).eq(bigInt.one)) {\n res = F.add(res, exp);\n }\n exp = F.double(exp);\n rem = rem.shiftRight(1);\n }\n\n return res;\n};\n*/\n\n\nexport function exp(F, base, e) {\n\n if (Scalar.isZero(e)) return F.one;\n\n const n = Scalar.bits(e);\n\n if (n.length==0) return F.one;\n\n let res = base;\n\n for (let i=n.length-2; i>=0; i--) {\n\n res = F.square(res);\n\n if (n[i]) {\n res = F.mul(res, base);\n }\n }\n\n return res;\n}\n\n\n","import * as Scalar from \"./scalar.js\";\n// Check here: https://eprint.iacr.org/2012/685.pdf\n\nexport default function buildSqrt (F) {\n if ((F.m % 2) == 1) {\n if (Scalar.eq(Scalar.mod(F.p, 4), 1 )) {\n if (Scalar.eq(Scalar.mod(F.p, 8), 1 )) {\n if (Scalar.eq(Scalar.mod(F.p, 16), 1 )) {\n // alg7_muller(F);\n alg5_tonelliShanks(F);\n } else if (Scalar.eq(Scalar.mod(F.p, 16), 9 )) {\n alg4_kong(F);\n } else {\n throw new Error(\"Field withot sqrt\");\n }\n } else if (Scalar.eq(Scalar.mod(F.p, 8), 5 )) {\n alg3_atkin(F);\n } else {\n throw new Error(\"Field withot sqrt\");\n }\n } else if (Scalar.eq(Scalar.mod(F.p, 4), 3 )) {\n alg2_shanks(F);\n }\n } else {\n const pm2mod4 = Scalar.mod(Scalar.pow(F.p, F.m/2), 4);\n if (pm2mod4 == 1) {\n alg10_adj(F);\n } else if (pm2mod4 == 3) {\n alg9_adj(F);\n } else {\n alg8_complex(F);\n }\n\n }\n}\n\n\nfunction alg5_tonelliShanks(F) {\n F.sqrt_q = Scalar.pow(F.p, F.m);\n\n F.sqrt_s = 0;\n F.sqrt_t = Scalar.sub(F.sqrt_q, 1);\n\n while (!Scalar.isOdd(F.sqrt_t)) {\n F.sqrt_s = F.sqrt_s + 1;\n F.sqrt_t = Scalar.div(F.sqrt_t, 2);\n }\n\n let c0 = F.one;\n\n while (F.eq(c0, F.one)) {\n const c = F.random();\n F.sqrt_z = F.pow(c, F.sqrt_t);\n c0 = F.pow(F.sqrt_z, 2 ** (F.sqrt_s-1) );\n }\n\n F.sqrt_tm1d2 = Scalar.div(Scalar.sub(F.sqrt_t, 1),2);\n\n F.sqrt = function(a) {\n const F=this;\n if (F.isZero(a)) return F.zero;\n let w = F.pow(a, F.sqrt_tm1d2);\n const a0 = F.pow( F.mul(F.square(w), a), 2 ** (F.sqrt_s-1) );\n if (F.eq(a0, F.negone)) return null;\n\n let v = F.sqrt_s;\n let x = F.mul(a, w);\n let b = F.mul(x, w);\n let z = F.sqrt_z;\n while (!F.eq(b, F.one)) {\n let b2k = F.square(b);\n let k=1;\n while (!F.eq(b2k, F.one)) {\n b2k = F.square(b2k);\n k++;\n }\n\n w = z;\n for (let i=0; i>> 0;\n st[d] = (st[d] ^ st[a]) >>> 0;\n st[d] = ((st[d] << 16) | ((st[d]>>>16) & 0xFFFF)) >>> 0;\n\n st[c] = (st[c] + st[d]) >>> 0;\n st[b] = (st[b] ^ st[c]) >>> 0;\n st[b] = ((st[b] << 12) | ((st[b]>>>20) & 0xFFF)) >>> 0;\n\n st[a] = (st[a] + st[b]) >>> 0;\n st[d] = (st[d] ^ st[a]) >>> 0;\n st[d] = ((st[d] << 8) | ((st[d]>>>24) & 0xFF)) >>> 0;\n\n st[c] = (st[c] + st[d]) >>> 0;\n st[b] = (st[b] ^ st[c]) >>> 0;\n st[b] = ((st[b] << 7) | ((st[b]>>>25) & 0x7F)) >>> 0;\n}\n\nfunction doubleRound(st) {\n quarterRound(st, 0, 4, 8,12);\n quarterRound(st, 1, 5, 9,13);\n quarterRound(st, 2, 6,10,14);\n quarterRound(st, 3, 7,11,15);\n\n quarterRound(st, 0, 5,10,15);\n quarterRound(st, 1, 6,11,12);\n quarterRound(st, 2, 7, 8,13);\n quarterRound(st, 3, 4, 9,14);\n}\n\nexport default class ChaCha {\n\n constructor(seed) {\n seed = seed || [0,0,0,0,0,0,0,0];\n this.state = [\n 0x61707865,\n 0x3320646E,\n 0x79622D32,\n 0x6B206574,\n seed[0],\n seed[1],\n seed[2],\n seed[3],\n seed[4],\n seed[5],\n seed[6],\n seed[7],\n 0,\n 0,\n 0,\n 0\n ];\n this.idx = 16;\n this.buff = new Array(16);\n }\n\n nextU32() {\n if (this.idx == 16) this.update();\n return this.buff[this.idx++];\n }\n\n nextU64() {\n return Scalar.add(Scalar.mul(this.nextU32(), 0x100000000), this.nextU32());\n }\n\n nextBool() {\n return (this.nextU32() & 1) == 1;\n }\n\n update() {\n // Copy the state\n for (let i=0; i<16; i++) this.buff[i] = this.state[i];\n\n // Apply the rounds\n for (let i=0; i<10; i++) doubleRound(this.buff);\n\n // Add to the initial\n for (let i=0; i<16; i++) this.buff[i] = (this.buff[i] + this.state[i]) >>> 0;\n\n this.idx = 0;\n\n this.state[12] = (this.state[12] + 1) >>> 0;\n if (this.state[12] != 0) return;\n this.state[13] = (this.state[13] + 1) >>> 0;\n if (this.state[13] != 0) return;\n this.state[14] = (this.state[14] + 1) >>> 0;\n if (this.state[14] != 0) return;\n this.state[15] = (this.state[15] + 1) >>> 0;\n }\n}\n","module.exports = {}","import ChaCha from \"./chacha.js\";\n\nexport function getRandomBytes(n) {\n let array = new Uint8Array(n);\n if (typeof globalThis.crypto !== \"undefined\") {\n globalThis.crypto.getRandomValues(array);\n } else if (typeof require === \"function\") {\n // Node.js <18: globalThis.crypto not available; use the built-in module.\n require(\"crypto\").randomFillSync(array);\n } else {\n throw new Error(\"No cryptographically secure random source available.\");\n }\n return array;\n}\n\nexport function getRandomSeed() {\n const arr = getRandomBytes(32);\n const arrV = new Uint32Array(arr.buffer);\n const seed = [];\n for (let i = 0; i < 8; i++) {\n seed.push(arrV[i]);\n }\n return seed;\n}\n\nlet threadRng = null;\n\nexport function getThreadRng() {\n if (threadRng) return threadRng;\n threadRng = new ChaCha(getRandomSeed());\n return threadRng;\n}\n","/*\n Copyright 2018 0kims association.\n\n This file is part of snarkjs.\n\n snarkjs is a free software: you can redistribute it and/or\n modify it under the terms of the GNU General Public License as published by the\n Free Software Foundation, either version 3 of the License, or (at your option)\n any later version.\n\n snarkjs is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n more details.\n\n You should have received a copy of the GNU General Public License along with\n snarkjs. If not, see .\n*/\n\n/*\n This library does operations on polynomials with coefficients in a field F.\n\n A polynomial P(x) = p0 + p1 * x + p2 * x^2 + ... + pn * x^n is represented\n by the array [ p0, p1, p2, ... , pn ].\n */\n\nexport default class FFT {\n constructor (G, F, opMulGF) {\n this.F = F;\n this.G = G;\n this.opMulGF = opMulGF;\n\n let rem = F.sqrt_t || F.t;\n let s = F.sqrt_s || F.s;\n\n let nqr = F.one;\n while (F.eq(F.pow(nqr, F.half), F.one)) nqr = F.add(nqr, F.one);\n\n this.w = new Array(s+1);\n this.wi = new Array(s+1);\n this.w[s] = this.F.pow(nqr, rem);\n this.wi[s] = this.F.inv(this.w[s]);\n\n let n=s-1;\n while (n>=0) {\n this.w[n] = this.F.square(this.w[n+1]);\n this.wi[n] = this.F.square(this.wi[n+1]);\n n--;\n }\n\n\n this.roots = [];\n /*\n for (let i=0; i<16; i++) {\n let r = this.F.one;\n n = 1 << i;\n const rootsi = new Array(n);\n for (let j=0; j=0) && (!this.roots[i]); i--) {\n let r = this.F.one;\n const nroots = 1 << i;\n const rootsi = new Array(nroots);\n for (let j=0; j> 1;\n const p1 = __fft(PF, pall, bits-1, offset, step*2);\n const p2 = __fft(PF, pall, bits-1, offset+step, step*2);\n\n const out = new Array(n);\n\n for (let i=0; i> this.one;\n this.bitLength = Scalar.bitLength(this.p);\n this.mask = (this.one << BigInt(this.bitLength)) - this.one;\n\n this.n64 = Math.floor((this.bitLength - 1) / 64)+1;\n this.n32 = this.n64*2;\n this.n8 = this.n64*8;\n this.R = this.e(this.one << BigInt(this.n64*64));\n this.Ri = this.inv(this.R);\n\n const e = this.negone >> this.one;\n this.nqr = this.two;\n let r = this.pow(this.nqr, e);\n while (!this.eq(r, this.negone)) {\n this.nqr = this.nqr + this.one;\n r = this.pow(this.nqr, e);\n }\n\n\n this.s = 0;\n this.t = this.negone;\n\n while ((this.t & this.one) == this.zero) {\n this.s = this.s + 1;\n this.t = this.t >> this.one;\n }\n\n this.nqr_to_t = this.pow(this.nqr, this.t);\n\n buildSqrt(this);\n\n this.FFT = new FFFT(this, this, this.mul.bind(this));\n\n this.fft = this.FFT.fft.bind(this.FFT);\n this.ifft = this.FFT.ifft.bind(this.FFT);\n this.w = this.FFT.w;\n this.wi = this.FFT.wi; \n \n this.shift = this.square(this.nqr);\n this.k = this.exp(this.nqr, 2**this.s);\n }\n\n e(a,b) {\n let res;\n if (!b) {\n res = BigInt(a);\n } else if (b==16) {\n res = BigInt(\"0x\"+a);\n }\n if (res < 0) {\n let nres = -res;\n if (nres >= this.p) nres = nres % this.p;\n return this.p - nres;\n } else {\n return (res>= this.p) ? res%this.p : res;\n }\n\n }\n\n add(a, b) {\n const res = a + b;\n return res >= this.p ? res-this.p : res;\n }\n\n sub(a, b) {\n return (a >= b) ? a-b : this.p-b+a;\n }\n\n neg(a) {\n return a ? this.p-a : a;\n }\n\n mul(a, b) {\n return (a*b)%this.p;\n }\n\n mulScalar(base, s) {\n return (base * this.e(s)) % this.p;\n }\n\n square(a) {\n return (a*a) % this.p;\n }\n\n eq(a, b) {\n return a==b;\n }\n\n neq(a, b) {\n return a!=b;\n }\n\n lt(a, b) {\n const aa = (a > this.half) ? a - this.p : a;\n const bb = (b > this.half) ? b - this.p : b;\n return aa < bb;\n }\n\n gt(a, b) {\n const aa = (a > this.half) ? a - this.p : a;\n const bb = (b > this.half) ? b - this.p : b;\n return aa > bb;\n }\n\n leq(a, b) {\n const aa = (a > this.half) ? a - this.p : a;\n const bb = (b > this.half) ? b - this.p : b;\n return aa <= bb;\n }\n\n geq(a, b) {\n const aa = (a > this.half) ? a - this.p : a;\n const bb = (b > this.half) ? b - this.p : b;\n return aa >= bb;\n }\n\n div(a, b) {\n return this.mul(a, this.inv(b));\n }\n\n idiv(a, b) {\n if (!b) throw new Error(\"Division by zero\");\n return a / b;\n }\n\n inv(a) {\n if (!a) throw new Error(\"Division by zero\");\n\n let t = this.zero;\n let r = this.p;\n let newt = this.one;\n let newr = a % this.p;\n while (newr) {\n let q = r/newr;\n [t, newt] = [newt, t-q*newt];\n [r, newr] = [newr, r-q*newr];\n }\n if (t= this.p ? res-this.p : res;\n }\n\n bor(a, b) {\n const res = ((a | b) & this.mask);\n return res >= this.p ? res-this.p : res;\n }\n\n bxor(a, b) {\n const res = ((a ^ b) & this.mask);\n return res >= this.p ? res-this.p : res;\n }\n\n bnot(a) {\n const res = a ^ this.mask;\n return res >= this.p ? res-this.p : res;\n }\n\n shl(a, b) {\n if (Number(b) < this.bitLength) {\n const res = (a << b) & this.mask;\n return res >= this.p ? res-this.p : res;\n } else {\n const nb = this.p - b;\n if (Number(nb) < this.bitLength) {\n return a >> nb;\n } else {\n return this.zero;\n }\n }\n }\n\n shr(a, b) {\n if (Number(b) < this.bitLength) {\n return a >> b;\n } else {\n const nb = this.p - b;\n if (Number(nb) < this.bitLength) {\n const res = (a << nb) & this.mask;\n return res >= this.p ? res-this.p : res;\n } else {\n return 0;\n }\n }\n }\n\n land(a, b) {\n return (a && b) ? this.one : this.zero;\n }\n\n lor(a, b) {\n return (a || b) ? this.one : this.zero;\n }\n\n lnot(a) {\n return (a) ? this.zero : this.one;\n }\n\n sqrt_old(n) {\n\n if (n == this.zero) return this.zero;\n\n // Test that have solution\n const res = this.pow(n, this.negone >> this.one);\n if ( res != this.one ) return null;\n\n let m = this.s;\n let c = this.nqr_to_t;\n let t = this.pow(n, this.t);\n let r = this.pow(n, this.add(this.t, this.one) >> this.one );\n\n while ( t != this.one ) {\n let sq = this.square(t);\n let i = 1;\n while (sq != this.one ) {\n i++;\n sq = this.square(sq);\n }\n\n // b = c ^ m-i-1\n let b = c;\n for (let j=0; j< m-i-1; j ++) b = this.square(b);\n\n m = i;\n c = this.square(b);\n t = this.mul(t, c);\n r = this.mul(r, b);\n }\n\n if (r > (this.p >> this.one)) {\n r = this.neg(r);\n }\n\n return r;\n }\n\n normalize(a, b) {\n a = BigInt(a,b);\n if (a < 0) {\n let na = -a;\n if (na >= this.p) na = na % this.p;\n return this.p - na;\n } else {\n return (a>= this.p) ? a%this.p : a;\n }\n }\n\n random() {\n const nBytes = (this.bitLength*2 / 8);\n let res =this.zero;\n for (let i=0; i this.half)&&(base == 10)) {\n const v = this.p-a;\n vs = \"-\"+v.toString(base);\n } else {\n vs = a.toString(base);\n }\n return vs;\n }\n\n isZero(a) {\n return a == this.zero;\n }\n\n fromRng(rng) {\n let v;\n do {\n v=this.zero;\n for (let i=0; i= this.p);\n v = (v * this.Ri) % this.p; // Convert from montgomery\n return v;\n }\n\n fft(a) {\n return this.FFT.fft(a);\n }\n\n ifft(a) {\n return this.FFT.ifft(a);\n }\n\n // Returns a buffer with Little Endian Representation\n toRprLE(buff, o, e) {\n Scalar.toRprLE(buff, o, e, this.n64*8);\n }\n\n // Returns a buffer with Big Endian Representation\n toRprBE(buff, o, e) {\n Scalar.toRprBE(buff, o, e, this.n64*8);\n }\n\n // Returns a buffer with Big Endian Montgomery Representation\n toRprBEM(buff, o, e) {\n return this.toRprBE(buff, o, this.mul(this.R, e));\n }\n\n toRprLEM(buff, o, e) {\n return this.toRprLE(buff, o, this.mul(this.R, e));\n }\n\n\n // Pases a buffer with Little Endian Representation\n fromRprLE(buff, o) {\n return Scalar.fromRprLE(buff, o, this.n8);\n }\n\n // Pases a buffer with Big Endian Representation\n fromRprBE(buff, o) {\n return Scalar.fromRprBE(buff, o, this.n8);\n }\n\n fromRprLEM(buff, o) {\n return this.mul(this.fromRprLE(buff, o), this.Ri);\n }\n\n fromRprBEM(buff, o) {\n return this.mul(this.fromRprBE(buff, o), this.Ri);\n }\n\n toObject(a) {\n return a;\n }\n}","/*\n Copyright 2018 0kims association.\n\n This file is part of snarkjs.\n\n snarkjs is a free software: you can redistribute it and/or\n modify it under the terms of the GNU General Public License as published by the\n Free Software Foundation, either version 3 of the License, or (at your option)\n any later version.\n\n snarkjs is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n more details.\n\n You should have received a copy of the GNU General Public License along with\n snarkjs. If not, see .\n*/\n\nimport * as fUtils from \"./futils.js\";\nimport buildSqrt from \"./fsqrt.js\";\n\nexport default class F2Field {\n constructor(F, nonResidue) {\n this.type=\"F2\";\n this.F = F;\n this.zero = [this.F.zero, this.F.zero];\n this.one = [this.F.one, this.F.zero];\n this.negone = this.neg(this.one);\n this.nonResidue = nonResidue;\n this.m = F.m*2;\n this.p = F.p;\n this.n64 = F.n64*2;\n this.n32 = this.n64*2;\n this.n8 = this.n64*8;\n\n buildSqrt(this);\n }\n\n _mulByNonResidue(a) {\n return this.F.mul(this.nonResidue, a);\n }\n\n copy(a) {\n return [this.F.copy(a[0]), this.F.copy(a[1])];\n }\n\n add(a, b) {\n return [\n this.F.add(a[0], b[0]),\n this.F.add(a[1], b[1])\n ];\n }\n\n double(a) {\n return this.add(a,a);\n }\n\n sub(a, b) {\n return [\n this.F.sub(a[0], b[0]),\n this.F.sub(a[1], b[1])\n ];\n }\n\n neg(a) {\n return this.sub(this.zero, a);\n }\n\n conjugate(a) {\n return [\n a[0],\n this.F.neg(a[1])\n ];\n }\n\n mul(a, b) {\n const aA = this.F.mul(a[0] , b[0]);\n const bB = this.F.mul(a[1] , b[1]);\n\n return [\n this.F.add( aA , this._mulByNonResidue(bB)),\n this.F.sub(\n this.F.mul(\n this.F.add(a[0], a[1]),\n this.F.add(b[0], b[1])),\n this.F.add(aA, bB))];\n }\n\n inv(a) {\n const t0 = this.F.square(a[0]);\n const t1 = this.F.square(a[1]);\n const t2 = this.F.sub(t0, this._mulByNonResidue(t1));\n const t3 = this.F.inv(t2);\n return [\n this.F.mul(a[0], t3),\n this.F.neg(this.F.mul( a[1], t3)) ];\n }\n\n div(a, b) {\n return this.mul(a, this.inv(b));\n }\n\n square(a) {\n const ab = this.F.mul(a[0] , a[1]);\n\n /*\n [\n (a + b) * (a + non_residue * b) - ab - non_residue * ab,\n ab + ab\n ];\n */\n\n return [\n this.F.sub(\n this.F.mul(\n this.F.add(a[0], a[1]) ,\n this.F.add(\n a[0] ,\n this._mulByNonResidue(a[1]))),\n this.F.add(\n ab,\n this._mulByNonResidue(ab))),\n this.F.add(ab, ab)\n ];\n }\n\n isZero(a) {\n return this.F.isZero(a[0]) && this.F.isZero(a[1]);\n }\n\n eq(a, b) {\n return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]);\n }\n\n mulScalar(base, e) {\n return fUtils.mulScalar(this, base, e);\n }\n\n pow(base, e) {\n return fUtils.exp(this, base, e);\n }\n\n exp(base, e) {\n return fUtils.exp(this, base, e);\n }\n\n toString(a) {\n return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])} ]`;\n }\n\n fromRng(rng) {\n const c0 = this.F.fromRng(rng);\n const c1 = this.F.fromRng(rng);\n return [c0, c1];\n }\n\n gt(a, b) {\n if (this.F.gt(a[0], b[0])) return true;\n if (this.F.gt(b[0], a[0])) return false;\n if (this.F.gt(a[1], b[1])) return true;\n return false;\n }\n\n geq(a, b) {\n return this.gt(a, b) || this.eq(a, b);\n }\n\n lt(a, b) {\n return !this.geq(a,b);\n }\n\n leq(a, b) {\n return !this.gt(a,b);\n }\n\n neq(a, b) {\n return !this.eq(a,b);\n }\n\n random() {\n return [this.F.random(), this.F.random()];\n }\n\n\n toRprLE(buff, o, e) {\n this.F.toRprLE(buff, o, e[0]);\n this.F.toRprLE(buff, o+this.F.n8, e[1]);\n }\n\n toRprBE(buff, o, e) {\n this.F.toRprBE(buff, o, e[1]);\n this.F.toRprBE(buff, o+this.F.n8, e[0]);\n }\n\n toRprLEM(buff, o, e) {\n this.F.toRprLEM(buff, o, e[0]);\n this.F.toRprLEM(buff, o+this.F.n8, e[1]);\n }\n\n\n toRprBEM(buff, o, e) {\n this.F.toRprBEM(buff, o, e[1]);\n this.F.toRprBEM(buff, o+this.F.n8, e[0]);\n }\n\n fromRprLE(buff, o) {\n o = o || 0;\n const c0 = this.F.fromRprLE(buff, o);\n const c1 = this.F.fromRprLE(buff, o+this.F.n8);\n return [c0, c1];\n }\n\n fromRprBE(buff, o) {\n o = o || 0;\n const c1 = this.F.fromRprBE(buff, o);\n const c0 = this.F.fromRprBE(buff, o+this.F.n8);\n return [c0, c1];\n }\n\n fromRprLEM(buff, o) {\n o = o || 0;\n const c0 = this.F.fromRprLEM(buff, o);\n const c1 = this.F.fromRprLEM(buff, o+this.F.n8);\n return [c0, c1];\n }\n\n fromRprBEM(buff, o) {\n o = o || 0;\n const c1 = this.F.fromRprBEM(buff, o);\n const c0 = this.F.fromRprBEM(buff, o+this.F.n8);\n return [c0, c1];\n }\n\n toObject(a) {\n return a;\n }\n\n}\n\n","/*\n Copyright 2018 0kims association.\n\n This file is part of snarkjs.\n\n snarkjs is a free software: you can redistribute it and/or\n modify it under the terms of the GNU General Public License as published by the\n Free Software Foundation, either version 3 of the License, or (at your option)\n any later version.\n\n snarkjs is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n more details.\n\n You should have received a copy of the GNU General Public License along with\n snarkjs. If not, see .\n*/\n\nimport * as fUtils from \"./futils.js\";\n\nexport default class F3Field {\n constructor(F, nonResidue) {\n this.type=\"F3\";\n this.F = F;\n this.zero = [this.F.zero, this.F.zero, this.F.zero];\n this.one = [this.F.one, this.F.zero, this.F.zero];\n this.negone = this.neg(this.one);\n this.nonResidue = nonResidue;\n this.m = F.m*3;\n this.p = F.p;\n this.n64 = F.n64*3;\n this.n32 = this.n64*2;\n this.n8 = this.n64*8;\n }\n\n _mulByNonResidue(a) {\n return this.F.mul(this.nonResidue, a);\n }\n\n copy(a) {\n return [this.F.copy(a[0]), this.F.copy(a[1]), this.F.copy(a[2])];\n }\n\n add(a, b) {\n return [\n this.F.add(a[0], b[0]),\n this.F.add(a[1], b[1]),\n this.F.add(a[2], b[2])\n ];\n }\n\n double(a) {\n return this.add(a,a);\n }\n\n sub(a, b) {\n return [\n this.F.sub(a[0], b[0]),\n this.F.sub(a[1], b[1]),\n this.F.sub(a[2], b[2])\n ];\n }\n\n neg(a) {\n return this.sub(this.zero, a);\n }\n\n mul(a, b) {\n\n const aA = this.F.mul(a[0] , b[0]);\n const bB = this.F.mul(a[1] , b[1]);\n const cC = this.F.mul(a[2] , b[2]);\n\n return [\n this.F.add(\n aA,\n this._mulByNonResidue(\n this.F.sub(\n this.F.mul(\n this.F.add(a[1], a[2]),\n this.F.add(b[1], b[2])),\n this.F.add(bB, cC)))), // aA + non_residue*((b+c)*(B+C)-bB-cC),\n\n this.F.add(\n this.F.sub(\n this.F.mul(\n this.F.add(a[0], a[1]),\n this.F.add(b[0], b[1])),\n this.F.add(aA, bB)),\n this._mulByNonResidue( cC)), // (a+b)*(A+B)-aA-bB+non_residue*cC\n\n this.F.add(\n this.F.sub(\n this.F.mul(\n this.F.add(a[0], a[2]),\n this.F.add(b[0], b[2])),\n this.F.add(aA, cC)),\n bB)]; // (a+c)*(A+C)-aA+bB-cC)\n }\n\n inv(a) {\n const t0 = this.F.square(a[0]); // t0 = a^2 ;\n const t1 = this.F.square(a[1]); // t1 = b^2 ;\n const t2 = this.F.square(a[2]); // t2 = c^2;\n const t3 = this.F.mul(a[0],a[1]); // t3 = ab\n const t4 = this.F.mul(a[0],a[2]); // t4 = ac\n const t5 = this.F.mul(a[1],a[2]); // t5 = bc;\n // c0 = t0 - non_residue * t5;\n const c0 = this.F.sub(t0, this._mulByNonResidue(t5));\n // c1 = non_residue * t2 - t3;\n const c1 = this.F.sub(this._mulByNonResidue(t2), t3);\n const c2 = this.F.sub(t1, t4); // c2 = t1-t4\n\n // t6 = (a * c0 + non_residue * (c * c1 + b * c2)).inv();\n const t6 =\n this.F.inv(\n this.F.add(\n this.F.mul(a[0], c0),\n this._mulByNonResidue(\n this.F.add(\n this.F.mul(a[2], c1),\n this.F.mul(a[1], c2)))));\n\n return [\n this.F.mul(t6, c0), // t6*c0\n this.F.mul(t6, c1), // t6*c1\n this.F.mul(t6, c2)]; // t6*c2\n }\n\n div(a, b) {\n return this.mul(a, this.inv(b));\n }\n\n square(a) {\n const s0 = this.F.square(a[0]); // s0 = a^2\n const ab = this.F.mul(a[0], a[1]); // ab = a*b\n const s1 = this.F.add(ab, ab); // s1 = 2ab;\n const s2 = this.F.square(\n this.F.add(this.F.sub(a[0],a[1]), a[2])); // s2 = (a - b + c)^2;\n const bc = this.F.mul(a[1],a[2]); // bc = b*c\n const s3 = this.F.add(bc, bc); // s3 = 2*bc\n const s4 = this.F.square(a[2]); // s4 = c^2\n\n\n return [\n this.F.add(\n s0,\n this._mulByNonResidue(s3)), // s0 + non_residue * s3,\n this.F.add(\n s1,\n this._mulByNonResidue(s4)), // s1 + non_residue * s4,\n this.F.sub(\n this.F.add( this.F.add(s1, s2) , s3 ),\n this.F.add(s0, s4))]; // s1 + s2 + s3 - s0 - s4\n }\n\n isZero(a) {\n return this.F.isZero(a[0]) && this.F.isZero(a[1]) && this.F.isZero(a[2]);\n }\n\n eq(a, b) {\n return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]) && this.F.eq(a[2], b[2]);\n }\n\n affine(a) {\n return [this.F.affine(a[0]), this.F.affine(a[1]), this.F.affine(a[2])];\n }\n\n mulScalar(base, e) {\n return fUtils.mulScalar(this, base, e);\n }\n\n pow(base, e) {\n return fUtils.exp(this, base, e);\n }\n\n exp(base, e) {\n return fUtils.exp(this, base, e);\n }\n\n toString(a) {\n return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])}, ${this.F.toString(a[2])} ]`;\n }\n\n fromRng(rng) {\n const c0 = this.F.fromRng(rng);\n const c1 = this.F.fromRng(rng);\n const c2 = this.F.fromRng(rng);\n return [c0, c1, c2];\n }\n\n gt(a, b) {\n if (this.F.gt(a[0], b[0])) return true;\n if (this.F.gt(b[0], a[0])) return false;\n if (this.F.gt(a[1], b[1])) return true;\n if (this.F.gt(b[1], a[1])) return false;\n if (this.F.gt(a[2], b[2])) return true;\n return false;\n }\n\n\n geq(a, b) {\n return this.gt(a, b) || this.eq(a, b);\n }\n\n lt(a, b) {\n return !this.geq(a,b);\n }\n\n leq(a, b) {\n return !this.gt(a,b);\n }\n\n neq(a, b) {\n return !this.eq(a,b);\n }\n\n random() {\n return [this.F.random(), this.F.random(), this.F.random()];\n }\n\n\n toRprLE(buff, o, e) {\n this.F.toRprLE(buff, o, e[0]);\n this.F.toRprLE(buff, o+this.F.n8, e[1]);\n this.F.toRprLE(buff, o+this.F.n8*2, e[2]);\n }\n\n toRprBE(buff, o, e) {\n this.F.toRprBE(buff, o, e[2]);\n this.F.toRprBE(buff, o+this.F.n8, e[1]);\n this.F.toRprBE(buff, o+this.F.n8*2, e[0]);\n }\n\n toRprLEM(buff, o, e) {\n this.F.toRprLEM(buff, o, e[0]);\n this.F.toRprLEM(buff, o+this.F.n8, e[1]);\n this.F.toRprLEM(buff, o+this.F.n8*2, e[2]);\n }\n\n\n toRprBEM(buff, o, e) {\n this.F.toRprBEM(buff, o, e[2]);\n this.F.toRprBEM(buff, o+this.F.n8, e[1]);\n this.F.toRprBEM(buff, o+this.F.n8*2, e[0]);\n }\n\n fromRprLE(buff, o) {\n o = o || 0;\n const c0 = this.F.fromRprLE(buff, o);\n const c1 = this.F.fromRprLE(buff, o+this.n8);\n const c2 = this.F.fromRprLE(buff, o+this.n8*2);\n return [c0, c1, c2];\n }\n\n fromRprBE(buff, o) {\n o = o || 0;\n const c2 = this.F.fromRprBE(buff, o);\n const c1 = this.F.fromRprBE(buff, o+this.n8);\n const c0 = this.F.fromRprBE(buff, o+this.n8*2);\n return [c0, c1, c2];\n }\n\n fromRprLEM(buff, o) {\n o = o || 0;\n const c0 = this.F.fromRprLEM(buff, o);\n const c1 = this.F.fromRprLEM(buff, o+this.n8);\n const c2 = this.F.fromRprLEM(buff, o+this.n8*2);\n return [c0, c1, c2];\n }\n\n fromRprBEM(buff, o) {\n o = o || 0;\n const c2 = this.F.fromRprBEM(buff, o);\n const c1 = this.F.fromRprBEM(buff, o+this.n8);\n const c0 = this.F.fromRprBEM(buff, o+this.n8*2);\n return [c0, c1, c2];\n }\n\n toObject(a) {\n return a;\n }\n}\n","/*\n Copyright 2018 0kims association.\n\n This file is part of snarkjs.\n\n snarkjs is a free software: you can redistribute it and/or\n modify it under the terms of the GNU General Public License as published by the\n Free Software Foundation, either version 3 of the License, or (at your option)\n any later version.\n\n snarkjs is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n more details.\n\n You should have received a copy of the GNU General Public License along with\n snarkjs. If not, see .\n*/\n\n\n\nimport * as fUtils from \"./futils.js\";\nimport * as Scalar from \"./scalar.js\";\n\n\nfunction isGreatest(F, a) {\n if (Array.isArray(a)) {\n for (let i=a.length-1; i>=0; i--) {\n if (!F.F.isZero(a[i])) {\n return isGreatest(F.F, a[i]);\n }\n }\n return 0;\n } else {\n const na = F.neg(a);\n return Scalar.gt(a, na);\n }\n}\n\n\nexport default class EC {\n\n constructor(F, g) {\n this.F = F;\n this.g = g;\n if (this.g.length == 2) this.g[2] = this.F.one;\n this.zero = [this.F.zero, this.F.one, this.F.zero];\n }\n\n add(p1, p2) {\n\n const F = this.F;\n\n if (this.eq(p1, this.zero)) return p2;\n if (this.eq(p2, this.zero)) return p1;\n\n const res = new Array(3);\n\n const Z1Z1 = F.square( p1[2] );\n const Z2Z2 = F.square( p2[2] );\n\n const U1 = F.mul( p1[0] , Z2Z2 ); // U1 = X1 * Z2Z2\n const U2 = F.mul( p2[0] , Z1Z1 ); // U2 = X2 * Z1Z1\n\n const Z1_cubed = F.mul( p1[2] , Z1Z1);\n const Z2_cubed = F.mul( p2[2] , Z2Z2);\n\n const S1 = F.mul( p1[1] , Z2_cubed); // S1 = Y1 * Z2 * Z2Z2\n const S2 = F.mul( p2[1] , Z1_cubed); // S2 = Y2 * Z1 * Z1Z1\n\n if (F.eq(U1,U2) && F.eq(S1,S2)) {\n return this.double(p1);\n }\n\n const H = F.sub( U2 , U1 ); // H = U2-U1\n\n const S2_minus_S1 = F.sub( S2 , S1 );\n\n const I = F.square( F.add(H,H) ); // I = (2 * H)^2\n const J = F.mul( H , I ); // J = H * I\n\n const r = F.add( S2_minus_S1 , S2_minus_S1 ); // r = 2 * (S2-S1)\n const V = F.mul( U1 , I ); // V = U1 * I\n\n res[0] =\n F.sub(\n F.sub( F.square(r) , J ),\n F.add( V , V )); // X3 = r^2 - J - 2 * V\n\n const S1_J = F.mul( S1 , J );\n\n res[1] =\n F.sub(\n F.mul( r , F.sub(V,res[0])),\n F.add( S1_J,S1_J )); // Y3 = r * (V-X3)-2 S1 J\n\n res[2] =\n F.mul(\n H,\n F.sub(\n F.square( F.add(p1[2],p2[2]) ),\n F.add( Z1Z1 , Z2Z2 ))); // Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2) * H\n\n return res;\n }\n\n neg(p) {\n return [p[0], this.F.neg(p[1]), p[2]];\n }\n\n sub(a, b) {\n return this.add(a, this.neg(b));\n }\n\n double(p) {\n const F = this.F;\n\n const res = new Array(3);\n\n if (this.eq(p, this.zero)) return p;\n\n const A = F.square( p[0] ); // A = X1^2\n const B = F.square( p[1] ); // B = Y1^2\n const C = F.square( B ); // C = B^2\n\n let D =\n F.sub(\n F.square( F.add(p[0] , B )),\n F.add( A , C));\n D = F.add(D,D); // D = 2 * ((X1 + B)^2 - A - C)\n\n const E = F.add( F.add(A,A), A); // E = 3 * A\n const FF =F.square( E ); // F = E^2\n\n res[0] = F.sub( FF , F.add(D,D) ); // X3 = F - 2 D\n\n let eightC = F.add( C , C );\n eightC = F.add( eightC , eightC );\n eightC = F.add( eightC , eightC );\n\n res[1] =\n F.sub(\n F.mul(\n E,\n F.sub( D, res[0] )),\n eightC); // Y3 = E * (D - X3) - 8 * C\n\n const Y1Z1 = F.mul( p[1] , p[2] );\n res[2] = F.add( Y1Z1 , Y1Z1 ); // Z3 = 2 * Y1 * Z1\n\n return res;\n }\n\n timesScalar(base, e) {\n return fUtils.mulScalar(this, base, e);\n }\n\n mulScalar(base, e) {\n return fUtils.mulScalar(this, base, e);\n }\n\n affine(p) {\n const F = this.F;\n if (this.isZero(p)) {\n return this.zero;\n } else if (F.eq(p[2], F.one)) {\n return p;\n } else {\n const Z_inv = F.inv(p[2]);\n const Z2_inv = F.square(Z_inv);\n const Z3_inv = F.mul(Z2_inv, Z_inv);\n\n const res = new Array(3);\n res[0] = F.mul(p[0],Z2_inv);\n res[1] = F.mul(p[1],Z3_inv);\n res[2] = F.one;\n\n return res;\n }\n }\n\n multiAffine(arr) {\n const keys = Object.keys(arr);\n const F = this.F;\n const accMul = new Array(keys.length+1);\n accMul[0] = F.one;\n for (let i = 0; i< keys.length; i++) {\n if (F.eq(arr[keys[i]][2], F.zero)) {\n accMul[i+1] = accMul[i];\n } else {\n accMul[i+1] = F.mul(accMul[i], arr[keys[i]][2]);\n }\n }\n\n accMul[keys.length] = F.inv(accMul[keys.length]);\n\n for (let i = keys.length-1; i>=0; i--) {\n if (F.eq(arr[keys[i]][2], F.zero)) {\n accMul[i] = accMul[i+1];\n arr[keys[i]] = this.zero;\n } else {\n const Z_inv = F.mul(accMul[i], accMul[i+1]);\n accMul[i] = F.mul(arr[keys[i]][2], accMul[i+1]);\n\n const Z2_inv = F.square(Z_inv);\n const Z3_inv = F.mul(Z2_inv, Z_inv);\n\n arr[keys[i]][0] = F.mul(arr[keys[i]][0],Z2_inv);\n arr[keys[i]][1] = F.mul(arr[keys[i]][1],Z3_inv);\n arr[keys[i]][2] = F.one;\n }\n }\n\n }\n\n eq(p1, p2) {\n const F = this.F;\n\n if (this.F.eq(p1[2], this.F.zero)) return this.F.eq(p2[2], this.F.zero);\n if (this.F.eq(p2[2], this.F.zero)) return false;\n\n const Z1Z1 = F.square( p1[2] );\n const Z2Z2 = F.square( p2[2] );\n\n const U1 = F.mul( p1[0] , Z2Z2 );\n const U2 = F.mul( p2[0] , Z1Z1 );\n\n const Z1_cubed = F.mul( p1[2] , Z1Z1);\n const Z2_cubed = F.mul( p2[2] , Z2Z2);\n\n const S1 = F.mul( p1[1] , Z2_cubed);\n const S2 = F.mul( p2[1] , Z1_cubed);\n\n return (F.eq(U1,U2) && F.eq(S1,S2));\n }\n\n isZero(p) {\n return this.F.isZero(p[2]);\n }\n\n toString(p) {\n const cp = this.affine(p);\n return `[ ${this.F.toString(cp[0])} , ${this.F.toString(cp[1])} ]`;\n }\n\n fromRng(rng) {\n const F = this.F;\n let P = [];\n let greatest;\n do {\n P[0] = F.fromRng(rng);\n greatest = rng.nextBool();\n const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b);\n P[1] = F.sqrt(x3b);\n } while ((P[1] == null)||(F.isZero[P]));\n\n const s = isGreatest(F, P[1]);\n if (greatest ^ s) P[1] = F.neg(P[1]);\n P[2] = F.one;\n\n if (this.cofactor) {\n P = this.mulScalar(P, this.cofactor);\n }\n\n P = this.affine(P);\n\n return P;\n\n }\n\n toRprLE(buff, o, p) {\n p = this.affine(p);\n if (this.isZero(p)) {\n const BuffV = new Uint8Array(buff, o, this.F.n8*2);\n BuffV.fill(0);\n return;\n }\n this.F.toRprLE(buff, o, p[0]);\n this.F.toRprLE(buff, o+this.F.n8, p[1]);\n }\n\n toRprBE(buff, o, p) {\n p = this.affine(p);\n if (this.isZero(p)) {\n const BuffV = new Uint8Array(buff, o, this.F.n8*2);\n BuffV.fill(0);\n return;\n }\n this.F.toRprBE(buff, o, p[0]);\n this.F.toRprBE(buff, o+this.F.n8, p[1]);\n }\n\n toRprLEM(buff, o, p) {\n p = this.affine(p);\n if (this.isZero(p)) {\n const BuffV = new Uint8Array(buff, o, this.F.n8*2);\n BuffV.fill(0);\n return;\n }\n this.F.toRprLEM(buff, o, p[0]);\n this.F.toRprLEM(buff, o+this.F.n8, p[1]);\n }\n\n toRprLEJM(buff, o, p) {\n p = this.affine(p);\n if (this.isZero(p)) {\n const BuffV = new Uint8Array(buff, o, this.F.n8*2);\n BuffV.fill(0);\n return;\n }\n this.F.toRprLEM(buff, o, p[0]);\n this.F.toRprLEM(buff, o+this.F.n8, p[1]);\n this.F.toRprLEM(buff, o+2*this.F.n8, p[2]);\n }\n\n\n toRprBEM(buff, o, p) {\n p = this.affine(p);\n if (this.isZero(p)) {\n const BuffV = new Uint8Array(buff, o, this.F.n8*2);\n BuffV.fill(0);\n return;\n }\n this.F.toRprBEM(buff, o, p[0]);\n this.F.toRprBEM(buff, o+this.F.n8, p[1]);\n }\n\n fromRprLE(buff, o) {\n o = o || 0;\n const x = this.F.fromRprLE(buff, o);\n const y = this.F.fromRprLE(buff, o+this.F.n8);\n if (this.F.isZero(x) && this.F.isZero(y)) {\n return this.zero;\n }\n return [x, y, this.F.one];\n }\n\n fromRprBE(buff, o) {\n o = o || 0;\n const x = this.F.fromRprBE(buff, o);\n const y = this.F.fromRprBE(buff, o+this.F.n8);\n if (this.F.isZero(x) && this.F.isZero(y)) {\n return this.zero;\n }\n return [x, y, this.F.one];\n }\n\n fromRprLEM(buff, o) {\n o = o || 0;\n const x = this.F.fromRprLEM(buff, o);\n const y = this.F.fromRprLEM(buff, o+this.F.n8);\n if (this.F.isZero(x) && this.F.isZero(y)) {\n return this.zero;\n }\n return [x, y, this.F.one];\n }\n\n fromRprLEJM(buff, o) {\n o = o || 0;\n const x = this.F.fromRprLEM(buff, o);\n const y = this.F.fromRprLEM(buff, o+this.F.n8);\n const z = this.F.fromRprLEM(buff, o+this.F.n8*2);\n if (this.F.isZero(x) && this.F.isZero(y)) {\n return this.zero;\n }\n return [x, y, z];\n }\n\n fromRprBEM(buff, o) {\n o = o || 0;\n const x = this.F.fromRprBEM(buff, o);\n const y = this.F.fromRprBEM(buff, o+this.F.n8);\n if (this.F.isZero(x) && this.F.isZero(y)) {\n return this.zero;\n }\n return [x, y, this.F.one];\n }\n\n fromRprCompressed(buff, o) {\n const F = this.F;\n const v = new Uint8Array(buff.buffer, o, F.n8);\n if (v[0] & 0x40) return this.zero;\n const P = new Array(3);\n\n const greatest = ((v[0] & 0x80) != 0);\n v[0] = v[0] & 0x7F;\n P[0] = F.fromRprBE(buff, o);\n if (greatest) v[0] = v[0] | 0x80; // set back again the old value\n\n const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b);\n P[1] = F.sqrt(x3b);\n\n if (P[1] === null) {\n throw new Error(\"Invalid Point!\");\n }\n\n const s = isGreatest(F, P[1]);\n if (greatest ^ s) P[1] = F.neg(P[1]);\n P[2] = F.one;\n\n return P;\n }\n\n toRprCompressed(buff, o, p) {\n p = this.affine(p);\n const v = new Uint8Array(buff.buffer, o, this.F.n8);\n if (this.isZero(p)) {\n v.fill(0);\n v[0] = 0x40;\n return;\n }\n this.F.toRprBE(buff, o, p[0]);\n\n if (isGreatest(this.F, p[1])) {\n v[0] = v[0] | 0x80;\n }\n }\n\n\n fromRprUncompressed(buff, o) {\n if (buff[0] & 0x40) return this.zero;\n\n return this.fromRprBE(buff, o);\n }\n\n toRprUncompressed(buff, o, p) {\n this.toRprBE(buff, o, p);\n\n if (this.isZero(p)) {\n buff[o] = buff[o] | 0x40;\n }\n }\n\n\n}\n\n\n","import * as Scalar from \"./scalar.js\";\n\nexport function stringifyBigInts(o) {\n if (typeof o == \"bigint\" || o.eq !== undefined) {\n return o.toString(10);\n } else if (o instanceof Uint8Array) {\n return Scalar.fromRprLE(o, 0);\n } else if (Array.isArray(o)) {\n return o.map(stringifyBigInts);\n } else if (typeof o == \"object\") {\n const res = {};\n const keys = Object.keys(o);\n keys.forEach((k) => {\n res[k] = stringifyBigInts(o[k]);\n });\n return res;\n } else {\n return o;\n }\n}\n\nexport function unstringifyBigInts(o) {\n if (typeof o == \"string\" && /^[0-9]+$/.test(o)) {\n return BigInt(o);\n } else if (typeof o == \"string\" && /^0x[0-9a-fA-F]+$/.test(o)) {\n return BigInt(o);\n } else if (Array.isArray(o)) {\n return o.map(unstringifyBigInts);\n } else if (typeof o == \"object\") {\n if (o === null) return null;\n const res = {};\n const keys = Object.keys(o);\n keys.forEach((k) => {\n res[k] = unstringifyBigInts(o[k]);\n });\n return res;\n } else {\n return o;\n }\n}\n\nexport function beBuff2int(buff) {\n let res = BigInt(0);\n let i = buff.length;\n let offset = 0;\n const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength);\n while (i > 0) {\n if (i >= 4) {\n i -= 4;\n res += BigInt(buffV.getUint32(i)) << BigInt(offset * 8);\n offset += 4;\n } else if (i >= 2) {\n i -= 2;\n res += BigInt(buffV.getUint16(i)) << BigInt(offset * 8);\n offset += 2;\n } else {\n i -= 1;\n res += BigInt(buffV.getUint8(i)) << BigInt(offset * 8);\n offset += 1;\n }\n }\n return res;\n}\n\nexport function beInt2Buff(n, len) {\n let r = n;\n const buff = new Uint8Array(len);\n const buffV = new DataView(buff.buffer);\n let o = len;\n while (o > 0) {\n if (o - 4 >= 0) {\n o -= 4;\n buffV.setUint32(o, Number(r & BigInt(0xffffffff)));\n r = r >> BigInt(32);\n } else if (o - 2 >= 0) {\n o -= 2;\n buffV.setUint16(o, Number(r & BigInt(0xffff)));\n r = r >> BigInt(16);\n } else {\n o -= 1;\n buffV.setUint8(o, Number(r & BigInt(0xff)));\n r = r >> BigInt(8);\n }\n }\n if (r) {\n throw new Error(\"Number does not fit in this length\");\n }\n return buff;\n}\n\nexport function leBuff2int(buff) {\n let res = BigInt(0);\n let i = 0;\n const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength);\n while (i < buff.length) {\n if (i + 4 <= buff.length) {\n res += BigInt(buffV.getUint32(i, true)) << BigInt(i * 8);\n i += 4;\n } else if (i + 2 <= buff.length) {\n res += BigInt(buffV.getUint16(i, true)) << BigInt(i * 8);\n i += 2;\n } else {\n res += BigInt(buffV.getUint8(i, true)) << BigInt(i * 8);\n i += 1;\n }\n }\n return res;\n}\n\nexport function leInt2Buff(n, len) {\n let r = n;\n if (typeof len === \"undefined\") {\n len = Math.floor((Scalar.bitLength(n) - 1) / 8) + 1;\n if (len == 0) len = 1;\n }\n const buff = new Uint8Array(len);\n const buffV = new DataView(buff.buffer);\n let o = 0;\n while (o < len) {\n if (o + 4 <= len) {\n buffV.setUint32(o, Number(r & BigInt(0xffffffff)), true);\n o += 4;\n r = r >> BigInt(32);\n } else if (o + 2 <= len) {\n buffV.setUint16(o, Number(r & BigInt(0xffff)), true);\n o += 2;\n r = r >> BigInt(16);\n } else {\n buffV.setUint8(o, Number(r & BigInt(0xff)), true);\n o += 1;\n r = r >> BigInt(8);\n }\n }\n if (r) {\n throw new Error(\"Number does not fit in this length\");\n }\n return buff;\n}\n\nexport function stringifyFElements(F, o) {\n if (typeof o == \"bigint\" || o.eq !== undefined) {\n return o.toString(10);\n } else if (o instanceof Uint8Array) {\n return F.toString(F.e(o));\n } else if (Array.isArray(o)) {\n return o.map(stringifyFElements.bind(this, F));\n } else if (typeof o == \"object\") {\n const res = {};\n const keys = Object.keys(o);\n keys.forEach((k) => {\n res[k] = stringifyFElements(F, o[k]);\n });\n return res;\n } else {\n return o;\n }\n}\n\nexport function unstringifyFElements(F, o) {\n if (typeof o == \"string\" && /^[0-9]+$/.test(o)) {\n return F.e(o);\n } else if (typeof o == \"string\" && /^0x[0-9a-fA-F]+$/.test(o)) {\n return F.e(o);\n } else if (Array.isArray(o)) {\n return o.map(unstringifyFElements.bind(this, F));\n } else if (typeof o == \"object\") {\n if (o === null) return null;\n const res = {};\n const keys = Object.keys(o);\n keys.forEach((k) => {\n res[k] = unstringifyFElements(F, o[k]);\n });\n return res;\n } else {\n return o;\n }\n}\n\nconst _revTable = [];\nfor (let i = 0; i < 256; i++) {\n _revTable[i] = _revSlow(i, 8);\n}\n\nfunction _revSlow(idx, bits) {\n let res = 0;\n let a = idx;\n for (let i = 0; i < bits; i++) {\n res <<= 1;\n res = res | (a & 1);\n a >>= 1;\n }\n return res;\n}\n\nexport function bitReverse(idx, bits) {\n return (\n (_revTable[idx >>> 24] |\n (_revTable[(idx >>> 16) & 0xff] << 8) |\n (_revTable[(idx >>> 8) & 0xff] << 16) |\n (_revTable[idx & 0xff] << 24)) >>>\n (32 - bits)\n );\n}\n\nexport function log2(V) {\n return (\n ((V & 0xffff0000) !== 0 ? ((V &= 0xffff0000), 16) : 0) |\n ((V & 0xff00ff00) !== 0 ? ((V &= 0xff00ff00), 8) : 0) |\n ((V & 0xf0f0f0f0) !== 0 ? ((V &= 0xf0f0f0f0), 4) : 0) |\n ((V & 0xcccccccc) !== 0 ? ((V &= 0xcccccccc), 2) : 0) |\n ((V & 0xaaaaaaaa) !== 0)\n );\n}\n\nexport function buffReverseBits(buff, eSize) {\n const n = buff.byteLength / eSize;\n const bits = log2(n);\n if (n != 1 << bits) {\n throw new Error(\"Invalid number of pointers\");\n }\n for (let i = 0; i < n; i++) {\n const r = bitReverse(i, bits);\n if (i > r) {\n const tmp = buff.slice(i * eSize, (i + 1) * eSize);\n buff.set(buff.slice(r * eSize, (r + 1) * eSize), i * eSize);\n buff.set(tmp, r * eSize);\n }\n }\n}\n\nexport function array2buffer(arr, sG) {\n const buff = new Uint8Array(sG * arr.length);\n\n for (let i = 0; i < arr.length; i++) {\n buff.set(arr[i], i * sG);\n }\n\n return buff;\n}\n\nexport function buffer2array(buff, sG) {\n const n = buff.byteLength / sG;\n const arr = new Array(n);\n for (let i = 0; i < n; i++) {\n arr[i] = buff.slice(i * sG, i * sG + sG);\n }\n return arr;\n}\n","\nconst PAGE_SIZE = ( typeof Buffer !== \"undefined\" && Buffer.constants && Buffer.constants.MAX_LENGTH ) ? Buffer.constants.MAX_LENGTH : (1 << 30);\n\nexport default class BigBuffer {\n\n constructor(size) {\n this.buffers = [];\n this.byteLength = size;\n for (let i=0; i0) {\n // bytes to copy from this page\n const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r;\n const srcView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset+o, l);\n if (l == len) return srcView.slice();\n if (!buff) {\n if (len <= PAGE_SIZE) {\n buff = new Uint8Array(len);\n } else {\n buff = new BigBuffer(len);\n }\n }\n buff.set(srcView, len-r);\n r = r-l;\n p ++;\n o = 0;\n }\n\n return buff;\n }\n\n set(buff, offset) {\n if (offset === undefined) offset = 0;\n\n const len = buff.byteLength;\n\n if (len==0) return;\n\n const firstPage = Math.floor(offset / PAGE_SIZE);\n const lastPage = Math.floor((offset+len-1) / PAGE_SIZE);\n\n if (firstPage == lastPage) {\n if ((buff instanceof BigBuffer)&&(buff.buffers.length==1)) {\n return this.buffers[firstPage].set(buff.buffers[0], offset % PAGE_SIZE);\n } else {\n return this.buffers[firstPage].set(buff, offset % PAGE_SIZE);\n }\n\n }\n\n\n let p = firstPage;\n let o = offset % PAGE_SIZE;\n let r = len;\n while (r>0) {\n const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r;\n const srcView = buff.slice( len -r, len -r+l);\n const dstView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset + o, l);\n dstView.set(srcView);\n r = r-l;\n p ++;\n o = 0;\n }\n\n }\n}\n","import BigBuffer from \"./bigbuffer.js\";\n\nexport default function buildBatchConvert(tm, fnName, sIn, sOut) {\n return async function batchConvert(buffIn) {\n const nPoints = Math.floor(buffIn.byteLength / sIn);\n if ( nPoints * sIn !== buffIn.byteLength) {\n throw new Error(\"Invalid buffer size\");\n }\n const pointsPerChunk = Math.floor(nPoints/tm.concurrency);\n const opPromises = [];\n for (let i=0; i=0; i--) {\n this.w[i] = this.square(this.w[i+1]);\n }\n\n if (!this.eq(this.w[0], this.one)) {\n throw new Error(\"Error calculating roots of unity\");\n }\n\n this.batchToMontgomery = buildBatchConvert(tm, prefix + \"_batchToMontgomery\", this.n8, this.n8);\n this.batchFromMontgomery = buildBatchConvert(tm, prefix + \"_batchFromMontgomery\", this.n8, this.n8);\n }\n\n\n op2(opName, a, b) {\n this.tm.setBuff(this.pOp1, a);\n this.tm.setBuff(this.pOp2, b);\n this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3);\n return this.tm.getBuff(this.pOp3, this.n8);\n }\n\n op2Bool(opName, a, b) {\n this.tm.setBuff(this.pOp1, a);\n this.tm.setBuff(this.pOp2, b);\n return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2);\n }\n\n op1(opName, a) {\n this.tm.setBuff(this.pOp1, a);\n this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3);\n return this.tm.getBuff(this.pOp3, this.n8);\n }\n\n op1Bool(opName, a) {\n this.tm.setBuff(this.pOp1, a);\n return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3);\n }\n\n add(a,b) {\n return this.op2(\"_add\", a, b);\n }\n\n\n eq(a,b) {\n return this.op2Bool(\"_eq\", a, b);\n }\n\n isZero(a) {\n return this.op1Bool(\"_isZero\", a);\n }\n\n sub(a,b) {\n return this.op2(\"_sub\", a, b);\n }\n\n neg(a) {\n return this.op1(\"_neg\", a);\n }\n\n inv(a) {\n return this.op1(\"_inverse\", a);\n }\n\n toMontgomery(a) {\n return this.op1(\"_toMontgomery\", a);\n }\n\n fromMontgomery(a) {\n return this.op1(\"_fromMontgomery\", a);\n }\n\n mul(a,b) {\n return this.op2(\"_mul\", a, b);\n }\n\n div(a, b) {\n this.tm.setBuff(this.pOp1, a);\n this.tm.setBuff(this.pOp2, b);\n this.tm.instance.exports[this.prefix + \"_inverse\"](this.pOp2, this.pOp2);\n this.tm.instance.exports[this.prefix + \"_mul\"](this.pOp1, this.pOp2, this.pOp3);\n return this.tm.getBuff(this.pOp3, this.n8);\n }\n\n square(a) {\n return this.op1(\"_square\", a);\n }\n\n isSquare(a) {\n return this.op1Bool(\"_isSquare\", a);\n }\n\n sqrt(a) {\n return this.op1(\"_sqrt\", a);\n }\n\n exp(a, b) {\n if (!(b instanceof Uint8Array)) {\n b = Scalar.toLEBuff(Scalar.e(b));\n }\n this.tm.setBuff(this.pOp1, a);\n this.tm.setBuff(this.pOp2, b);\n this.tm.instance.exports[this.prefix + \"_exp\"](this.pOp1, this.pOp2, b.byteLength, this.pOp3);\n return this.tm.getBuff(this.pOp3, this.n8);\n }\n\n isNegative(a) {\n return this.op1Bool(\"_isNegative\", a);\n }\n\n e(a, b) {\n if (a instanceof Uint8Array) return a;\n let ra = Scalar.e(a, b);\n if (Scalar.isNegative(ra)) {\n ra = Scalar.neg(ra);\n if (Scalar.gt(ra, this.p)) {\n ra = Scalar.mod(ra, this.p);\n }\n ra = Scalar.sub(this.p, ra);\n } else {\n if (Scalar.gt(ra, this.p)) {\n ra = Scalar.mod(ra, this.p);\n }\n }\n const buff = utils.leInt2Buff(ra, this.n8);\n return this.toMontgomery(buff);\n }\n\n toString(a, radix) {\n const an = this.fromMontgomery(a);\n const s = Scalar.fromRprLE(an, 0);\n return Scalar.toString(s, radix);\n }\n\n fromRng(rng) {\n let v;\n const buff = new Uint8Array(this.n8);\n do {\n v = Scalar.zero;\n for (let i=0; i memory.buffer.byteLength) {\n const currentPages = memory.buffer.byteLength / 0x10000;\n let requiredPages = Math.floor((u32[0] + length) / 0x10000) + 1;\n if (requiredPages > MAXMEM) requiredPages = MAXMEM;\n memory.grow(requiredPages - currentPages);\n // memory.buffer changed — cached views are now stale.\n }\n return res;\n }\n\n function allocBuffer(buffer) {\n const src = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const p = alloc(src.byteLength);\n // getU8() handles re-creation if alloc() triggered a grow.\n getU8().set(src, p);\n return p;\n }\n\n function getBuffer(pointer, length) {\n return new Uint8Array(memory.buffer, pointer, length);\n }\n\n function setBuffer(pointer, buffer) {\n getU8().set(buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer), pointer);\n }\n\n function runTask(task) {\n if (task[0].cmd === \"INIT\") {\n // INIT is the only async path — return a Promise so workerpool\n // can await it; all other tasks execute synchronously to prevent\n // concurrent execution of tasks within the same worker.\n return init(task[0]);\n }\n const vars = [];\n const out = [];\n const oldAlloc = getU32()[0];\n for (let i = 0; i < task.length; i++) {\n const step = task[i];\n switch (step.cmd) {\n case \"ALLOCSET\":\n vars[step.var] = allocBuffer(step.buff);\n break;\n case \"ALLOC\":\n vars[step.var] = alloc(step.len);\n break;\n case \"SET\":\n setBuffer(vars[step.var], step.buff);\n break;\n case \"CALL\": {\n const paramDefs = step.params;\n const params = new Array(paramDefs.length);\n for (let j = 0; j < paramDefs.length; j++) {\n const p = paramDefs[j];\n params[j] = p.var !== undefined\n ? vars[p.var] + (p.offset || 0)\n : p.val;\n }\n instance.exports[step.fnName](...params);\n break;\n }\n case \"GET\":\n out[step.out] = getBuffer(vars[step.var], step.len).slice();\n break;\n default:\n throw new Error(\"Invalid cmd: \" + step.cmd);\n }\n }\n // Reclaim task-local allocations. getU32() handles a post-grow buffer.\n getU32()[0] = oldAlloc;\n return out;\n }\n\n return runTask;\n}\n","/**\n * workerpool.js\n * https://github.com/josdejong/workerpool\n *\n * Offload tasks to a pool of workers on node.js and in the browser.\n *\n * @version 10.0.1\n * @date 2025-11-19\n *\n * @license\n * Copyright (C) 2014-2022 Jos de Jong \n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy\n * of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.workerpool = {}));\n})(this, (function (exports) { 'use strict';\n\n var src = {};\n\n var environment$1 = {exports: {}};\n\n (function (module) {\n // source: https://github.com/flexdinesh/browser-or-node\n // source: https://github.com/mozilla/pdf.js/blob/7ea0e40e588864cd938d1836ec61f1928d3877d3/src/shared/util.js#L24\n var isNode = function isNode(nodeProcess) {\n return typeof nodeProcess !== 'undefined' && nodeProcess.versions != null && nodeProcess.versions.node != null && nodeProcess + '' === '[object process]';\n };\n module.exports.isNode = isNode;\n\n // determines the JavaScript platform: browser or node\n module.exports.platform = typeof process !== 'undefined' && isNode(process) ? 'node' : 'browser';\n\n // determines whether the code is running in main thread or not\n // note that in node.js we have to check both worker_thread and child_process\n var worker_threads = module.exports.platform === 'node' && require('worker_threads');\n module.exports.isMainThread = module.exports.platform === 'node' ? (!worker_threads || worker_threads.isMainThread) && !process.connected : typeof Window !== 'undefined';\n\n // determines the number of cpus available\n module.exports.cpus = module.exports.platform === 'browser' ? self.navigator.hardwareConcurrency : require('os').cpus().length;\n })(environment$1);\n var environmentExports = environment$1.exports;\n\n function _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n }\n function _assertThisInitialized(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n }\n function _callSuper(t, o, e) {\n return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e));\n }\n function _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n }\n function _construct(t, e, r) {\n if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments);\n var o = [null];\n o.push.apply(o, e);\n var p = new (t.bind.apply(t, o))();\n return r && _setPrototypeOf(p, r.prototype), p;\n }\n function _createClass(e, r, t) {\n return Object.defineProperty(e, \"prototype\", {\n writable: false\n }), e;\n }\n function _createForOfIteratorHelper(r, e) {\n var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (!t) {\n if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) {\n t && (r = t);\n var n = 0,\n F = function () {};\n return {\n s: F,\n n: function () {\n return n >= r.length ? {\n done: true\n } : {\n done: false,\n value: r[n++]\n };\n },\n e: function (r) {\n throw r;\n },\n f: F\n };\n }\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n var o,\n a = true,\n u = false;\n return {\n s: function () {\n t = t.call(r);\n },\n n: function () {\n var r = t.next();\n return a = r.done, r;\n },\n e: function (r) {\n u = true, o = r;\n },\n f: function () {\n try {\n a || null == t.return || t.return();\n } finally {\n if (u) throw o;\n }\n }\n };\n }\n function _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: true,\n configurable: true,\n writable: true\n }) : e[r] = t, e;\n }\n function _getPrototypeOf(t) {\n return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, _getPrototypeOf(t);\n }\n function _inherits(t, e) {\n if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n t.prototype = Object.create(e && e.prototype, {\n constructor: {\n value: t,\n writable: true,\n configurable: true\n }\n }), Object.defineProperty(t, \"prototype\", {\n writable: false\n }), e && _setPrototypeOf(t, e);\n }\n function _isNativeFunction(t) {\n try {\n return -1 !== Function.toString.call(t).indexOf(\"[native code]\");\n } catch (n) {\n return \"function\" == typeof t;\n }\n }\n function _isNativeReflectConstruct() {\n try {\n var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n } catch (t) {}\n return (_isNativeReflectConstruct = function () {\n return !!t;\n })();\n }\n function ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n }\n function _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), true).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n }\n function _possibleConstructorReturn(t, e) {\n if (e && (\"object\" == typeof e || \"function\" == typeof e)) return e;\n if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n return _assertThisInitialized(t);\n }\n function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n }\n function _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r);\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n }\n function _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n }\n function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n }\n function _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n }\n function _wrapNativeSuper(t) {\n var r = \"function\" == typeof Map ? new Map() : void 0;\n return _wrapNativeSuper = function (t) {\n if (null === t || !_isNativeFunction(t)) return t;\n if (\"function\" != typeof t) throw new TypeError(\"Super expression must either be null or a function\");\n if (void 0 !== r) {\n if (r.has(t)) return r.get(t);\n r.set(t, Wrapper);\n }\n function Wrapper() {\n return _construct(t, arguments, _getPrototypeOf(this).constructor);\n }\n return Wrapper.prototype = Object.create(t.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n }), _setPrototypeOf(Wrapper, t);\n }, _wrapNativeSuper(t);\n }\n\n var WorkerHandler$1 = {exports: {}};\n\n var _Promise$1 = {};\n\n var hasRequired_Promise;\n function require_Promise() {\n if (hasRequired_Promise) return _Promise$1;\n hasRequired_Promise = 1;\n\n /**\n * Promise\n *\n * Inspired by https://gist.github.com/RubaXa/8501359 from RubaXa \n * @template T\n * @template [E=Error]\n * @param {Function} handler Called as handler(resolve: Function, reject: Function)\n * @param {Promise} [parent] Parent promise for propagation of cancel and timeout\n */\n function Promise(handler, parent) {\n var me = this;\n if (!(this instanceof Promise)) {\n throw new SyntaxError('Constructor must be called with the new operator');\n }\n if (typeof handler !== 'function') {\n throw new SyntaxError('Function parameter handler(resolve, reject) missing');\n }\n var _onSuccess = [];\n var _onFail = [];\n\n // status\n /**\n * @readonly\n */\n this.resolved = false;\n /**\n * @readonly\n */\n this.rejected = false;\n /**\n * @readonly\n */\n this.pending = true;\n /**\n * @readonly\n */\n this[Symbol.toStringTag] = 'Promise';\n\n /**\n * Process onSuccess and onFail callbacks: add them to the queue.\n * Once the promise is resolved, the function _promise is replace.\n * @param {Function} onSuccess\n * @param {Function} onFail\n * @private\n */\n var _process = function _process(onSuccess, onFail) {\n _onSuccess.push(onSuccess);\n _onFail.push(onFail);\n };\n\n /**\n * Add an onSuccess callback and optionally an onFail callback to the Promise\n * @template TT\n * @template [TE=never]\n * @param {(r: T) => TT | PromiseLike} onSuccess\n * @param {(r: E) => TE | PromiseLike} [onFail]\n * @returns {Promise} promise\n */\n this.then = function (onSuccess, onFail) {\n return new Promise(function (resolve, reject) {\n var s = onSuccess ? _then(onSuccess, resolve, reject) : resolve;\n var f = onFail ? _then(onFail, resolve, reject) : reject;\n _process(s, f);\n }, me);\n };\n\n /**\n * Resolve the promise\n * @param {*} result\n * @type {Function}\n */\n var _resolve2 = function _resolve(result) {\n // update status\n me.resolved = true;\n me.rejected = false;\n me.pending = false;\n _onSuccess.forEach(function (fn) {\n fn(result);\n });\n _process = function _process(onSuccess, onFail) {\n onSuccess(result);\n };\n _resolve2 = _reject2 = function _reject() {};\n return me;\n };\n\n /**\n * Reject the promise\n * @param {Error} error\n * @type {Function}\n */\n var _reject2 = function _reject(error) {\n // update status\n me.resolved = false;\n me.rejected = true;\n me.pending = false;\n _onFail.forEach(function (fn) {\n fn(error);\n });\n _process = function _process(onSuccess, onFail) {\n onFail(error);\n };\n _resolve2 = _reject2 = function _reject() {};\n return me;\n };\n\n /**\n * Cancel the promise. This will reject the promise with a CancellationError\n * @returns {this} self\n */\n this.cancel = function () {\n if (parent) {\n parent.cancel();\n } else {\n _reject2(new CancellationError());\n }\n return me;\n };\n\n /**\n * Set a timeout for the promise. If the promise is not resolved within\n * the time, the promise will be cancelled and a TimeoutError is thrown.\n * If the promise is resolved in time, the timeout is removed.\n * @param {number} delay Delay in milliseconds\n * @returns {this} self\n */\n this.timeout = function (delay) {\n if (parent) {\n parent.timeout(delay);\n } else {\n var timer = setTimeout(function () {\n _reject2(new TimeoutError('Promise timed out after ' + delay + ' ms'));\n }, delay);\n me.always(function () {\n clearTimeout(timer);\n });\n }\n return me;\n };\n\n // attach handler passing the resolve and reject functions\n handler(function (result) {\n _resolve2(result);\n }, function (error) {\n _reject2(error);\n });\n }\n\n /**\n * Execute given callback, then call resolve/reject based on the returned result\n * @param {Function} callback\n * @param {Function} resolve\n * @param {Function} reject\n * @returns {Function}\n * @private\n */\n function _then(callback, resolve, reject) {\n return function (result) {\n try {\n var res = callback(result);\n if (res && typeof res.then === 'function' && typeof res['catch'] === 'function') {\n // method returned a promise\n res.then(resolve, reject);\n } else {\n resolve(res);\n }\n } catch (error) {\n reject(error);\n }\n };\n }\n\n /**\n * Add an onFail callback to the Promise\n * @template TT\n * @param {(error: E) => TT | PromiseLike} onFail\n * @returns {Promise} promise\n */\n Promise.prototype['catch'] = function (onFail) {\n return this.then(null, onFail);\n };\n\n // TODO: add support for Promise.catch(Error, callback)\n // TODO: add support for Promise.catch(Error, Error, callback)\n\n /**\n * Execute given callback when the promise either resolves or rejects.\n * @template TT\n * @param {() => Promise} fn\n * @returns {Promise} promise\n */\n Promise.prototype.always = function (fn) {\n return this.then(fn, fn);\n };\n\n /**\n * Execute given callback when the promise either resolves or rejects.\n * Same semantics as Node's Promise.finally()\n * @param {Function | null | undefined} [fn]\n * @returns {Promise} promise\n */\n Promise.prototype.finally = function (fn) {\n var me = this;\n var final = function final() {\n return new Promise(function (resolve) {\n return resolve();\n }).then(fn).then(function () {\n return me;\n });\n };\n return this.then(final, final);\n };\n\n /**\n * Create a promise which resolves when all provided promises are resolved,\n * and fails when any of the promises resolves.\n * @param {Promise[]} promises\n * @returns {Promise} promise\n */\n Promise.all = function (promises) {\n return new Promise(function (resolve, reject) {\n var remaining = promises.length,\n results = [];\n if (remaining) {\n promises.forEach(function (p, i) {\n p.then(function (result) {\n results[i] = result;\n remaining--;\n if (remaining == 0) {\n resolve(results);\n }\n }, function (error) {\n remaining = 0;\n reject(error);\n });\n });\n } else {\n resolve(results);\n }\n });\n };\n\n /**\n * Create a promise resolver\n * @returns {import('./types.js').Resolver} resolver\n */\n Promise.defer = function () {\n var resolver = {};\n resolver.promise = new Promise(function (resolve, reject) {\n resolver.resolve = resolve;\n resolver.reject = reject;\n });\n return resolver;\n };\n\n /**\n * Create a cancellation error\n * @param {String} [message]\n * @extends Error\n */\n function CancellationError(message) {\n this.message = message || 'promise cancelled';\n this.stack = new Error().stack;\n }\n CancellationError.prototype = new Error();\n CancellationError.prototype.constructor = Error;\n CancellationError.prototype.name = 'CancellationError';\n Promise.CancellationError = CancellationError;\n\n /**\n * Create a timeout error\n * @param {String} [message]\n * @extends Error\n */\n function TimeoutError(message) {\n this.message = message || 'timeout exceeded';\n this.stack = new Error().stack;\n }\n TimeoutError.prototype = new Error();\n TimeoutError.prototype.constructor = Error;\n TimeoutError.prototype.name = 'TimeoutError';\n Promise.TimeoutError = TimeoutError;\n _Promise$1.Promise = Promise;\n return _Promise$1;\n }\n\n var validateOptions$1 = {};\n\n /**\n * Validate that the object only contains known option names\n * - Throws an error when unknown options are detected\n * - Throws an error when some of the allowed options are attached\n * @param {Object | undefined} options\n * @param {string[]} allowedOptionNames\n * @param {string} objectName\n * @retrun {Object} Returns the original options\n */\n validateOptions$1.validateOptions = function validateOptions(options, allowedOptionNames, objectName) {\n if (!options) {\n return;\n }\n var optionNames = options ? Object.keys(options) : [];\n\n // check for unknown properties\n var unknownOptionName = optionNames.find(function (optionName) {\n return !allowedOptionNames.includes(optionName);\n });\n if (unknownOptionName) {\n throw new Error('Object \"' + objectName + '\" contains an unknown option \"' + unknownOptionName + '\"');\n }\n\n // check for inherited properties which are not present on the object itself\n var illegalOptionName = allowedOptionNames.find(function (allowedOptionName) {\n return Object.prototype[allowedOptionName] && !optionNames.includes(allowedOptionName);\n });\n if (illegalOptionName) {\n throw new Error('Object \"' + objectName + '\" contains an inherited option \"' + illegalOptionName + '\" which is ' + 'not defined in the object itself but in its prototype. Only plain objects are allowed. ' + 'Please remove the option from the prototype or override it with a value \"undefined\".');\n }\n return options;\n };\n\n // source: https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker\n validateOptions$1.workerOptsNames = ['credentials', 'name', 'type'];\n\n // source: https://nodejs.org/api/child_process.html#child_processforkmodulepath-args-options\n validateOptions$1.forkOptsNames = ['cwd', 'detached', 'env', 'execPath', 'execArgv', 'gid', 'serialization', 'signal', 'killSignal', 'silent', 'stdio', 'uid', 'windowsVerbatimArguments', 'timeout'];\n\n // source: https://nodejs.org/api/worker_threads.html#new-workerfilename-options\n validateOptions$1.workerThreadOptsNames = ['argv', 'env', 'eval', 'execArgv', 'stdin', 'stdout', 'stderr', 'workerData', 'trackUnmanagedFds', 'transferList', 'resourceLimits', 'name'];\n\n /**\n * embeddedWorker.js contains an embedded version of worker.js.\n * This file is automatically generated,\n * changes made in this file will be overwritten.\n */\n var embeddedWorker;\n var hasRequiredEmbeddedWorker;\n function requireEmbeddedWorker() {\n if (hasRequiredEmbeddedWorker) return embeddedWorker;\n hasRequiredEmbeddedWorker = 1;\n embeddedWorker = \"!function(e,n){\\\"object\\\"==typeof exports&&\\\"undefined\\\"!=typeof module?module.exports=n():\\\"function\\\"==typeof define&&define.amd?define(n):(e=\\\"undefined\\\"!=typeof globalThis?globalThis:e||self).worker=n()}(this,(function(){\\\"use strict\\\";function e(n){return e=\\\"function\\\"==typeof Symbol&&\\\"symbol\\\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\\\"function\\\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\\\"symbol\\\":typeof e},e(n)}function n(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\\\"default\\\")?e.default:e}var t={};var r=function(e,n){this.message=e,this.transfer=n},o={};function i(e,n){var t=this;if(!(this instanceof i))throw new SyntaxError(\\\"Constructor must be called with the new operator\\\");if(\\\"function\\\"!=typeof e)throw new SyntaxError(\\\"Function parameter handler(resolve, reject) missing\\\");var r=[],o=[];this.resolved=!1,this.rejected=!1,this.pending=!0,this[Symbol.toStringTag]=\\\"Promise\\\";var a=function(e,n){r.push(e),o.push(n)};this.then=function(e,n){return new i((function(t,r){var o=e?s(e,t,r):t,i=n?s(n,t,r):r;a(o,i)}),t)};var f=function(e){return t.resolved=!0,t.rejected=!1,t.pending=!1,r.forEach((function(n){n(e)})),a=function(n,t){n(e)},f=d=function(){},t},d=function(e){return t.resolved=!1,t.rejected=!0,t.pending=!1,o.forEach((function(n){n(e)})),a=function(n,t){t(e)},f=d=function(){},t};this.cancel=function(){return n?n.cancel():d(new u),t},this.timeout=function(e){if(n)n.timeout(e);else{var r=setTimeout((function(){d(new c(\\\"Promise timed out after \\\"+e+\\\" ms\\\"))}),e);t.always((function(){clearTimeout(r)}))}return t},e((function(e){f(e)}),(function(e){d(e)}))}function s(e,n,t){return function(r){try{var o=e(r);o&&\\\"function\\\"==typeof o.then&&\\\"function\\\"==typeof o.catch?o.then(n,t):n(o)}catch(e){t(e)}}}function u(e){this.message=e||\\\"promise cancelled\\\",this.stack=(new Error).stack}function c(e){this.message=e||\\\"timeout exceeded\\\",this.stack=(new Error).stack}return i.prototype.catch=function(e){return this.then(null,e)},i.prototype.always=function(e){return this.then(e,e)},i.prototype.finally=function(e){var n=this,t=function(){return new i((function(e){return e()})).then(e).then((function(){return n}))};return this.then(t,t)},i.all=function(e){return new i((function(n,t){var r=e.length,o=[];r?e.forEach((function(e,i){e.then((function(e){o[i]=e,0==--r&&n(o)}),(function(e){r=0,t(e)}))})):n(o)}))},i.defer=function(){var e={};return e.promise=new i((function(n,t){e.resolve=n,e.reject=t})),e},u.prototype=new Error,u.prototype.constructor=Error,u.prototype.name=\\\"CancellationError\\\",i.CancellationError=u,c.prototype=new Error,c.prototype.constructor=Error,c.prototype.name=\\\"TimeoutError\\\",i.TimeoutError=c,o.Promise=i,function(n){var t=r,i=o.Promise,s=\\\"__workerpool-cleanup__\\\",u={exit:function(){}},c={addAbortListener:function(e){u.abortListeners.push(e)},emit:u.emit};if(\\\"undefined\\\"!=typeof self&&\\\"function\\\"==typeof postMessage&&\\\"function\\\"==typeof addEventListener)u.on=function(e,n){addEventListener(e,(function(e){n(e.data)}))},u.send=function(e,n){n?postMessage(e,n):postMessage(e)};else{if(\\\"undefined\\\"==typeof process)throw new Error(\\\"Script must be executed as a worker\\\");var a;try{a=require(\\\"worker_threads\\\")}catch(n){if(\\\"object\\\"!==e(n)||null===n||\\\"MODULE_NOT_FOUND\\\"!==n.code)throw n}if(a&&null!==a.parentPort){var f=a.parentPort;u.send=f.postMessage.bind(f),u.on=f.on.bind(f),u.exit=process.exit.bind(process)}else u.on=process.on.bind(process),u.send=function(e){process.send(e)},u.on(\\\"disconnect\\\",(function(){process.exit(1)})),u.exit=process.exit.bind(process)}function d(e){return e&&e.toJSON?JSON.parse(JSON.stringify(e)):JSON.parse(JSON.stringify(e,Object.getOwnPropertyNames(e)))}function l(e){return e&&\\\"function\\\"==typeof e.then&&\\\"function\\\"==typeof e.catch}u.methods={},u.methods.run=function(e,n){var t=new Function(\\\"return (\\\"+e+\\\").apply(this, arguments);\\\");return t.worker=c,t.apply(t,n)},u.methods.methods=function(){return Object.keys(u.methods)},u.terminationHandler=void 0,u.abortListenerTimeout=1e3,u.abortListeners=[],u.terminateAndExit=function(e){var n=function(){u.exit(e)};if(!u.terminationHandler)return n();var t=u.terminationHandler(e);return l(t)?(t.then(n,n),t):(n(),new i((function(e,n){n(new Error(\\\"Worker terminating\\\"))})))},u.cleanup=function(e){if(!u.abortListeners.length)return u.send({id:e,method:s,error:d(new Error(\\\"Worker terminating\\\"))}),new i((function(e){e()}));var n,t=u.abortListeners.map((function(e){return e()})),r=new i((function(e,t){n=setTimeout((function(){t(new Error(\\\"Timeout occured waiting for abort handler, killing worker\\\"))}),u.abortListenerTimeout)})),o=i.all(t).then((function(){clearTimeout(n),u.abortListeners.length||(u.abortListeners=[])}),(function(){clearTimeout(n),u.exit()}));return new i((function(e,n){o.then(e,n),r.then(e,n)})).then((function(){u.send({id:e,method:s,error:null})}),(function(n){u.send({id:e,method:s,error:n?d(n):null})}))};var p=null;u.on(\\\"message\\\",(function(e){if(\\\"__workerpool-terminate__\\\"===e)return u.terminateAndExit(0);if(e.method===s)return u.cleanup(e.id);try{var n=u.methods[e.method];if(!n)throw new Error('Unknown method \\\"'+e.method+'\\\"');p=e.id;var r=n.apply(n,e.params);l(r)?r.then((function(n){n instanceof t?u.send({id:e.id,result:n.message,error:null},n.transfer):u.send({id:e.id,result:n,error:null}),p=null})).catch((function(n){u.send({id:e.id,result:null,error:d(n)}),p=null})):(r instanceof t?u.send({id:e.id,result:r.message,error:null},r.transfer):u.send({id:e.id,result:r,error:null}),p=null)}catch(n){u.send({id:e.id,result:null,error:d(n)})}})),u.register=function(e,n){if(e)for(var t in e)e.hasOwnProperty(t)&&(u.methods[t]=e[t],u.methods[t].worker=c);n&&(u.terminationHandler=n.onTerminate,u.abortListenerTimeout=n.abortListenerTimeout||1e3),u.send(\\\"ready\\\")},u.emit=function(e){if(p){if(e instanceof t)return void u.send({id:p,isEvent:!0,payload:e.message},e.transfer);u.send({id:p,isEvent:!0,payload:e})}},n.add=u.register,n.emit=u.emit}(t),n(t)}));\\n//# sourceMappingURL=worker.min.js.map\\n\";\n return embeddedWorker;\n }\n\n var _require$$$1 = require_Promise(),\n Promise$2 = _require$$$1.Promise;\n var environment = environmentExports;\n var validateOptions = validateOptions$1.validateOptions,\n forkOptsNames = validateOptions$1.forkOptsNames,\n workerThreadOptsNames = validateOptions$1.workerThreadOptsNames,\n workerOptsNames = validateOptions$1.workerOptsNames;\n\n /**\n * Special message sent by parent which causes a child process worker to terminate itself.\n * Not a \"message object\"; this string is the entire message.\n */\n var TERMINATE_METHOD_ID = '__workerpool-terminate__';\n\n /**\n * Special message by parent which causes a child process worker to perform cleaup\n * steps before determining if the child process worker should be terminated.\n */\n var CLEANUP_METHOD_ID = '__workerpool-cleanup__';\n function ensureWorkerThreads() {\n var WorkerThreads = tryRequireWorkerThreads();\n if (!WorkerThreads) {\n throw new Error('WorkerPool: workerType = \\'thread\\' is not supported, Node >= 11.7.0 required');\n }\n return WorkerThreads;\n }\n\n // check whether Worker is supported by the browser\n function ensureWebWorker() {\n // Workaround for a bug in PhantomJS (Or QtWebkit): https://github.com/ariya/phantomjs/issues/14534\n if (typeof Worker !== 'function' && ((typeof Worker === \"undefined\" ? \"undefined\" : _typeof(Worker)) !== 'object' || typeof Worker.prototype.constructor !== 'function')) {\n throw new Error('WorkerPool: Web Workers not supported');\n }\n }\n function tryRequireWorkerThreads() {\n try {\n return require('worker_threads');\n } catch (error) {\n if (_typeof(error) === 'object' && error !== null && error.code === 'MODULE_NOT_FOUND') {\n // no worker_threads available (old version of node.js)\n return null;\n } else {\n throw error;\n }\n }\n }\n\n // get the default worker script\n function getDefaultWorker() {\n if (environment.platform === 'browser') {\n // test whether the browser supports all features that we need\n if (typeof Blob === 'undefined') {\n throw new Error('Blob not supported by the browser');\n }\n if (!window.URL || typeof window.URL.createObjectURL !== 'function') {\n throw new Error('URL.createObjectURL not supported by the browser');\n }\n\n // use embedded worker.js\n var blob = new Blob([requireEmbeddedWorker()], {\n type: 'text/javascript'\n });\n return window.URL.createObjectURL(blob);\n } else {\n // use external worker.js in current directory\n return __dirname + '/worker.js';\n }\n }\n function setupWorker(script, options) {\n if (options.workerType === 'web') {\n // browser only\n ensureWebWorker();\n return setupBrowserWorker(script, options.workerOpts, Worker);\n } else if (options.workerType === 'thread') {\n // node.js only\n WorkerThreads = ensureWorkerThreads();\n return setupWorkerThreadWorker(script, WorkerThreads, options);\n } else if (options.workerType === 'process' || !options.workerType) {\n // node.js only\n return setupProcessWorker(script, resolveForkOptions(options), require('child_process'));\n } else {\n // options.workerType === 'auto' or undefined\n if (environment.platform === 'browser') {\n ensureWebWorker();\n return setupBrowserWorker(script, options.workerOpts, Worker);\n } else {\n // environment.platform === 'node'\n var WorkerThreads = tryRequireWorkerThreads();\n if (WorkerThreads) {\n return setupWorkerThreadWorker(script, WorkerThreads, options);\n } else {\n return setupProcessWorker(script, resolveForkOptions(options), require('child_process'));\n }\n }\n }\n }\n function setupBrowserWorker(script, workerOpts, Worker) {\n // validate the options right before creating the worker (not when creating the pool)\n validateOptions(workerOpts, workerOptsNames, 'workerOpts');\n\n // create the web worker\n var worker = new Worker(script, workerOpts);\n worker.isBrowserWorker = true;\n // add node.js API to the web worker\n worker.on = function (event, callback) {\n this.addEventListener(event, function (message) {\n callback(message.data);\n });\n };\n worker.send = function (message, transfer) {\n this.postMessage(message, transfer);\n };\n return worker;\n }\n function setupWorkerThreadWorker(script, WorkerThreads, options) {\n var _options$emitStdStrea, _options$emitStdStrea2;\n // validate the options right before creating the worker thread (not when creating the pool)\n validateOptions(options === null || options === void 0 ? void 0 : options.workerThreadOpts, workerThreadOptsNames, 'workerThreadOpts');\n var worker = new WorkerThreads.Worker(script, _objectSpread2({\n stdout: (_options$emitStdStrea = options === null || options === void 0 ? void 0 : options.emitStdStreams) !== null && _options$emitStdStrea !== void 0 ? _options$emitStdStrea : false,\n // pipe worker.STDOUT to process.STDOUT if not requested\n stderr: (_options$emitStdStrea2 = options === null || options === void 0 ? void 0 : options.emitStdStreams) !== null && _options$emitStdStrea2 !== void 0 ? _options$emitStdStrea2 : false\n }, options === null || options === void 0 ? void 0 : options.workerThreadOpts));\n worker.isWorkerThread = true;\n worker.send = function (message, transfer) {\n this.postMessage(message, transfer);\n };\n worker.kill = function () {\n this.terminate();\n return true;\n };\n worker.disconnect = function () {\n this.terminate();\n };\n if (options !== null && options !== void 0 && options.emitStdStreams) {\n worker.stdout.on('data', function (data) {\n return worker.emit(\"stdout\", data);\n });\n worker.stderr.on('data', function (data) {\n return worker.emit(\"stderr\", data);\n });\n }\n return worker;\n }\n function setupProcessWorker(script, options, child_process) {\n // validate the options right before creating the child process (not when creating the pool)\n validateOptions(options.forkOpts, forkOptsNames, 'forkOpts');\n\n // no WorkerThreads, fallback to sub-process based workers\n var worker = child_process.fork(script, options.forkArgs, options.forkOpts);\n\n // ignore transfer argument since it is not supported by process\n var send = worker.send;\n worker.send = function (message) {\n return send.call(worker, message);\n };\n if (options.emitStdStreams) {\n worker.stdout.on('data', function (data) {\n return worker.emit(\"stdout\", data);\n });\n worker.stderr.on('data', function (data) {\n return worker.emit(\"stderr\", data);\n });\n }\n worker.isChildProcess = true;\n return worker;\n }\n\n // add debug flags to child processes if the node inspector is active\n function resolveForkOptions(opts) {\n opts = opts || {};\n var processExecArgv = process.execArgv.join(' ');\n var inspectorActive = processExecArgv.indexOf('--inspect') !== -1;\n var debugBrk = processExecArgv.indexOf('--debug-brk') !== -1;\n var execArgv = [];\n if (inspectorActive) {\n execArgv.push('--inspect=' + opts.debugPort);\n if (debugBrk) {\n execArgv.push('--debug-brk');\n }\n }\n process.execArgv.forEach(function (arg) {\n if (arg.indexOf('--max-old-space-size') > -1) {\n execArgv.push(arg);\n }\n });\n return Object.assign({}, opts, {\n forkArgs: opts.forkArgs,\n forkOpts: Object.assign({}, opts.forkOpts, {\n execArgv: (opts.forkOpts && opts.forkOpts.execArgv || []).concat(execArgv),\n stdio: opts.emitStdStreams ? \"pipe\" : undefined\n })\n });\n }\n\n /**\n * Converts a serialized error to Error\n * @param {Object} obj Error that has been serialized and parsed to object\n * @return {Error} The equivalent Error.\n */\n function objectToError(obj) {\n var temp = new Error('');\n var props = Object.keys(obj);\n for (var i = 0; i < props.length; i++) {\n temp[props[i]] = obj[props[i]];\n }\n return temp;\n }\n function handleEmittedStdPayload(handler, payload) {\n // TODO: refactor if parallel task execution gets added\n Object.values(handler.processing).forEach(function (task) {\n var _task$options;\n return task === null || task === void 0 || (_task$options = task.options) === null || _task$options === void 0 ? void 0 : _task$options.on(payload);\n });\n Object.values(handler.tracking).forEach(function (task) {\n var _task$options2;\n return task === null || task === void 0 || (_task$options2 = task.options) === null || _task$options2 === void 0 ? void 0 : _task$options2.on(payload);\n });\n }\n\n /**\n * A WorkerHandler controls a single worker. This worker can be a child process\n * on node.js or a WebWorker in a browser environment.\n * @param {String} [script] If no script is provided, a default worker with a\n * function run will be created.\n * @param {import('./types.js').WorkerPoolOptions} [_options] See docs\n * @constructor\n */\n function WorkerHandler(script, _options) {\n var me = this;\n var options = _options || {};\n this.script = script || getDefaultWorker();\n this.worker = setupWorker(this.script, options);\n this.debugPort = options.debugPort;\n this.forkOpts = options.forkOpts;\n this.forkArgs = options.forkArgs;\n this.workerOpts = options.workerOpts;\n this.workerThreadOpts = options.workerThreadOpts;\n this.workerTerminateTimeout = options.workerTerminateTimeout;\n\n // The ready message is only sent if the worker.add method is called (And the default script is not used)\n if (!script) {\n this.worker.ready = true;\n }\n\n // queue for requests that are received before the worker is ready\n this.requestQueue = [];\n this.worker.on(\"stdout\", function (data) {\n handleEmittedStdPayload(me, {\n \"stdout\": data.toString()\n });\n });\n this.worker.on(\"stderr\", function (data) {\n handleEmittedStdPayload(me, {\n \"stderr\": data.toString()\n });\n });\n this.worker.on('message', function (response) {\n if (me.terminated) {\n return;\n }\n if (typeof response === 'string' && response === 'ready') {\n me.worker.ready = true;\n dispatchQueuedRequests();\n } else {\n // find the task from the processing queue, and run the tasks callback\n var id = response.id;\n var task = me.processing[id];\n if (task !== undefined) {\n if (response.isEvent) {\n if (task.options && typeof task.options.on === 'function') {\n task.options.on(response.payload);\n }\n } else {\n // remove the task from the queue\n delete me.processing[id];\n\n // test if we need to terminate\n if (me.terminating === true) {\n // complete worker termination if all tasks are finished\n me.terminate();\n }\n\n // resolve the task's promise\n if (response.error) {\n task.resolver.reject(objectToError(response.error));\n } else {\n task.resolver.resolve(response.result);\n }\n }\n } else {\n // if the task is not the current, it might be tracked for cleanup\n var task = me.tracking[id];\n if (task !== undefined) {\n if (response.isEvent) {\n if (task.options && typeof task.options.on === 'function') {\n task.options.on(response.payload);\n }\n }\n }\n }\n if (response.method === CLEANUP_METHOD_ID) {\n var trackedTask = me.tracking[response.id];\n if (trackedTask !== undefined) {\n if (response.error) {\n clearTimeout(trackedTask.timeoutId);\n trackedTask.resolver.reject(objectToError(response.error));\n } else {\n me.tracking && clearTimeout(trackedTask.timeoutId);\n // if we do not encounter an error wrap the the original timeout error and reject\n trackedTask.resolver.reject(new WrappedTimeoutError(trackedTask.error));\n }\n }\n delete me.tracking[id];\n }\n }\n });\n\n // reject all running tasks on worker error\n function onError(error) {\n me.terminated = true;\n for (var id in me.processing) {\n if (me.processing[id] !== undefined) {\n me.processing[id].resolver.reject(error);\n }\n }\n me.processing = Object.create(null);\n }\n\n // send all queued requests to worker\n function dispatchQueuedRequests() {\n var _iterator = _createForOfIteratorHelper(me.requestQueue.splice(0)),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var request = _step.value;\n me.worker.send(request.message, request.transfer);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n }\n var worker = this.worker;\n // listen for worker messages error and exit\n this.worker.on('error', function (error) {\n var message = error && error.message ? error.message : String(error || 'Unknown worker error');\n onError(new TerminateError$1('Workerpool Worker error: ' + message, error));\n });\n this.worker.on('exit', function (exitCode, signalCode) {\n var message = 'Workerpool Worker terminated Unexpectedly\\n';\n message += ' exitCode: `' + exitCode + '`\\n';\n message += ' signalCode: `' + signalCode + '`\\n';\n message += ' workerpool.script: `' + me.script + '`\\n';\n message += ' spawnArgs: `' + worker.spawnargs + '`\\n';\n message += ' spawnfile: `' + worker.spawnfile + '`\\n';\n message += ' stdout: `' + worker.stdout + '`\\n';\n message += ' stderr: `' + worker.stderr + '`\\n';\n onError(new TerminateError$1(message));\n });\n this.processing = Object.create(null); // queue with tasks currently in progress\n this.tracking = Object.create(null); // queue with tasks being monitored for cleanup status\n this.terminating = false;\n this.terminated = false;\n this.cleaning = false;\n this.terminationHandler = null;\n this.lastId = 0;\n }\n\n /**\n * Get a list with methods available on the worker.\n * @return {Promise.} methods\n */\n WorkerHandler.prototype.methods = function () {\n return this.exec('methods');\n };\n\n /**\n * Execute a method with given parameters on the worker\n * @param {String} method\n * @param {Array} [params]\n * @param {{resolve: Function, reject: Function}} [resolver]\n * @param {import('./types.js').ExecOptions} [options]\n * @return {Promise.<*, Error>} result\n */\n WorkerHandler.prototype.exec = function (method, params, resolver, options) {\n if (!resolver) {\n resolver = Promise$2.defer();\n }\n\n // generate a unique id for the task\n var id = ++this.lastId;\n\n // register a new task as being in progress\n this.processing[id] = {\n id: id,\n resolver: resolver,\n options: options\n };\n\n // build a JSON-RPC request\n var request = {\n message: {\n id: id,\n method: method,\n params: params\n },\n transfer: options && options.transfer\n };\n if (this.terminated) {\n resolver.reject(new TerminateError$1('Worker is terminated'));\n } else if (this.worker.ready) {\n // send the request to the worker\n this.worker.send(request.message, request.transfer);\n } else {\n this.requestQueue.push(request);\n }\n\n // on cancellation, force the worker to terminate\n var me = this;\n return resolver.promise.catch(function (error) {\n if (error instanceof Promise$2.CancellationError || error instanceof Promise$2.TimeoutError) {\n me.tracking[id] = {\n id: id,\n resolver: Promise$2.defer(),\n options: options,\n error: error\n };\n\n // remove this task from the queue. It is already rejected (hence this\n // catch event), and else it will be rejected again when terminating\n delete me.processing[id];\n me.tracking[id].resolver.promise = me.tracking[id].resolver.promise.catch(function (err) {\n delete me.tracking[id];\n\n // if we find the error is an instance of WrappedTimeoutError we know the error should not cause termination\n // as the response from the worker did not contain an error. We still wish to throw the original timeout error\n // to the caller.\n if (err instanceof WrappedTimeoutError) {\n throw err.error;\n }\n var promise = me.terminateAndNotify(true).then(function () {\n throw err;\n }, function (err) {\n throw err;\n });\n return promise;\n });\n me.worker.send({\n id: id,\n method: CLEANUP_METHOD_ID\n });\n\n /**\n * Sets a timeout to reject the cleanup operation if the message sent to the worker\n * does not receive a response. see worker.tryCleanup for worker cleanup operations.\n * Here we use the workerTerminateTimeout as the worker will be terminated if the timeout does invoke.\n * \n * We need this timeout in either case of a Timeout or Cancellation Error as if\n * the worker does not send a message we still need to give a window of time for a response.\n * \n * The workerTermniateTimeout is used here if this promise is rejected the worker cleanup\n * operations will occure.\n */\n me.tracking[id].timeoutId = setTimeout(function () {\n me.tracking[id].resolver.reject(error);\n }, me.workerTerminateTimeout);\n return me.tracking[id].resolver.promise;\n } else {\n throw error;\n }\n });\n };\n\n /**\n * Test whether the worker is processing any tasks or cleaning up before termination.\n * @return {boolean} Returns true if the worker is busy\n */\n WorkerHandler.prototype.busy = function () {\n return this.cleaning || Object.keys(this.processing).length > 0;\n };\n\n /**\n * Terminate the worker.\n * @param {boolean} [force=false] If false (default), the worker is terminated\n * after finishing all tasks currently in\n * progress. If true, the worker will be\n * terminated immediately.\n * @param {function} [callback=null] If provided, will be called when process terminates.\n */\n WorkerHandler.prototype.terminate = function (force, callback) {\n var me = this;\n if (force) {\n // cancel all tasks in progress\n for (var id in this.processing) {\n if (this.processing[id] !== undefined) {\n this.processing[id].resolver.reject(new Error('Worker terminated'));\n }\n }\n this.processing = Object.create(null);\n }\n\n // If we are terminating, cancel all tracked task for cleanup\n for (var _i = 0, _Object$values = Object.values(me.tracking); _i < _Object$values.length; _i++) {\n var task = _Object$values[_i];\n clearTimeout(task.timeoutId);\n task.resolver.reject(new Error('Worker Terminating'));\n }\n me.tracking = Object.create(null);\n if (typeof callback === 'function') {\n this.terminationHandler = callback;\n }\n if (!this.busy()) {\n // all tasks are finished. kill the worker\n var cleanup = function cleanup(err) {\n me.terminated = true;\n me.cleaning = false;\n if (me.worker != null && me.worker.removeAllListeners) {\n // removeAllListeners is only available for child_process\n me.worker.removeAllListeners('message');\n }\n me.worker = null;\n me.terminating = false;\n if (me.terminationHandler) {\n me.terminationHandler(err, me);\n } else if (err) {\n throw err;\n }\n };\n if (this.worker) {\n if (typeof this.worker.kill === 'function') {\n if (this.worker.killed) {\n cleanup(new Error('worker already killed!'));\n return;\n }\n\n // child process and worker threads\n var cleanExitTimeout = setTimeout(function () {\n if (me.worker) {\n me.worker.kill();\n }\n }, this.workerTerminateTimeout);\n this.worker.once('exit', function () {\n clearTimeout(cleanExitTimeout);\n if (me.worker) {\n me.worker.killed = true;\n }\n cleanup();\n });\n if (this.worker.ready) {\n this.worker.send(TERMINATE_METHOD_ID);\n } else {\n this.requestQueue.push({\n message: TERMINATE_METHOD_ID\n });\n }\n\n // mark that the worker is cleaning up resources\n // to prevent new tasks from being executed\n this.cleaning = true;\n return;\n } else if (typeof this.worker.terminate === 'function') {\n this.worker.terminate(); // web worker\n this.worker.killed = true;\n } else {\n throw new Error('Failed to terminate worker');\n }\n }\n cleanup();\n } else {\n // we can't terminate immediately, there are still tasks being executed\n this.terminating = true;\n }\n };\n\n /**\n * Terminate the worker, returning a Promise that resolves when the termination has been done.\n * @param {boolean} [force=false] If false (default), the worker is terminated\n * after finishing all tasks currently in\n * progress. If true, the worker will be\n * terminated immediately.\n * @param {number} [timeout] If provided and non-zero, worker termination promise will be rejected\n * after timeout if worker process has not been terminated.\n * @return {Promise.}\n */\n WorkerHandler.prototype.terminateAndNotify = function (force, timeout) {\n var resolver = Promise$2.defer();\n if (timeout) {\n resolver.promise.timeout(timeout);\n }\n this.terminate(force, function (err, worker) {\n if (err) {\n resolver.reject(err);\n } else {\n resolver.resolve(worker);\n }\n });\n return resolver.promise;\n };\n\n /**\n * Wrapper error type to denote that a TimeoutError has already been proceesed\n * and we should skip cleanup operations\n * @param {Promise.TimeoutError} timeoutError\n */\n function WrappedTimeoutError(timeoutError) {\n this.error = timeoutError;\n this.stack = new Error().stack;\n }\n var TerminateError$1 = /*#__PURE__*/function (_Error) {\n /**\n * Create a timeout error\n * @param {String} [message]\n * @param {Error=} [cause]\n */\n function TerminateError(message, cause) {\n var _this;\n _classCallCheck(this, TerminateError);\n _this = _callSuper(this, TerminateError, [message || 'worker terminated']);\n _this.cause = cause;\n return _this;\n }\n _inherits(TerminateError, _Error);\n return _createClass(TerminateError);\n }(/*#__PURE__*/_wrapNativeSuper(Error));\n WorkerHandler$1.exports = WorkerHandler;\n WorkerHandler$1.exports._tryRequireWorkerThreads = tryRequireWorkerThreads;\n WorkerHandler$1.exports._setupProcessWorker = setupProcessWorker;\n WorkerHandler$1.exports._setupBrowserWorker = setupBrowserWorker;\n WorkerHandler$1.exports._setupWorkerThreadWorker = setupWorkerThreadWorker;\n WorkerHandler$1.exports.ensureWorkerThreads = ensureWorkerThreads;\n WorkerHandler$1.exports.TerminateError = TerminateError$1;\n var WorkerHandlerExports = WorkerHandler$1.exports;\n\n /**\n * FIFO Queue implementation\n * @template [T=any]\n * @constructor\n * @implements {import('./types').TaskQueue}\n */\n var queues;\n var hasRequiredQueues;\n function requireQueues() {\n if (hasRequiredQueues) return queues;\n hasRequiredQueues = 1;\n function FIFOQueue() {\n /** @type {import('./types').Task[]} */\n this.tasks = [];\n }\n\n /**\n * @param {import('./types').Task} task\n * @returns {void}\n */\n FIFOQueue.prototype.push = function (task) {\n this.tasks.push(task);\n };\n\n /**\n * @returns {import('./types').Task | undefined}\n */\n FIFOQueue.prototype.pop = function () {\n return this.tasks.shift();\n };\n\n /**\n * @returns {number}\n */\n FIFOQueue.prototype.size = function () {\n return this.tasks.length;\n };\n\n /**\n * @param {import('./types').Task} task\n * @returns {boolean}\n */\n FIFOQueue.prototype.contains = function (task) {\n return this.tasks.includes(task);\n };\n\n /**\n * @returns {void}\n */\n FIFOQueue.prototype.clear = function () {\n this.tasks.length = 0;\n };\n\n /**\n * LIFO Queue implementation\n * @template [T=any]\n * @constructor\n * @implements {import('./types').TaskQueue}\n */\n function LIFOQueue() {\n /** @type {import('./types').Task[]} */\n this.tasks = [];\n }\n\n /**\n * @param {import('./types').Task} task\n * @returns {void}\n */\n LIFOQueue.prototype.push = function (task) {\n this.tasks.push(task);\n };\n\n /**\n * @returns {import('./types').Task | undefined}\n */\n LIFOQueue.prototype.pop = function () {\n return this.tasks.pop();\n };\n\n /**\n * @returns {number}\n */\n LIFOQueue.prototype.size = function () {\n return this.tasks.length;\n };\n\n /**\n * @param {import('./types').Task} task\n * @returns {boolean}\n */\n LIFOQueue.prototype.contains = function (task) {\n return this.tasks.includes(task);\n };\n\n /**\n * @returns {void}\n */\n LIFOQueue.prototype.clear = function () {\n this.tasks.length = 0;\n };\n queues = {\n FIFOQueue: FIFOQueue,\n LIFOQueue: LIFOQueue\n };\n return queues;\n }\n\n var debugPortAllocator;\n var hasRequiredDebugPortAllocator;\n function requireDebugPortAllocator() {\n if (hasRequiredDebugPortAllocator) return debugPortAllocator;\n hasRequiredDebugPortAllocator = 1;\n var MAX_PORTS = 65535;\n debugPortAllocator = DebugPortAllocator;\n function DebugPortAllocator() {\n this.ports = Object.create(null);\n this.length = 0;\n }\n DebugPortAllocator.prototype.nextAvailableStartingAt = function (starting) {\n while (this.ports[starting] === true) {\n starting++;\n }\n if (starting >= MAX_PORTS) {\n throw new Error('WorkerPool debug port limit reached: ' + starting + '>= ' + MAX_PORTS);\n }\n this.ports[starting] = true;\n this.length++;\n return starting;\n };\n DebugPortAllocator.prototype.releasePort = function (port) {\n delete this.ports[port];\n this.length--;\n };\n return debugPortAllocator;\n }\n\n var Pool_1;\n var hasRequiredPool;\n function requirePool() {\n if (hasRequiredPool) return Pool_1;\n hasRequiredPool = 1;\n var _require$$ = require_Promise(),\n Promise = _require$$.Promise;\n var WorkerHandler = WorkerHandlerExports;\n var environment = environmentExports;\n var _require$$2 = requireQueues(),\n FIFOQueue = _require$$2.FIFOQueue,\n LIFOQueue = _require$$2.LIFOQueue;\n var DebugPortAllocator = requireDebugPortAllocator();\n var DEBUG_PORT_ALLOCATOR = new DebugPortAllocator();\n\n /**\n * A pool to manage workers, which can be created using the function workerpool.pool.\n *\n * @param {String} [script] Optional worker script\n * @param {import('./types.js').WorkerPoolOptions} [options] See docs\n * @constructor\n */\n function Pool(script, options) {\n if (typeof script === \"string\") {\n /** @readonly */\n this.script = script || null;\n } else {\n this.script = null;\n options = script;\n }\n\n /** @private */\n this.workers = []; // queue with all workers\n\n /** @private */\n this.taskQueue = this._createQueue(options && options.queueStrategy || \"fifo\"); // queue with tasks awaiting execution\n\n options = options || {};\n\n /** @readonly */\n this.forkArgs = Object.freeze(options.forkArgs || []);\n /** @readonly */\n this.forkOpts = Object.freeze(options.forkOpts || {});\n /** @readonly */\n this.workerOpts = Object.freeze(options.workerOpts || {});\n /** @readonly */\n this.workerThreadOpts = Object.freeze(options.workerThreadOpts || {});\n /** @private */\n this.debugPortStart = options.debugPortStart || 43210;\n /** @readonly @deprecated */\n this.nodeWorker = options.nodeWorker;\n /** @readonly\n * @type {'auto' | 'web' | 'process' | 'thread'}\n */\n this.workerType = options.workerType || options.nodeWorker || \"auto\";\n /** @readonly */\n this.maxQueueSize = options.maxQueueSize || Infinity;\n /** @readonly */\n this.workerTerminateTimeout = options.workerTerminateTimeout || 1000;\n\n /** @readonly */\n this.onCreateWorker = options.onCreateWorker || function () {\n return null;\n };\n /** @readonly */\n this.onTerminateWorker = options.onTerminateWorker || function () {\n return null;\n };\n\n /** @readonly */\n this.emitStdStreams = options.emitStdStreams || false;\n\n // configuration\n if (options && \"maxWorkers\" in options) {\n validateMaxWorkers(options.maxWorkers);\n /** @readonly */\n this.maxWorkers = options.maxWorkers;\n } else {\n this.maxWorkers = Math.max((environment.cpus || 4) - 1, 1);\n }\n if (options && \"minWorkers\" in options) {\n if (options.minWorkers === \"max\") {\n /** @readonly */\n this.minWorkers = this.maxWorkers;\n } else {\n validateMinWorkers(options.minWorkers);\n this.minWorkers = options.minWorkers;\n this.maxWorkers = Math.max(this.minWorkers, this.maxWorkers); // in case minWorkers is higher than maxWorkers\n }\n this._ensureMinWorkers();\n }\n\n /** @private */\n this._boundNext = this._next.bind(this);\n if (this.workerType === \"thread\") {\n WorkerHandler.ensureWorkerThreads();\n }\n }\n\n /**\n * Execute a function on a worker.\n *\n * Example usage:\n *\n * var pool = new Pool()\n *\n * // call a function available on the worker\n * pool.exec('fibonacci', [6])\n *\n * // offload a function\n * function add(a, b) {\n * return a + b\n * };\n * pool.exec(add, [2, 4])\n * .then(function (result) {\n * console.log(result); // outputs 6\n * })\n * .catch(function(error) {\n * console.log(error);\n * });\n * @template { (...args: any[]) => any } T\n * @param {String | T} method Function name or function.\n * If `method` is a string, the corresponding\n * method on the worker will be executed\n * If `method` is a Function, the function\n * will be stringified and executed via the\n * workers built-in function `run(fn, args)`.\n * @param {Parameters | null} [params] Function arguments applied when calling the function\n * @param {import('./types.js').ExecOptions} [options] Options\n * @return {Promise>}\n */\n Pool.prototype.exec = function (method, params, options) {\n // validate type of arguments\n if (params && !Array.isArray(params)) {\n throw new TypeError('Array expected as argument \"params\"');\n }\n if (typeof method === \"string\") {\n var resolver = Promise.defer();\n if (this.taskQueue.size() >= this.maxQueueSize) {\n throw new Error(\"Max queue size of \" + this.maxQueueSize + \" reached\");\n }\n\n // add a new task to the queue\n var task = {\n method: method,\n params: params,\n resolver: resolver,\n timeout: null,\n options: options\n };\n this.taskQueue.push(task);\n\n // replace the timeout method of the Promise with our own,\n // which starts the timer as soon as the task is actually started\n // TODO: how can i find if the task is still in the queue?\n var originalTimeout = resolver.promise.timeout;\n var taskQueue = this.taskQueue;\n resolver.promise.timeout = function timeout(delay) {\n if (taskQueue.contains(task)) {\n // task is still queued -> start the timer later on\n task.timeout = delay;\n return resolver.promise;\n } else {\n // task is already being executed -> start timer immediately\n return originalTimeout.call(resolver.promise, delay);\n }\n };\n\n // trigger task execution\n this._next();\n return resolver.promise;\n } else if (typeof method === \"function\") {\n // send stringified function and function arguments to worker\n return this.exec(\"run\", [String(method), params], options);\n } else {\n throw new TypeError('Function or string expected as argument \"method\"');\n }\n };\n\n /**\n * Create a proxy for current worker. Returns an object containing all\n * methods available on the worker. All methods return promises resolving the methods result.\n * @template { { [k: string]: (...args: any[]) => any } } T\n * @return {Promise, Error>} Returns a promise which resolves with a proxy object\n */\n Pool.prototype.proxy = function () {\n if (arguments.length > 0) {\n throw new Error(\"No arguments expected\");\n }\n var pool = this;\n return this.exec(\"methods\").then(function (methods) {\n var proxy = {};\n methods.forEach(function (method) {\n proxy[method] = function () {\n return pool.exec(method, Array.prototype.slice.call(arguments));\n };\n });\n return proxy;\n });\n };\n\n /**\n * Creates new array with the results of calling a provided callback function\n * on every element in this array.\n * @param {Array} array\n * @param {function} callback Function taking two arguments:\n * `callback(currentValue, index)`\n * @return {Promise.} Returns a promise which resolves with an Array\n * containing the results of the callback function\n * executed for each of the array elements.\n */\n /* TODO: implement map\n Pool.prototype.map = function (array, callback) {\n };\n */\n\n /**\n * Grab the first task from the queue, find a free worker, and assign the\n * worker to the task.\n * @private\n */\n Pool.prototype._next = function () {\n if (this.taskQueue.size() > 0) {\n // there are tasks in the queue\n\n // find an available worker\n var worker = this._getWorker();\n if (worker) {\n // get the first task from the queue\n var me = this;\n var task = this.taskQueue.pop();\n\n // check if the task is still pending (and not cancelled -> promise rejected)\n if (task.resolver.promise.pending) {\n // send the request to the worker\n var promise = worker.exec(task.method, task.params, task.resolver, task.options).then(me._boundNext).catch(function () {\n // if the worker crashed and terminated, remove it from the pool\n if (worker.terminated) {\n return me._removeWorker(worker);\n }\n }).then(function () {\n me._next(); // trigger next task in the queue\n });\n\n // start queued timer now\n if (typeof task.timeout === \"number\") {\n promise.timeout(task.timeout);\n }\n } else {\n // The task taken was already complete (either rejected or resolved), so just trigger next task in the queue\n me._next();\n }\n }\n }\n };\n\n /**\n * Get an available worker. If no worker is available and the maximum number\n * of workers isn't yet reached, a new worker will be created and returned.\n * If no worker is available and the maximum number of workers is reached,\n * null will be returned.\n *\n * @return {WorkerHandler | null} worker\n * @private\n */\n Pool.prototype._getWorker = function () {\n // find a non-busy worker\n var workers = this.workers;\n for (var i = 0; i < workers.length; i++) {\n var worker = workers[i];\n if (worker.busy() === false) {\n return worker;\n }\n }\n if (workers.length < this.maxWorkers) {\n // create a new worker\n worker = this._createWorkerHandler();\n workers.push(worker);\n return worker;\n }\n return null;\n };\n\n /**\n * Remove a worker from the pool.\n * Attempts to terminate worker if not already terminated, and ensures the minimum\n * pool size is met.\n * @param {WorkerHandler} worker\n * @return {Promise}\n * @private\n */\n Pool.prototype._removeWorker = function (worker) {\n var me = this;\n DEBUG_PORT_ALLOCATOR.releasePort(worker.debugPort);\n // _removeWorker will call this, but we need it to be removed synchronously\n this._removeWorkerFromList(worker);\n // If minWorkers set, spin up new workers to replace the crashed ones\n this._ensureMinWorkers();\n // terminate the worker (if not already terminated)\n return new Promise(function (resolve, reject) {\n worker.terminate(false, function (err) {\n me.onTerminateWorker({\n forkArgs: worker.forkArgs,\n forkOpts: worker.forkOpts,\n workerThreadOpts: worker.workerThreadOpts,\n script: worker.script\n });\n if (err) {\n reject(err);\n } else {\n resolve(worker);\n }\n });\n });\n };\n\n /**\n * Remove a worker from the pool list.\n * @param {WorkerHandler} worker\n * @private\n */\n Pool.prototype._removeWorkerFromList = function (worker) {\n // remove from the list with workers\n var index = this.workers.indexOf(worker);\n if (index !== -1) {\n this.workers.splice(index, 1);\n }\n };\n\n /**\n * Close all active workers. Tasks currently being executed will be finished first.\n * @param {boolean} [force=false] If false (default), the workers are terminated\n * after finishing all tasks currently in\n * progress. If true, the workers will be\n * terminated immediately.\n * @param {number} [timeout] If provided and non-zero, worker termination promise will be rejected\n * after timeout if worker process has not been terminated.\n * @return {Promise.}\n */\n Pool.prototype.terminate = function (force, timeout) {\n var me = this;\n\n // cancel any pending tasks\n var taskQueue = this.taskQueue;\n while (taskQueue.size() > 0) {\n var task = taskQueue.pop();\n if (task) {\n task.resolver.reject(new Error(\"Pool terminated\"));\n } else {\n break;\n }\n }\n taskQueue.clear();\n var f = function f(worker) {\n DEBUG_PORT_ALLOCATOR.releasePort(worker.debugPort);\n this._removeWorkerFromList(worker);\n };\n var removeWorker = f.bind(this);\n var promises = [];\n var workers = this.workers.slice();\n workers.forEach(function (worker) {\n var termPromise = worker.terminateAndNotify(force, timeout).then(removeWorker).always(function () {\n me.onTerminateWorker({\n forkArgs: worker.forkArgs,\n forkOpts: worker.forkOpts,\n workerThreadOpts: worker.workerThreadOpts,\n script: worker.script\n });\n });\n promises.push(termPromise);\n });\n return Promise.all(promises);\n };\n\n /**\n * Retrieve statistics on tasks and workers.\n * @return {{totalWorkers: number, busyWorkers: number, idleWorkers: number, pendingTasks: number, activeTasks: number}} Returns an object with statistics\n */\n Pool.prototype.stats = function () {\n var totalWorkers = this.workers.length;\n var busyWorkers = this.workers.filter(function (worker) {\n return worker.busy();\n }).length;\n return {\n totalWorkers: totalWorkers,\n busyWorkers: busyWorkers,\n idleWorkers: totalWorkers - busyWorkers,\n pendingTasks: this.taskQueue.size(),\n activeTasks: busyWorkers\n };\n };\n\n /**\n * Ensures that a minimum of minWorkers is up and running\n * @private\n */\n Pool.prototype._ensureMinWorkers = function () {\n if (this.minWorkers) {\n for (var i = this.workers.length; i < this.minWorkers; i++) {\n this.workers.push(this._createWorkerHandler());\n }\n }\n };\n\n /**\n * Helper function to create a new WorkerHandler and pass all options.\n * @return {WorkerHandler}\n * @private\n */\n Pool.prototype._createWorkerHandler = function () {\n var overriddenParams = this.onCreateWorker({\n forkArgs: this.forkArgs,\n forkOpts: this.forkOpts,\n workerOpts: this.workerOpts,\n workerThreadOpts: this.workerThreadOpts,\n script: this.script\n }) || {};\n return new WorkerHandler(overriddenParams.script || this.script, {\n forkArgs: overriddenParams.forkArgs || this.forkArgs,\n forkOpts: overriddenParams.forkOpts || this.forkOpts,\n workerOpts: overriddenParams.workerOpts || this.workerOpts,\n workerThreadOpts: overriddenParams.workerThreadOpts || this.workerThreadOpts,\n debugPort: DEBUG_PORT_ALLOCATOR.nextAvailableStartingAt(this.debugPortStart),\n workerType: this.workerType,\n workerTerminateTimeout: this.workerTerminateTimeout,\n emitStdStreams: this.emitStdStreams\n });\n };\n\n /**\n * Create queue instance based on strategy\n * @param {'fifo' | 'lifo' | import('./types').TaskQueue} strategy\n * @returns {import('./types').TaskQueue} Queue instance\n * @private\n */\n Pool.prototype._createQueue = function (strategy) {\n if (typeof strategy === \"string\") {\n switch (strategy) {\n case \"fifo\":\n return new FIFOQueue();\n case \"lifo\":\n return new LIFOQueue();\n default:\n throw new Error(\"Unknown queue strategy: \" + strategy);\n }\n }\n if (!strategy) {\n throw new Error(\"Queue strategy cannot be null or undefined\");\n }\n\n // validate if custom queue implements required methods\n var requiredMethods = [\"push\", \"pop\", \"size\", \"contains\", \"clear\"];\n for (var i = 0; i < requiredMethods.length; i++) {\n var method = requiredMethods[i];\n if (typeof strategy[method] !== \"function\") {\n throw new Error(\"Queue strategy must implement method: \" + method);\n }\n }\n return strategy;\n };\n /**\n * Ensure that the maxWorkers option is an integer >= 1\n * @param {*} maxWorkers\n * @returns {boolean} returns true maxWorkers has a valid value\n */\n function validateMaxWorkers(maxWorkers) {\n if (!isNumber(maxWorkers) || !isInteger(maxWorkers) || maxWorkers < 1) {\n throw new TypeError(\"Option maxWorkers must be an integer number >= 1\");\n }\n }\n\n /**\n * Ensure that the minWorkers option is an integer >= 0\n * @param {*} minWorkers\n * @returns {boolean} returns true when minWorkers has a valid value\n */\n function validateMinWorkers(minWorkers) {\n if (!isNumber(minWorkers) || !isInteger(minWorkers) || minWorkers < 0) {\n throw new TypeError(\"Option minWorkers must be an integer number >= 0\");\n }\n }\n\n /**\n * Test whether a variable is a number\n * @param {*} value\n * @returns {boolean} returns true when value is a number\n */\n function isNumber(value) {\n return typeof value === \"number\";\n }\n\n /**\n * Test whether a number is an integer\n * @param {number} value\n * @returns {boolean} Returns true if value is an integer\n */\n function isInteger(value) {\n return Math.round(value) == value;\n }\n Pool_1 = Pool;\n return Pool_1;\n }\n\n var worker$1 = {};\n\n /**\n * The helper class for transferring data from the worker to the main thread.\n *\n * @param {Object} message The object to deliver to the main thread.\n * @param {Object[]} transfer An array of transferable Objects to transfer ownership of.\n */\n var transfer;\n var hasRequiredTransfer;\n function requireTransfer() {\n if (hasRequiredTransfer) return transfer;\n hasRequiredTransfer = 1;\n function Transfer(message, transfer) {\n this.message = message;\n this.transfer = transfer;\n }\n transfer = Transfer;\n return transfer;\n }\n\n var hasRequiredWorker;\n function requireWorker() {\n if (hasRequiredWorker) return worker$1;\n hasRequiredWorker = 1;\n (function (exports$1) {\n var Transfer = requireTransfer();\n\n /**\n * worker must handle async cleanup handlers. Use custom Promise implementation. \n */\n var Promise = require_Promise().Promise;\n /**\n * Special message sent by parent which causes the worker to terminate itself.\n * Not a \"message object\"; this string is the entire message.\n */\n var TERMINATE_METHOD_ID = '__workerpool-terminate__';\n\n /**\n * Special message by parent which causes a child process worker to perform cleaup\n * steps before determining if the child process worker should be terminated.\n */\n var CLEANUP_METHOD_ID = '__workerpool-cleanup__';\n // var nodeOSPlatform = require('./environment').nodeOSPlatform;\n\n var TIMEOUT_DEFAULT = 1000;\n\n // create a worker API for sending and receiving messages which works both on\n // node.js and in the browser\n var worker = {\n exit: function exit() {}\n };\n\n // api for in worker communication with parent process\n // works in both node.js and the browser\n var publicWorker = {\n /**\n * Registers listeners which will trigger when a task is timed out or cancled. If all listeners resolve, the worker executing the given task will not be terminated.\n * *Note*: If there is a blocking operation within a listener, the worker will be terminated.\n * @param {() => Promise} listener\n */\n addAbortListener: function addAbortListener(listener) {\n worker.abortListeners.push(listener);\n },\n /**\n * Emit an event from the worker thread to the main thread.\n * @param {any} payload\n */\n emit: worker.emit\n };\n if (typeof self !== 'undefined' && typeof postMessage === 'function' && typeof addEventListener === 'function') {\n // worker in the browser\n worker.on = function (event, callback) {\n addEventListener(event, function (message) {\n callback(message.data);\n });\n };\n worker.send = function (message, transfer) {\n transfer ? postMessage(message, transfer) : postMessage(message);\n };\n } else if (typeof process !== 'undefined') {\n // node.js\n\n var WorkerThreads;\n try {\n WorkerThreads = require('worker_threads');\n } catch (error) {\n if (_typeof(error) === 'object' && error !== null && error.code === 'MODULE_NOT_FOUND') ; else {\n throw error;\n }\n }\n if (WorkerThreads && /* if there is a parentPort, we are in a WorkerThread */\n WorkerThreads.parentPort !== null) {\n var parentPort = WorkerThreads.parentPort;\n worker.send = parentPort.postMessage.bind(parentPort);\n worker.on = parentPort.on.bind(parentPort);\n worker.exit = process.exit.bind(process);\n } else {\n worker.on = process.on.bind(process);\n // ignore transfer argument since it is not supported by process\n worker.send = function (message) {\n process.send(message);\n };\n // register disconnect handler only for subprocess worker to exit when parent is killed unexpectedly\n worker.on('disconnect', function () {\n process.exit(1);\n });\n worker.exit = process.exit.bind(process);\n }\n } else {\n throw new Error('Script must be executed as a worker');\n }\n function convertError(error) {\n if (error && error.toJSON) {\n return JSON.parse(JSON.stringify(error));\n }\n\n // turn a class like Error (having non-enumerable properties) into a plain object\n return JSON.parse(JSON.stringify(error, Object.getOwnPropertyNames(error)));\n }\n\n /**\n * Test whether a value is a Promise via duck typing.\n * @param {*} value\n * @returns {boolean} Returns true when given value is an object\n * having functions `then` and `catch`.\n */\n function isPromise(value) {\n return value && typeof value.then === 'function' && typeof value.catch === 'function';\n }\n\n // functions available externally\n worker.methods = {};\n\n /**\n * Execute a function with provided arguments\n * @param {String} fn Stringified function\n * @param {Array} [args] Function arguments\n * @returns {*}\n */\n worker.methods.run = function run(fn, args) {\n var f = new Function('return (' + fn + ').apply(this, arguments);');\n f.worker = publicWorker;\n return f.apply(f, args);\n };\n\n /**\n * Get a list with methods available on this worker\n * @return {String[]} methods\n */\n worker.methods.methods = function methods() {\n return Object.keys(worker.methods);\n };\n\n /**\n * Custom handler for when the worker is terminated.\n */\n worker.terminationHandler = undefined;\n worker.abortListenerTimeout = TIMEOUT_DEFAULT;\n\n /**\n * Abort handlers for resolving errors which may cause a timeout or cancellation\n * to occur from a worker context\n */\n worker.abortListeners = [];\n\n /**\n * Cleanup and exit the worker.\n * @param {Number} code \n * @returns {Promise}\n */\n worker.terminateAndExit = function (code) {\n var _exit = function _exit() {\n worker.exit(code);\n };\n if (!worker.terminationHandler) {\n return _exit();\n }\n var result = worker.terminationHandler(code);\n if (isPromise(result)) {\n result.then(_exit, _exit);\n return result;\n } else {\n _exit();\n return new Promise(function (_resolve, reject) {\n reject(new Error(\"Worker terminating\"));\n });\n }\n };\n\n /**\n * Called within the worker message handler to run abort handlers if registered to perform cleanup operations.\n * @param {Integer} [requestId] id of task which is currently executing in the worker\n * @return {Promise}\n */\n worker.cleanup = function (requestId) {\n if (!worker.abortListeners.length) {\n worker.send({\n id: requestId,\n method: CLEANUP_METHOD_ID,\n error: convertError(new Error('Worker terminating'))\n });\n\n // If there are no handlers registered, reject the promise with an error as we want the handler to be notified\n // that cleanup should begin and the handler should be GCed.\n return new Promise(function (resolve) {\n resolve();\n });\n }\n var _exit = function _exit() {\n worker.exit();\n };\n var _abort = function _abort() {\n if (!worker.abortListeners.length) {\n worker.abortListeners = [];\n }\n };\n var promises = worker.abortListeners.map(function (listener) {\n return listener();\n });\n var timerId;\n var timeoutPromise = new Promise(function (_resolve, reject) {\n timerId = setTimeout(function () {\n reject(new Error('Timeout occured waiting for abort handler, killing worker'));\n }, worker.abortListenerTimeout);\n });\n\n // Once a promise settles we need to clear the timeout to prevet fulfulling the promise twice \n var settlePromise = Promise.all(promises).then(function () {\n clearTimeout(timerId);\n _abort();\n }, function () {\n clearTimeout(timerId);\n _exit();\n });\n\n // Returns a promise which will result in one of the following cases\n // - Resolve once all handlers resolve\n // - Reject if one or more handlers exceed the 'abortListenerTimeout' interval\n // - Reject if one or more handlers reject\n // Upon one of the above cases a message will be sent to the handler with the result of the handler execution\n // which will either kill the worker if the result contains an error, or keep it in the pool if the result\n // does not contain an error.\n return new Promise(function (resolve, reject) {\n settlePromise.then(resolve, reject);\n timeoutPromise.then(resolve, reject);\n }).then(function () {\n worker.send({\n id: requestId,\n method: CLEANUP_METHOD_ID,\n error: null\n });\n }, function (err) {\n worker.send({\n id: requestId,\n method: CLEANUP_METHOD_ID,\n error: err ? convertError(err) : null\n });\n });\n };\n var currentRequestId = null;\n worker.on('message', function (request) {\n if (request === TERMINATE_METHOD_ID) {\n return worker.terminateAndExit(0);\n }\n if (request.method === CLEANUP_METHOD_ID) {\n return worker.cleanup(request.id);\n }\n try {\n var method = worker.methods[request.method];\n if (method) {\n currentRequestId = request.id;\n\n // execute the function\n var result = method.apply(method, request.params);\n if (isPromise(result)) {\n // promise returned, resolve this and then return\n result.then(function (result) {\n if (result instanceof Transfer) {\n worker.send({\n id: request.id,\n result: result.message,\n error: null\n }, result.transfer);\n } else {\n worker.send({\n id: request.id,\n result: result,\n error: null\n });\n }\n currentRequestId = null;\n }).catch(function (err) {\n worker.send({\n id: request.id,\n result: null,\n error: convertError(err)\n });\n currentRequestId = null;\n });\n } else {\n // immediate result\n if (result instanceof Transfer) {\n worker.send({\n id: request.id,\n result: result.message,\n error: null\n }, result.transfer);\n } else {\n worker.send({\n id: request.id,\n result: result,\n error: null\n });\n }\n currentRequestId = null;\n }\n } else {\n throw new Error('Unknown method \"' + request.method + '\"');\n }\n } catch (err) {\n worker.send({\n id: request.id,\n result: null,\n error: convertError(err)\n });\n }\n });\n\n /**\n * Register methods to the worker\n * @param {Object} [methods]\n * @param {import('./types.js').WorkerRegisterOptions} [options]\n */\n worker.register = function (methods, options) {\n if (methods) {\n for (var name in methods) {\n if (methods.hasOwnProperty(name)) {\n worker.methods[name] = methods[name];\n worker.methods[name].worker = publicWorker;\n }\n }\n }\n if (options) {\n worker.terminationHandler = options.onTerminate;\n // register listener timeout or default to 1 second\n worker.abortListenerTimeout = options.abortListenerTimeout || TIMEOUT_DEFAULT;\n }\n worker.send('ready');\n };\n worker.emit = function (payload) {\n if (currentRequestId) {\n if (payload instanceof Transfer) {\n worker.send({\n id: currentRequestId,\n isEvent: true,\n payload: payload.message\n }, payload.transfer);\n return;\n }\n worker.send({\n id: currentRequestId,\n isEvent: true,\n payload: payload\n });\n }\n };\n {\n exports$1.add = worker.register;\n exports$1.emit = worker.emit;\n }\n })(worker$1);\n return worker$1;\n }\n\n var platform = environmentExports.platform,\n isMainThread = environmentExports.isMainThread,\n cpus = environmentExports.cpus;\n var TerminateError = WorkerHandlerExports.TerminateError;\n\n /** @typedef {import(\"./Pool\")} Pool */\n /** @typedef {import(\"./types.js\").WorkerPoolOptions} WorkerPoolOptions */\n /** @typedef {import(\"./types.js\").WorkerRegisterOptions} WorkerRegisterOptions */\n\n /**\n * @template { { [k: string]: (...args: any[]) => any } } T\n * @typedef {import('./types.js').Proxy} Proxy\n */\n\n /**\n * @overload\n * Create a new worker pool\n * @param {WorkerPoolOptions} [script]\n * @returns {Pool} pool\n */\n /**\n * @overload\n * Create a new worker pool\n * @param {string} [script]\n * @param {WorkerPoolOptions} [options]\n * @returns {Pool} pool\n */\n function pool(script, options) {\n var Pool = requirePool();\n return new Pool(script, options);\n }\n var pool_1 = src.pool = pool;\n\n /**\n * Create a worker and optionally register a set of methods to the worker.\n * @param {{ [k: string]: (...args: any[]) => any }} [methods]\n * @param {WorkerRegisterOptions} [options]\n */\n function worker(methods, options) {\n var worker = requireWorker();\n worker.add(methods, options);\n }\n var worker_1 = src.worker = worker;\n\n /**\n * Sends an event to the parent worker pool.\n * @param {any} payload \n */\n function workerEmit(payload) {\n var worker = requireWorker();\n worker.emit(payload);\n }\n var workerEmit_1 = src.workerEmit = workerEmit;\n var _require$$ = require_Promise(),\n Promise$1 = _require$$.Promise;\n var _Promise = src.Promise = Promise$1;\n var Transfer = src.Transfer = requireTransfer();\n var platform_1 = src.platform = platform;\n var isMainThread_1 = src.isMainThread = isMainThread;\n var cpus_1 = src.cpus = cpus;\n var TerminateError_1 = src.TerminateError = TerminateError;\n\n exports.Promise = _Promise;\n exports.TerminateError = TerminateError_1;\n exports.Transfer = Transfer;\n exports.cpus = cpus_1;\n exports.default = src;\n exports.isMainThread = isMainThread_1;\n exports.platform = platform_1;\n exports.pool = pool_1;\n exports.worker = worker_1;\n exports.workerEmit = workerEmit_1;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=workerpool.js.map\n","// The complete worker script is computed at build time by workerScriptPlugin\n// in vite.config.js and inlined here as a string constant. Nothing in this\n// module depends on runtime function serialisation (thread.toString()) or on\n// workerpool's generated embeddedWorker import — both of those happen once\n// during the build, immune to any monkey-patching by zone.js or other libs.\nimport workerScript from \"virtual:worker-script\";\n\nexport function getConcurrency() {\n return (typeof navigator === \"object\" && navigator.hardwareConcurrency) || 2;\n}\n\nexport function getWorkerType() {\n return \"web\";\n}\n\n// Workers are not available in headless/SSR browser contexts.\nexport function supportsWorkers() {\n return typeof Worker !== \"undefined\";\n}\n\n// Lazily created so Blob/URL are only accessed when a pool is first needed.\nlet _workerSource = null;\n\nexport function getWorkerSource() {\n if (_workerSource) return _workerSource;\n\n const blob = new Blob([workerScript], { type: \"application/javascript\" });\n _workerSource = (globalThis.URL ? globalThis.URL : globalThis.webkitURL).createObjectURL(blob);\n return _workerSource;\n}\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\n// const MEM_SIZE = 1000; // Memory size in 64K Pages (512Mb)\nconst MEM_SIZE = 25; // Memory size in 64K Pages (1600Kb)\n\nimport thread from \"./threadman_thread.js\";\nimport workerpool from \"workerpool\";\nimport {\n getConcurrency,\n getWorkerType,\n supportsWorkers,\n getWorkerSource,\n} from \"#threadman-platform\";\n\n\nexport default async function buildThreadManager(wasm, singleThread) {\n const tm = new ThreadManager();\n\n tm.memory = new WebAssembly.Memory({ initial: MEM_SIZE });\n tm.u8 = new Uint8Array(tm.memory.buffer);\n tm.u32 = new Uint32Array(tm.memory.buffer);\n\n const wasmModule = await WebAssembly.compile(wasm.code);\n\n tm.instance = await WebAssembly.instantiate(wasmModule, {\n env: {\n \"memory\": tm.memory\n }\n });\n\n if (!supportsWorkers()) {\n singleThread = true;\n }\n\n tm.singleThread = singleThread;\n tm.initalPFree = tm.u32[0]; // Save the Pointer to free space.\n tm.pq = wasm.pq;\n tm.pr = wasm.pr;\n tm.pG1gen = wasm.pG1gen;\n tm.pG1zero = wasm.pG1zero;\n tm.pG2gen = wasm.pG2gen;\n tm.pG2zero = wasm.pG2zero;\n tm.pOneT = wasm.pOneT;\n\n tm.code = wasm.code;\n tm.wasmModule = wasmModule;\n\n if (singleThread) {\n tm.taskManager = thread();\n await tm.taskManager([{\n cmd: \"INIT\",\n init: MEM_SIZE,\n code: tm.code.slice()\n }]);\n tm.concurrency = 1;\n } else {\n const rawConcurrency = getConcurrency();\n const concurrency = Math.min(Math.max(rawConcurrency, 2), 64);\n\n tm.concurrency = concurrency;\n\n tm.pool = workerpool.pool(getWorkerSource(), {\n maxWorkers: concurrency,\n workerType: getWorkerType(),\n });\n\n // Eagerly initialise all workers with the already-compiled\n // WebAssembly.Module. Passing the module instead of raw bytes avoids\n // copying concurrency × wasmSize bytes and re-compiling in each worker.\n // WebAssembly.Module is structured-cloned by the workers channel.\n const initPromises = [];\n for (let i = 0; i < concurrency; i++) {\n initPromises.push(\n tm.pool.exec(\"runTask\", [[{\n cmd: \"INIT\",\n init: MEM_SIZE,\n code: tm.wasmModule\n }]])\n );\n }\n await Promise.all(initPromises);\n }\n\n return tm;\n}\n\nexport class ThreadManager {\n constructor() {\n this.oldPFree = 0;\n }\n\n startSyncOp() {\n if (this.oldPFree !== 0) throw new Error(\"Sync operation in progress\");\n this.oldPFree = this.u32[0];\n }\n\n endSyncOp() {\n if (this.oldPFree === 0) throw new Error(\"No sync operation in progress\");\n this.u32[0] = this.oldPFree;\n this.oldPFree = 0;\n }\n\n async queueAction(actionData, transfers) {\n if (this.singleThread) {\n return this.taskManager(actionData);\n }\n\n // Callers pass only consumed input buffers in `transfers`; those\n // ArrayBuffers are transferred zero-copy to the worker thread.\n return this.pool.exec(\"runTask\", [actionData], { transfer: transfers });\n }\n\n resetMemory() {\n this.u32[0] = this.initalPFree;\n }\n\n allocBuff(buff) {\n const pointer = this.alloc(buff.byteLength);\n this.setBuff(pointer, buff);\n return pointer;\n }\n\n getBuff(pointer, length) {\n return this.u8.slice(pointer, pointer + length);\n }\n\n setBuff(pointer, buffer) {\n this.u8.set(new Uint8Array(buffer), pointer);\n }\n\n alloc(length) {\n // Branchless 4-byte alignment: same result as the alignment loop.\n this.u32[0] = (this.u32[0] + 3) & ~3;\n const res = this.u32[0];\n this.u32[0] += length;\n return res;\n }\n\n async terminate() {\n if (this.pool) {\n await this.pool.terminate(true);\n }\n }\n}\n","import BigBuffer from \"./bigbuffer.js\";\n\nexport default function buildBatchApplyKey(curve, groupName) {\n const G = curve[groupName];\n const Fr = curve.Fr;\n const tm = curve.tm;\n\n curve[groupName].batchApplyKey = async function(buff, first, inc, inType, outType) {\n inType = inType || \"affine\";\n outType = outType || \"affine\";\n let fnName, fnAffine;\n let sGin, sGmid, sGout;\n if (groupName == \"G1\") {\n if (inType == \"jacobian\") {\n sGin = G.F.n8*3;\n fnName = \"g1m_batchApplyKey\";\n } else {\n sGin = G.F.n8*2;\n fnName = \"g1m_batchApplyKeyMixed\";\n }\n sGmid = G.F.n8*3;\n if (outType == \"jacobian\") {\n sGout = G.F.n8*3;\n } else {\n fnAffine = \"g1m_batchToAffine\";\n sGout = G.F.n8*2;\n }\n } else if (groupName == \"G2\") {\n if (inType == \"jacobian\") {\n sGin = G.F.n8*3;\n fnName = \"g2m_batchApplyKey\";\n } else {\n sGin = G.F.n8*2;\n fnName = \"g2m_batchApplyKeyMixed\";\n }\n sGmid = G.F.n8*3;\n if (outType == \"jacobian\") {\n sGout = G.F.n8*3;\n } else {\n fnAffine = \"g2m_batchToAffine\";\n sGout = G.F.n8*2;\n }\n } else if (groupName == \"Fr\") {\n fnName = \"frm_batchApplyKey\";\n sGin = G.n8;\n sGmid = G.n8;\n sGout = G.n8;\n } else {\n throw new Error(\"Invalid group: \" + groupName);\n }\n const nPoints = Math.floor(buff.byteLength / sGin);\n const pointsPerChunk = Math.floor(nPoints/tm.concurrency);\n const opPromises = [];\n inc = Fr.e(inc);\n let t = Fr.e(first);\n for (let i=0; i= 0; i--) {\n if (!G.isZero(res)) {\n for (let j = 0; j < bitChunkSize; j++) res = G.double(res);\n }\n res = G.add(res, result[i][0]);\n }\n\n return res;\n }\n\n async function _multiExp(buffBases, buffScalars, inType, logger, logText) {\n const MAX_CHUNK_SIZE = 1 << 22;\n const MIN_CHUNK_SIZE = 1 << 12;\n let sGIn;\n\n if (groupName === \"G1\") {\n if (inType === \"affine\") {\n sGIn = G.F.n8 * 2;\n } else {\n sGIn = G.F.n8 * 3;\n }\n } else if (groupName === \"G2\") {\n if (inType === \"affine\") {\n sGIn = G.F.n8 * 2;\n } else {\n sGIn = G.F.n8 * 3;\n }\n } else {\n throw new Error(\"Invalid group\");\n }\n\n const nPoints = Math.floor(buffBases.byteLength / sGIn);\n if (nPoints === 0) return G.zero;\n const sScalar = Math.floor(buffScalars.byteLength / nPoints);\n if (sScalar * nPoints !== buffScalars.byteLength) {\n throw new Error(\"Scalar size does not match\");\n }\n\n const opPromises = [];\n const bitChunkSize = pTSizes[log2(nPoints)];\n let nChunks = Math.floor((sScalar * 8 - 1) / bitChunkSize) + 1;\n\n if (groupName === \"G2\") {\n // G2 has bigger points, so we reduce chunk size to optimize memory usage\n nChunks *= 2;\n }\n\n let chunkSize;\n //chunkSize = Math.floor(nPoints / tm.concurrency) + 1;\n\n console.log(\"nChunks_0\", nChunks);\n\n // make nChunks multiple of tm.concurrency for optimal load balancing\n nChunks = (Math.floor((nChunks - 1) / tm.concurrency) + 1) * tm.concurrency;\n chunkSize = Math.floor(nPoints / nChunks) + 1;\n\n if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE;\n if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE;\n\n console.log(\"nChunks\", nChunks);\n console.log(\"effective nChunks\", nPoints / chunkSize);\n\n for (let i = 0; i < nPoints; i += chunkSize) {\n if (logger) logger.debug(`Multiexp start: ${logText}: ${i}/${nPoints}`);\n const n = Math.min(nPoints - i, chunkSize);\n\n const buffBasesChunk = buffBases.slice(i * sGIn, (i + n) * sGIn);\n const buffScalarsChunk = buffScalars.slice(i * sScalar, (i + n) * sScalar);\n\n opPromises.push(_multiExpChunk(buffBasesChunk, buffScalarsChunk, inType, logger, logText).then((r) => {\n if (logger) logger.debug(`Multiexp end: ${logText}: ${i}/${nPoints}`);\n return r;\n }));\n }\n\n const result = await Promise.all(opPromises);\n\n let res = G.zero;\n for (let i = result.length - 1; i >= 0; i--) {\n res = G.add(res, result[i]);\n }\n\n return res;\n }\n\n G.multiExp = async function multiExpAffine(buffBases, buffScalars, logger, logText) {\n return _multiExp(buffBases, buffScalars, \"jacobian\", logger, logText);\n };\n G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText) {\n return _multiExp(buffBases, buffScalars, \"affine\", logger, logText);\n };\n}\n","import { log2, array2buffer, buffer2array } from \"./utils.js\";\nimport BigBuffer from \"./bigbuffer.js\";\n\n\nexport default function buildFFT(curve, groupName) {\n const G = curve[groupName];\n const Fr = curve.Fr;\n const tm = G.tm;\n async function _fft(buff, inverse, inType, outType, logger, loggerTxt) {\n\n inType = inType || \"affine\";\n outType = outType || \"affine\";\n const MAX_BITS_THREAD = 14;\n\n let sIn, sMid, sOut, fnIn2Mid, fnMid2Out, fnFFTMix, fnFFTJoin, fnFFTFinal, fnReversePermutation;\n if (groupName == \"G1\") {\n if (inType == \"affine\") {\n sIn = G.F.n8*2;\n fnIn2Mid = \"g1m_batchToJacobian\";\n } else {\n sIn = G.F.n8*3;\n }\n sMid = G.F.n8*3;\n if (inverse) {\n fnFFTFinal = \"g1m_fftFinal\";\n }\n fnFFTJoin = \"g1m_fftJoin\";\n fnFFTMix = \"g1m_fftMix\";\n fnReversePermutation = \"g1m__reversePermutation\";\n\n if (outType == \"affine\") {\n sOut = G.F.n8*2;\n fnMid2Out = \"g1m_batchToAffine\";\n } else {\n sOut = G.F.n8*3;\n }\n\n } else if (groupName == \"G2\") {\n if (inType == \"affine\") {\n sIn = G.F.n8*2;\n fnIn2Mid = \"g2m_batchToJacobian\";\n } else {\n sIn = G.F.n8*3;\n }\n sMid = G.F.n8*3;\n if (inverse) {\n fnFFTFinal = \"g2m_fftFinal\";\n }\n fnFFTJoin = \"g2m_fftJoin\";\n fnFFTMix = \"g2m_fftMix\";\n fnReversePermutation = \"g2m__reversePermutation\";\n if (outType == \"affine\") {\n sOut = G.F.n8*2;\n fnMid2Out = \"g2m_batchToAffine\";\n } else {\n sOut = G.F.n8*3;\n }\n } else if (groupName == \"Fr\") {\n sIn = G.n8;\n sMid = G.n8;\n sOut = G.n8;\n if (inverse) {\n fnFFTFinal = \"frm_fftFinal\";\n }\n fnFFTMix = \"frm_fftMix\";\n fnFFTJoin = \"frm_fftJoin\";\n fnReversePermutation = \"frm__reversePermutation\";\n }\n\n\n let returnArray = false;\n if (Array.isArray(buff)) {\n buff = array2buffer(buff, sIn);\n returnArray = true;\n } else {\n buff = buff.slice(0, buff.byteLength);\n }\n\n console.log(\"FFT input size:\", buff.byteLength, \" bytes\");\n\n const nPoints = buff.byteLength / sIn;\n const bits = log2(nPoints);\n\n console.log(\"FFT points:\", nPoints, \" bits:\", bits);\n\n if ((1 << bits) != nPoints) {\n throw new Error(\"fft must be multiple of 2\" );\n }\n\n if (bits == Fr.s +1) {\n let buffOut;\n\n if (inverse) {\n buffOut = await _fftExtInv(buff, inType, outType, logger, loggerTxt);\n } else {\n buffOut = await _fftExt(buff, inType, outType, logger, loggerTxt);\n }\n\n if (returnArray) {\n return buffer2array(buffOut, sOut);\n } else {\n return buffOut;\n }\n }\n\n let inv;\n if (inverse) {\n inv = Fr.inv(Fr.e(nPoints));\n }\n\n let buffOut;\n\n console.log(\"fnReversePermutation:\", fnReversePermutation);\n\n const task = [];\n task.push({cmd: \"ALLOCSET\", var: 0, buff: buff});\n task.push({cmd: \"CALL\", fnName: fnReversePermutation, params: [{var:0}, {val: bits}]});\n task.push({ cmd: \"GET\", out: 0, var: 0, len: nPoints * sIn });\n const reversedBuff = await tm.queueAction(task, [buff.buffer]);\n\n buff = reversedBuff[0];\n\n let chunks;\n let pointsInChunk = Math.min(1 << MAX_BITS_THREAD, nPoints);\n let nChunks = nPoints / pointsInChunk;\n\n while ((nChunks < tm.concurrency)&&(pointsInChunk>=16)) {\n nChunks *= 2;\n pointsInChunk /= 2;\n }\n\n const l2Chunk = log2(pointsInChunk);\n\n const promises = [];\n if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${nChunks}`);\n for (let i = 0; i< nChunks; i++) {\n const task = [];\n task.push({cmd: \"ALLOC\", var: 0, len: sMid*pointsInChunk});\n const buffChunk = buff.slice( (pointsInChunk * i)*sIn, (pointsInChunk * (i+1))*sIn);\n task.push({cmd: \"SET\", var: 0, buff: buffChunk});\n if (fnIn2Mid) {\n task.push({cmd: \"CALL\", fnName:fnIn2Mid, params: [{var:0}, {val: pointsInChunk}, {var: 0}]});\n }\n for (let j=1; j<=l2Chunk;j++) {\n task.push({cmd: \"CALL\", fnName:fnFFTMix, params: [{var:0}, {val: pointsInChunk}, {val: j}]});\n }\n\n if (l2Chunk==bits) {\n if (fnFFTFinal) {\n task.push({cmd: \"ALLOCSET\", var: 1, buff: inv});\n task.push({cmd: \"CALL\", fnName: fnFFTFinal, params:[\n {var: 0},\n {val: pointsInChunk},\n {var: 1},\n ]});\n }\n if (fnMid2Out) {\n task.push({cmd: \"CALL\", fnName:fnMid2Out, params: [{var:0}, {val: pointsInChunk}, {var: 0}]});\n }\n task.push({cmd: \"GET\", out: 0, var: 0, len: pointsInChunk*sOut});\n } else {\n task.push({cmd: \"GET\", out:0, var: 0, len: sMid*pointsInChunk});\n }\n promises.push(tm.queueAction(task, [buffChunk.buffer]));\n }\n\n chunks = await Promise.all(promises);\n if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${nChunks}`);\n for (let i = 0; i< nChunks; i++) chunks[i] = chunks[i][0];\n\n for (let i = l2Chunk+1; i<=bits; i++) {\n if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`);\n const nGroups = 1 << (bits - i);\n const nChunksPerGroup = nChunks / nGroups;\n const opPromises = [];\n for (let j=0; j0; i--) {\n buffOut.set(chunks[i], p);\n p += pointsInChunk*sOut;\n delete chunks[i]; // Liberate mem\n }\n buffOut.set(chunks[0].slice(0, (pointsInChunk-1)*sOut), p);\n delete chunks[0];\n } else {\n for (let i=0; i (1<<28)) {\n buffOut = new BigBuffer(res1[0].byteLength*2);\n } else {\n buffOut = new Uint8Array(res1[0].byteLength*2);\n }\n\n buffOut.set(res1[0]);\n buffOut.set(res1[1], res1[0].byteLength);\n\n return buffOut;\n }\n\n async function _fftExtInv(buff, inType, outType, logger, loggerTxt) {\n let b1, b2;\n b1 = buff.slice( 0 , buff.byteLength/2);\n b2 = buff.slice( buff.byteLength/2, buff.byteLength);\n\n const promises = [];\n\n promises.push( _fft(b1, true, inType, \"jacobian\", logger, loggerTxt));\n promises.push( _fft(b2, true, inType, \"jacobian\", logger, loggerTxt));\n\n [b1, b2] = await Promise.all(promises);\n\n const res1 = await _fftJoinExt(b1, b2, \"fftJoinExtInv\", Fr.one, Fr.shiftInv, \"jacobian\", outType, logger, loggerTxt);\n\n let buffOut;\n if (res1[0].byteLength > (1<<28)) {\n buffOut = new BigBuffer(res1[0].byteLength*2);\n } else {\n buffOut = new Uint8Array(res1[0].byteLength*2);\n }\n\n buffOut.set(res1[0]);\n buffOut.set(res1[1], res1[0].byteLength);\n\n return buffOut;\n }\n\n\n async function _fftJoinExt(buff1, buff2, fn, first, inc, inType, outType, logger, loggerTxt) {\n const MAX_CHUNK_SIZE = 1<<16;\n const MIN_CHUNK_SIZE = 1<<4;\n\n let fnName;\n let fnIn2Mid, fnMid2Out;\n let sOut, sIn, sMid;\n\n if (groupName == \"G1\") {\n if (inType == \"affine\") {\n sIn = G.F.n8*2;\n fnIn2Mid = \"g1m_batchToJacobian\";\n } else {\n sIn = G.F.n8*3;\n }\n sMid = G.F.n8*3;\n fnName = \"g1m_\"+fn;\n if (outType == \"affine\") {\n fnMid2Out = \"g1m_batchToAffine\";\n sOut = G.F.n8*2;\n } else {\n sOut = G.F.n8*3;\n }\n } else if (groupName == \"G2\") {\n if (inType == \"affine\") {\n sIn = G.F.n8*2;\n fnIn2Mid = \"g2m_batchToJacobian\";\n } else {\n sIn = G.F.n8*3;\n }\n fnName = \"g2m_\"+fn;\n sMid = G.F.n8*3;\n if (outType == \"affine\") {\n fnMid2Out = \"g2m_batchToAffine\";\n sOut = G.F.n8*2;\n } else {\n sOut = G.F.n8*3;\n }\n } else if (groupName == \"Fr\") {\n sIn = Fr.n8;\n sOut = Fr.n8;\n sMid = Fr.n8;\n fnName = \"frm_\" + fn;\n } else {\n throw new Error(\"Invalid group\");\n }\n\n if (buff1.byteLength != buff2.byteLength) {\n throw new Error(\"Invalid buffer size\");\n }\n const nPoints = Math.floor(buff1.byteLength / sIn);\n if (nPoints != 1 << log2(nPoints)) {\n throw new Error(\"Invalid number of points\");\n }\n\n let chunkSize = Math.floor(nPoints /tm.concurrency);\n if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE;\n if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE;\n\n const opPromises = [];\n\n for (let i=0; i {\n if (logger) logger.debug(`${loggerTxt}: fftJoinExt End: ${i}/${nPoints}`);\n return r;\n })\n );\n }\n\n const result = await Promise.all(opPromises);\n\n let fullBuffOut1;\n let fullBuffOut2;\n if (nPoints * sOut > 1<<28) {\n fullBuffOut1 = new BigBuffer(nPoints*sOut);\n fullBuffOut2 = new BigBuffer(nPoints*sOut);\n } else {\n fullBuffOut1 = new Uint8Array(nPoints*sOut);\n fullBuffOut2 = new Uint8Array(nPoints*sOut);\n }\n\n let p =0;\n for (let i=0; i Fr.s+1) {\n if (logger) logger.error(\"lagrangeEvaluations input too big\");\n throw new Error(\"lagrangeEvaluations input too big\");\n }\n\n let t0 = buff.slice(0, buff.byteLength/2);\n let t1 = buff.slice(buff.byteLength/2, buff.byteLength);\n\n\n const shiftToSmallM = Fr.exp(Fr.shift, nPoints/2);\n const sConst = Fr.inv( Fr.sub(Fr.one, shiftToSmallM));\n\n [t0, t1] = await _fftJoinExt(t0, t1, \"prepareLagrangeEvaluation\", sConst, Fr.shiftInv, inType, \"jacobian\", logger, loggerTxt + \" prep\");\n\n const promises = [];\n\n promises.push( _fft(t0, true, \"jacobian\", outType, logger, loggerTxt + \" t0\"));\n promises.push( _fft(t1, true, \"jacobian\", outType, logger, loggerTxt + \" t1\"));\n\n [t0, t1] = await Promise.all(promises);\n\n let buffOut;\n if (t0.byteLength > (1<<28)) {\n buffOut = new BigBuffer(t0.byteLength*2);\n } else {\n buffOut = new Uint8Array(t0.byteLength*2);\n }\n\n buffOut.set(t0);\n buffOut.set(t1, t0.byteLength);\n\n return buffOut;\n };\n\n G.fftMix = async function fftMix(buff) {\n const sG = G.F.n8*3;\n let fnName, fnFFTJoin;\n if (groupName == \"G1\") {\n fnName = \"g1m_fftMix\";\n fnFFTJoin = \"g1m_fftJoin\";\n } else if (groupName == \"G2\") {\n fnName = \"g2m_fftMix\";\n fnFFTJoin = \"g2m_fftJoin\";\n } else if (groupName == \"Fr\") {\n fnName = \"frm_fftMix\";\n fnFFTJoin = \"frm_fftJoin\";\n } else {\n throw new Error(\"Invalid group\");\n }\n\n const nPoints = Math.floor(buff.byteLength / sG);\n const power = log2(nPoints);\n\n let nChunks = 1 << log2(tm.concurrency);\n\n if (nPoints <= nChunks*2) nChunks = 1;\n\n const pointsPerChunk = nPoints / nChunks;\n\n const powerChunk = log2(pointsPerChunk);\n\n const opPromises = [];\n for (let i=0; i=0; i--) {\n fullBuffOut.set(result[i][0], p);\n p+=result[i][0].byteLength;\n }\n\n return fullBuffOut;\n };\n}\n","import WasmField1 from \"./wasm_field1.js\";\nimport WasmField2 from \"./wasm_field2.js\";\nimport WasmField3 from \"./wasm_field3.js\";\nimport WasmCurve from \"./wasm_curve.js\";\nimport buildThreadManager from \"./threadman.js\";\nimport * as Scalar from \"./scalar.js\";\nimport buildBatchApplyKey from \"./engine_applykey.js\";\nimport buildPairing from \"./engine_pairing.js\";\nimport buildMultiExp from \"./engine_multiexp.js\";\nimport buildFFT from \"./engine_fft.js\";\n\nexport default async function buildEngine(params) {\n\n const tm = await buildThreadManager(params.wasm, params.singleThread);\n\n\n const curve = {};\n\n curve.q = Scalar.e(params.wasm.q.toString());\n curve.r = Scalar.e(params.wasm.r.toString());\n curve.name = params.name;\n curve.tm = tm;\n curve.prePSize = params.wasm.prePSize;\n curve.preQSize = params.wasm.preQSize;\n curve.Fr = new WasmField1(tm, \"frm\", params.n8r, params.r);\n curve.F1 = new WasmField1(tm, \"f1m\", params.n8q, params.q);\n curve.F2 = new WasmField2(tm, \"f2m\", curve.F1);\n curve.G1 = new WasmCurve(tm, \"g1m\", curve.F1, params.wasm.pG1gen, params.wasm.pG1b, params.cofactorG1);\n curve.G2 = new WasmCurve(tm, \"g2m\", curve.F2, params.wasm.pG2gen, params.wasm.pG2b, params.cofactorG2);\n curve.F6 = new WasmField3(tm, \"f6m\", curve.F2);\n curve.F12 = new WasmField2(tm, \"ftm\", curve.F6);\n\n curve.Gt = curve.F12;\n\n buildBatchApplyKey(curve, \"G1\");\n buildBatchApplyKey(curve, \"G2\");\n buildBatchApplyKey(curve, \"Fr\");\n\n buildMultiExp(curve, \"G1\");\n buildMultiExp(curve, \"G2\");\n\n buildFFT(curve, \"G1\");\n buildFFT(curve, \"G2\");\n buildFFT(curve, \"Fr\");\n\n buildPairing(curve);\n\n curve.array2buffer = function(arr, sG) {\n const buff = new Uint8Array(sG*arr.length);\n\n for (let i=0; i.\n*/\n\nexport function toNumber(n) {\n return BigInt(n);\n}\n\nexport function isNegative(n) {\n return n < 0n;\n}\n\nexport function isZero(n) {\n return n === 0n;\n}\n\nexport function bitLength(n) {\n if (isNegative(n)) {\n return n.toString(2).length - 1; // discard the - sign\n } else {\n return n.toString(2).length;\n }\n}\n\nexport function u32(n) {\n const b = [];\n const v = toNumber(n);\n b.push(Number(v & 0xFFn));\n b.push(Number(v >> 8n & 0xFFn));\n b.push(Number(v >> 16n & 0xFFn));\n b.push(Number(v >> 24n & 0xFFn));\n return b;\n}\n\nexport function u64(n) {\n const b = [];\n const v = toNumber(n);\n b.push(Number(v & 0xFFn));\n b.push(Number(v >> 8n & 0xFFn));\n b.push(Number(v >> 16n & 0xFFn));\n b.push(Number(v >> 24n & 0xFFn));\n b.push(Number(v >> 32n & 0xFFn));\n b.push(Number(v >> 40n & 0xFFn));\n b.push(Number(v >> 48n & 0xFFn));\n b.push(Number(v >> 56n & 0xFFn));\n return b;\n}\n\nexport function toUTF8Array(str) {\n var utf8 = [];\n for (var i=0; i < str.length; i++) {\n var charcode = str.charCodeAt(i);\n if (charcode < 0x80) utf8.push(charcode);\n else if (charcode < 0x800) {\n utf8.push(0xc0 | (charcode >> 6),\n 0x80 | (charcode & 0x3f));\n }\n else if (charcode < 0xd800 || charcode >= 0xe000) {\n utf8.push(0xe0 | (charcode >> 12),\n 0x80 | ((charcode>>6) & 0x3f),\n 0x80 | (charcode & 0x3f));\n }\n // surrogate pair\n else {\n i++;\n // UTF-16 encodes 0x10000-0x10FFFF by\n // subtracting 0x10000 and splitting the\n // 20 bits of 0x0-0xFFFFF into two halves\n charcode = 0x10000 + (((charcode & 0x3ff)<<10)\n | (str.charCodeAt(i) & 0x3ff));\n utf8.push(0xf0 | (charcode >>18),\n 0x80 | ((charcode>>12) & 0x3f),\n 0x80 | ((charcode>>6) & 0x3f),\n 0x80 | (charcode & 0x3f));\n }\n }\n return utf8;\n}\n\nexport function string(str) {\n const bytes = toUTF8Array(str);\n return [ ...varuint32(bytes.length), ...bytes ];\n}\n\nexport function varuint(n) {\n const code = [];\n let v = toNumber(n);\n if (isNegative(v)) throw new Error(\"Number cannot be negative\");\n while (!isZero(v)) {\n code.push(Number(v & 0x7Fn));\n v = v >> 7n;\n }\n if (code.length==0) code.push(0);\n for (let i=0; i 0xFFFFFFFFn) throw new Error(\"Number too big\");\n if (v > 0x7FFFFFFFn) v = v - 0x100000000n;\n // bigInt(\"-80000000\", 16) as base10\n if (v < -2147483648n) throw new Error(\"Number too small\");\n return varint(v);\n}\n\nexport function varint64(n) {\n let v = toNumber(n);\n if (v > 0xFFFFFFFFFFFFFFFFn) throw new Error(\"Number too big\");\n if (v > 0x7FFFFFFFFFFFFFFFn) v = v - 0x10000000000000000n;\n // bigInt(\"-8000000000000000\", 16) as base10\n if (v < -9223372036854775808n) throw new Error(\"Number too small\");\n return varint(v);\n}\n\nexport function varuint32(n) {\n let v = toNumber(n);\n if (v > 0xFFFFFFFFn) throw new Error(\"Number too big\");\n return varuint(v);\n}\n\nexport function varuint64(n) {\n let v = toNumber(n);\n if (v > 0xFFFFFFFFFFFFFFFFn) throw new Error(\"Number too big\");\n return varuint(v);\n}\n\nexport function toHexString(byteArray) {\n return Array.from(byteArray, function(byte) {\n return (\"0\" + (byte & 0xFF).toString(16)).slice(-2);\n }).join(\"\");\n}\n\nexport function ident(text) {\n if (typeof text === \"string\") {\n let lines = text.split(\"\\n\");\n for (let i=0; i.\n*/\n\nimport * as utils from \"./utils.js\";\n\nexport class CodeBuilder {\n constructor(func) {\n this.func = func;\n this.functionName = func.functionName;\n this.module = func.module;\n }\n\n setLocal(localName, valCode) {\n const idx = this.func.localIdxByName[localName];\n if (idx === undefined)\n throw new Error(`Local Variable not defined: Function: ${this.functionName} local: ${localName} `);\n return [...valCode, 0x21, ...utils.varuint32( idx )];\n }\n\n teeLocal(localName, valCode) {\n const idx = this.func.localIdxByName[localName];\n if (idx === undefined)\n throw new Error(`Local Variable not defined: Function: ${this.functionName} local: ${localName} `);\n return [...valCode, 0x22, ...utils.varuint32( idx )];\n }\n\n getLocal(localName) {\n const idx = this.func.localIdxByName[localName];\n if (idx === undefined)\n throw new Error(`Local Variable not defined: Function: ${this.functionName} local: ${localName} `);\n return [0x20, ...utils.varuint32( idx )];\n }\n\n i64_load8_s(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 0 : _align; // 8 bits alignment by default\n return [...idxCode, 0x30, align, ...utils.varuint32(offset)];\n }\n\n i64_load8_u(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 0 : _align; // 8 bits alignment by default\n return [...idxCode, 0x31, align, ...utils.varuint32(offset)];\n }\n\n i64_load16_s(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 1 : _align; // 16 bits alignment by default\n return [...idxCode, 0x32, align, ...utils.varuint32(offset)];\n }\n\n i64_load16_u(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 1 : _align; // 16 bits alignment by default\n return [...idxCode, 0x33, align, ...utils.varuint32(offset)];\n }\n\n i64_load32_s(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 2 : _align; // 32 bits alignment by default\n return [...idxCode, 0x34, align, ...utils.varuint32(offset)];\n }\n\n i64_load32_u(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 2 : _align; // 32 bits alignment by default\n return [...idxCode, 0x35, align, ...utils.varuint32(offset)];\n }\n\n i64_load(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 3 : _align; // 64 bits alignment by default\n return [...idxCode, 0x29, align, ...utils.varuint32(offset)];\n }\n\n\n i64_store(idxCode, _offset, _align, _codeVal) {\n let offset, align, codeVal;\n if (Array.isArray(_offset)) {\n offset = 0;\n align = 3;\n codeVal = _offset;\n } else if (Array.isArray(_align)) {\n offset = _offset;\n align = 3;\n codeVal = _align;\n } else if (Array.isArray(_codeVal)) {\n offset = _offset;\n align = _align;\n codeVal = _codeVal;\n }\n return [...idxCode, ...codeVal, 0x37, align, ...utils.varuint32(offset)];\n }\n\n i64_store32(idxCode, _offset, _align, _codeVal) {\n let offset, align, codeVal;\n if (Array.isArray(_offset)) {\n offset = 0;\n align = 2;\n codeVal = _offset;\n } else if (Array.isArray(_align)) {\n offset = _offset;\n align = 2;\n codeVal = _align;\n } else if (Array.isArray(_codeVal)) {\n offset = _offset;\n align = _align;\n codeVal = _codeVal;\n }\n return [...idxCode, ...codeVal, 0x3e, align, ...utils.varuint32(offset)];\n }\n\n\n i64_store16(idxCode, _offset, _align, _codeVal) {\n let offset, align, codeVal;\n if (Array.isArray(_offset)) {\n offset = 0;\n align = 1;\n codeVal = _offset;\n } else if (Array.isArray(_align)) {\n offset = _offset;\n align = 1;\n codeVal = _align;\n } else if (Array.isArray(_codeVal)) {\n offset = _offset;\n align = _align;\n codeVal = _codeVal;\n }\n return [...idxCode, ...codeVal, 0x3d, align, ...utils.varuint32(offset)];\n }\n\n\n i64_store8(idxCode, _offset, _align, _codeVal) {\n let offset, align, codeVal;\n if (Array.isArray(_offset)) {\n offset = 0;\n align = 0;\n codeVal = _offset;\n } else if (Array.isArray(_align)) {\n offset = _offset;\n align = 0;\n codeVal = _align;\n } else if (Array.isArray(_codeVal)) {\n offset = _offset;\n align = _align;\n codeVal = _codeVal;\n }\n return [...idxCode, ...codeVal, 0x3c, align, ...utils.varuint32(offset)];\n }\n\n i32_load8_s(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 0 : _align; // 32 bits alignment by default\n return [...idxCode, 0x2c, align, ...utils.varuint32(offset)];\n }\n\n i32_load8_u(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 0 : _align; // 32 bits alignment by default\n return [...idxCode, 0x2d, align, ...utils.varuint32(offset)];\n }\n\n i32_load16_s(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 1 : _align; // 32 bits alignment by default\n return [...idxCode, 0x2e, align, ...utils.varuint32(offset)];\n }\n\n i32_load16_u(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 1 : _align; // 32 bits alignment by default\n return [...idxCode, 0x2f, align, ...utils.varuint32(offset)];\n }\n\n i32_load(idxCode, _offset, _align) {\n const offset = _offset || 0;\n const align = (_align === undefined) ? 2 : _align; // 32 bits alignment by default\n return [...idxCode, 0x28, align, ...utils.varuint32(offset)];\n }\n\n i32_store(idxCode, _offset, _align, _codeVal) {\n let offset, align, codeVal;\n if (Array.isArray(_offset)) {\n offset = 0;\n align = 2;\n codeVal = _offset;\n } else if (Array.isArray(_align)) {\n offset = _offset;\n align = 2;\n codeVal = _align;\n } else if (Array.isArray(_codeVal)) {\n offset = _offset;\n align = _align;\n codeVal = _codeVal;\n }\n return [...idxCode, ...codeVal, 0x36, align, ...utils.varuint32(offset)];\n }\n\n\n i32_store16(idxCode, _offset, _align, _codeVal) {\n let offset, align, codeVal;\n if (Array.isArray(_offset)) {\n offset = 0;\n align = 1;\n codeVal = _offset;\n } else if (Array.isArray(_align)) {\n offset = _offset;\n align = 1;\n codeVal = _align;\n } else if (Array.isArray(_codeVal)) {\n offset = _offset;\n align = _align;\n codeVal = _codeVal;\n }\n return [...idxCode, ...codeVal, 0x3b, align, ...utils.varuint32(offset)];\n }\n\n i32_store8(idxCode, _offset, _align, _codeVal) {\n let offset, align, codeVal;\n if (Array.isArray(_offset)) {\n offset = 0;\n align = 0;\n codeVal = _offset;\n } else if (Array.isArray(_align)) {\n offset = _offset;\n align = 0;\n codeVal = _align;\n } else if (Array.isArray(_codeVal)) {\n offset = _offset;\n align = _align;\n codeVal = _codeVal;\n }\n return [...idxCode, ...codeVal, 0x3a, align, ...utils.varuint32(offset)];\n }\n\n call(fnName, ...args) {\n const idx = this.module.functionIdxByName[fnName];\n if (idx === undefined)\n throw new Error(`Function not defined: Function: ${fnName}`);\n return [...[].concat(...args), 0x10, ...utils.varuint32(idx)];\n }\n\n call_indirect(fnIdx, ...args) {\n return [...[].concat(...args), ...fnIdx, 0x11, 0, 0];\n }\n\n if(condCode, thenCode, elseCode) {\n if (elseCode) {\n return [...condCode, 0x04, 0x40, ...thenCode, 0x05, ...elseCode, 0x0b];\n } else {\n return [...condCode, 0x04, 0x40, ...thenCode, 0x0b];\n }\n }\n\n block(bCode) { return [0x02, 0x40, ...bCode, 0x0b]; }\n loop(...args) {\n return [0x03, 0x40, ...[].concat(...[...args]), 0x0b];\n }\n br_if(relPath, condCode) { return [...condCode, 0x0d, ...utils.varuint32(relPath)]; }\n br(relPath) { return [0x0c, ...utils.varuint32(relPath)]; }\n ret(rCode) { return [...rCode, 0x0f]; }\n drop(dCode) { return [...dCode, 0x1a]; }\n\n i64_const(num) { return [0x42, ...utils.varint64(num)]; }\n i32_const(num) { return [0x41, ...utils.varint32(num)]; }\n\n\n i64_eqz(opcode) { return [...opcode, 0x50]; }\n i64_eq(op1code, op2code) { return [...op1code, ...op2code, 0x51]; }\n i64_ne(op1code, op2code) { return [...op1code, ...op2code, 0x52]; }\n i64_lt_s(op1code, op2code) { return [...op1code, ...op2code, 0x53]; }\n i64_lt_u(op1code, op2code) { return [...op1code, ...op2code, 0x54]; }\n i64_gt_s(op1code, op2code) { return [...op1code, ...op2code, 0x55]; }\n i64_gt_u(op1code, op2code) { return [...op1code, ...op2code, 0x56]; }\n i64_le_s(op1code, op2code) { return [...op1code, ...op2code, 0x57]; }\n i64_le_u(op1code, op2code) { return [...op1code, ...op2code, 0x58]; }\n i64_ge_s(op1code, op2code) { return [...op1code, ...op2code, 0x59]; }\n i64_ge_u(op1code, op2code) { return [...op1code, ...op2code, 0x5a]; }\n i64_add(op1code, op2code) { return [...op1code, ...op2code, 0x7c]; }\n i64_sub(op1code, op2code) { return [...op1code, ...op2code, 0x7d]; }\n i64_mul(op1code, op2code) { return [...op1code, ...op2code, 0x7e]; }\n i64_div_s(op1code, op2code) { return [...op1code, ...op2code, 0x7f]; }\n i64_div_u(op1code, op2code) { return [...op1code, ...op2code, 0x80]; }\n i64_rem_s(op1code, op2code) { return [...op1code, ...op2code, 0x81]; }\n i64_rem_u(op1code, op2code) { return [...op1code, ...op2code, 0x82]; }\n i64_and(op1code, op2code) { return [...op1code, ...op2code, 0x83]; }\n i64_or(op1code, op2code) { return [...op1code, ...op2code, 0x84]; }\n i64_xor(op1code, op2code) { return [...op1code, ...op2code, 0x85]; }\n i64_shl(op1code, op2code) { return [...op1code, ...op2code, 0x86]; }\n i64_shr_s(op1code, op2code) { return [...op1code, ...op2code, 0x87]; }\n i64_shr_u(op1code, op2code) { return [...op1code, ...op2code, 0x88]; }\n i64_extend_i32_s(op1code) { return [...op1code, 0xac]; }\n i64_extend_i32_u(op1code) { return [...op1code, 0xad]; }\n i64_clz(op1code) { return [...op1code, 0x79]; }\n i64_ctz(op1code) { return [...op1code, 0x7a]; }\n\n i32_eqz(op1code) { return [...op1code, 0x45]; }\n i32_eq(op1code, op2code) { return [...op1code, ...op2code, 0x46]; }\n i32_ne(op1code, op2code) { return [...op1code, ...op2code, 0x47]; }\n i32_lt_s(op1code, op2code) { return [...op1code, ...op2code, 0x48]; }\n i32_lt_u(op1code, op2code) { return [...op1code, ...op2code, 0x49]; }\n i32_gt_s(op1code, op2code) { return [...op1code, ...op2code, 0x4a]; }\n i32_gt_u(op1code, op2code) { return [...op1code, ...op2code, 0x4b]; }\n i32_le_s(op1code, op2code) { return [...op1code, ...op2code, 0x4c]; }\n i32_le_u(op1code, op2code) { return [...op1code, ...op2code, 0x4d]; }\n i32_ge_s(op1code, op2code) { return [...op1code, ...op2code, 0x4e]; }\n i32_ge_u(op1code, op2code) { return [...op1code, ...op2code, 0x4f]; }\n i32_add(op1code, op2code) { return [...op1code, ...op2code, 0x6a]; }\n i32_sub(op1code, op2code) { return [...op1code, ...op2code, 0x6b]; }\n i32_mul(op1code, op2code) { return [...op1code, ...op2code, 0x6c]; }\n i32_div_s(op1code, op2code) { return [...op1code, ...op2code, 0x6d]; }\n i32_div_u(op1code, op2code) { return [...op1code, ...op2code, 0x6e]; }\n i32_rem_s(op1code, op2code) { return [...op1code, ...op2code, 0x6f]; }\n i32_rem_u(op1code, op2code) { return [...op1code, ...op2code, 0x70]; }\n i32_and(op1code, op2code) { return [...op1code, ...op2code, 0x71]; }\n i32_or(op1code, op2code) { return [...op1code, ...op2code, 0x72]; }\n i32_xor(op1code, op2code) { return [...op1code, ...op2code, 0x73]; }\n i32_shl(op1code, op2code) { return [...op1code, ...op2code, 0x74]; }\n i32_shr_s(op1code, op2code) { return [...op1code, ...op2code, 0x75]; }\n i32_shr_u(op1code, op2code) { return [...op1code, ...op2code, 0x76]; }\n i32_rotl(op1code, op2code) { return [...op1code, ...op2code, 0x77]; }\n i32_rotr(op1code, op2code) { return [...op1code, ...op2code, 0x78]; }\n i32_wrap_i64(op1code) { return [...op1code, 0xa7]; }\n i32_clz(op1code) { return [...op1code, 0x67]; }\n i32_ctz(op1code) { return [...op1code, 0x68]; }\n\n unreachable() { return [ 0x0 ]; }\n\n current_memory() { return [ 0x3f, 0]; }\n\n comment() { return []; }\n}\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmbuilder\n\n wasmbuilder is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmbuilder is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmbuilder. If not, see .\n*/\n\nimport { CodeBuilder } from \"./codebuilder.js\";\nimport * as utils from \"./utils.js\";\n\nconst typeCodes = {\n \"i32\": 0x7f,\n \"i64\": 0x7e,\n \"f32\": 0x7d,\n \"f64\": 0x7c,\n \"anyfunc\": 0x70,\n \"func\": 0x60,\n \"emptyblock\": 0x40\n};\n\n\nexport class FunctionBuilder {\n\n constructor (module, fnName, fnType, moduleName, fieldName) {\n if (fnType == \"import\") {\n this.fnType = \"import\";\n this.moduleName = moduleName;\n this.fieldName = fieldName;\n } else if (fnType == \"internal\") {\n this.fnType = \"internal\";\n } else {\n throw new Error(\"Invalid function fnType: \" + fnType);\n }\n this.module = module;\n this.fnName = fnName;\n this.params = [];\n this.locals = [];\n this.localIdxByName = {};\n this.code = [];\n this.returnType = null;\n this.nextLocal =0;\n }\n\n addParam(paramName, paramType) {\n if (this.localIdxByName[paramName])\n throw new Error(`param already exists. Function: ${this.fnName}, Param: ${paramName} `);\n const idx = this.nextLocal++;\n this.localIdxByName[paramName] = idx;\n this.params.push({\n type: paramType\n });\n }\n\n addLocal(localName, localType, _length) {\n const length = _length || 1;\n if (this.localIdxByName[localName])\n throw new Error(`local already exists. Function: ${this.fnName}, Param: ${localName} `);\n const idx = this.nextLocal++;\n this.localIdxByName[localName] = idx;\n this.locals.push({\n type: localType,\n length: length\n });\n }\n\n setReturnType(returnType) {\n if (this.returnType)\n throw new Error(`returnType already defined. Function: ${this.fnName}`);\n this.returnType = returnType;\n }\n\n getSignature() {\n const params = [...utils.varuint32(this.params.length), ...this.params.map((p) => typeCodes[p.type])];\n const returns = this.returnType ? [0x01, typeCodes[this.returnType]] : [0];\n return [0x60, ...params, ...returns];\n }\n\n getBody() {\n const locals = this.locals.map((l) => [\n ...utils.varuint32(l.length),\n typeCodes[l.type]\n ]);\n\n const body = [\n ...utils.varuint32(this.locals.length),\n ...[].concat(...locals),\n ...this.code,\n 0x0b\n ];\n return [\n ...utils.varuint32(body.length),\n ...body\n ];\n }\n\n addCode(...code) {\n this.code.push(...[].concat(...[...code]));\n }\n\n getCodeBuilder() {\n return new CodeBuilder(this);\n }\n}\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmbuilder\n\n wasmbuilder is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmbuilder is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmbuilder. If not, see .\n*/\n\n\nimport { FunctionBuilder } from \"./functionbuilder.js\";\nimport * as utils from \"./utils.js\";\n\nexport class ModuleBuilder {\n\n constructor() {\n this.functions = [];\n this.functionIdxByName = {};\n this.nImportFunctions = 0;\n this.nInternalFunctions =0;\n this.memory = {\n pagesSize: 1,\n moduleName: \"env\",\n fieldName: \"memory\"\n };\n this.free = 8;\n this.datas = [];\n this.modules = {};\n this.exports = [];\n this.functionsTable = [];\n }\n\n build() {\n this._setSignatures();\n return new Uint8Array([\n ...utils.u32(0x6d736100),\n ...utils.u32(1),\n ...this._buildType(),\n ...this._buildImport(),\n ...this._buildFunctionDeclarations(),\n ...this._buildFunctionsTable(),\n ...this._buildExports(),\n ...this._buildElements(),\n ...this._buildCode(),\n ...this._buildData()\n ]);\n }\n\n addFunction(fnName) {\n if (typeof(this.functionIdxByName[fnName]) !== \"undefined\")\n throw new Error(`Function already defined: ${fnName}`);\n\n const idx = this.functions.length;\n this.functionIdxByName[fnName] = idx;\n\n this.functions.push(new FunctionBuilder(this, fnName, \"internal\"));\n\n this.nInternalFunctions++;\n return this.functions[idx];\n }\n\n addIimportFunction(fnName, moduleName, _fieldName) {\n if (typeof(this.functionIdxByName[fnName]) !== \"undefined\")\n throw new Error(`Function already defined: ${fnName}`);\n\n if ( (this.functions.length>0)\n &&(this.functions[this.functions.length-1].type == \"internal\"))\n throw new Error(`Import functions must be declared before internal: ${fnName}`);\n\n let fieldName = _fieldName || fnName;\n\n const idx = this.functions.length;\n this.functionIdxByName[fnName] = idx;\n\n this.functions.push(new FunctionBuilder(this, fnName, \"import\", moduleName, fieldName));\n\n this.nImportFunctions ++;\n return this.functions[idx];\n }\n\n setMemory(pagesSize, moduleName, fieldName) {\n this.memory = {\n pagesSize: pagesSize,\n moduleName: moduleName || \"env\",\n fieldName: fieldName || \"memory\"\n };\n }\n\n exportFunction(fnName, _exportName) {\n const exportName = _exportName || fnName;\n if (typeof(this.functionIdxByName[fnName]) === \"undefined\")\n throw new Error(`Function not defined: ${fnName}`);\n const idx = this.functionIdxByName[fnName];\n if (exportName != fnName) {\n this.functionIdxByName[exportName] = idx;\n }\n this.exports.push({\n exportName: exportName,\n idx: idx\n });\n }\n\n addFunctionToTable(fnName) {\n const idx = this.functionIdxByName[fnName];\n this.functionsTable.push(idx);\n }\n\n addData(offset, bytes) {\n this.datas.push({\n offset: offset,\n bytes: bytes\n });\n }\n\n alloc(a, b) {\n let size;\n let bytes;\n if ((Array.isArray(a) || ArrayBuffer.isView(a)) && (typeof(b) === \"undefined\")) {\n size = a.length;\n bytes = a;\n } else {\n size = a;\n bytes = b;\n }\n size = (((size-1)>>3) +1)<<3; // Align to 64 bits.\n const p = this.free;\n this.free += size;\n if (bytes) {\n this.addData(p, bytes);\n }\n return p;\n }\n\n allocString(s) {\n const encoder = new globalThis.TextEncoder();\n const uint8array = encoder.encode(s);\n return this.alloc([...uint8array, 0]);\n }\n\n _setSignatures() {\n this.signatures = [];\n const signatureIdxByName = {};\n if (this.functionsTable.length>0) {\n const signature = this.functions[this.functionsTable[0]].getSignature();\n const signatureName = \"s_\"+utils.toHexString(signature);\n signatureIdxByName[signatureName] = 0;\n this.signatures.push(signature);\n }\n for (let i=0; i.\n*/\n\nimport * as utils from \"./utils.js\";\n\nexport class CodeBuilderWat {\n constructor(func) {\n this.func = func;\n this.functionName = func.functionName;\n this.module = func.module;\n }\n\n setLocal(localName, valCode) {\n const idx = this.func.localIdxByName[localName];\n if (idx === undefined)\n throw new Error(`Local Variable not defined: Function: ${this.functionName} local: ${localName} `);\n return [valCode, `set_local $${localName}`];\n }\n\n teeLocal(localName, valCode) {\n const idx = this.func.localIdxByName[localName];\n if (idx === undefined)\n throw new Error(`Local Variable not defined: Function: ${this.functionName} local: ${localName} `);\n return [valCode, `tee_local $${localName}`];\n }\n\n getLocal(localName) {\n const idx = this.func.localIdxByName[localName];\n if (idx === undefined)\n throw new Error(`Local Variable not defined: Function: ${this.functionName} local: ${localName} `);\n return `get_local $${localName}`;\n }\n\n genLoad(inst, def_align, idxCode, _offset, _align) {\n let S = inst;\n const offset = _offset || 0;\n if (offset>0) S += ` offset=${offset}`;\n const align = (_align === undefined) ? def_align : _align; // 8 bits alignment by default\n if (align!=def_align) S += ` align=${1 << align}`;\n return [idxCode, S];\n }\n\n\n genStore(inst, def_align, idxCode, _offset, _align, _codeVal) {\n let offset, align, codeVal;\n if (typeof _align === \"undefined\") {\n offset = 0;\n align = def_align;\n codeVal = _offset;\n } else if (typeof _codeVal === \"undefined\") {\n offset = _offset;\n align = def_align;\n codeVal = _align;\n } else {\n offset = _offset;\n align = _align;\n codeVal = _codeVal;\n }\n let S = inst;\n if (offset>0) S += ` offset=${offset}`;\n if (align!=def_align) S += ` align=${1 << align}`;\n return [idxCode, codeVal, S];\n }\n\n i64_load8_s(idxCode, _offset, _align) {\n return this.genLoad(\"i64.load8_s\", 0, idxCode, _offset, _align);\n }\n\n i64_load8_u(idxCode, _offset, _align) {\n return this.genLoad(\"i64.load8_u\", 0, idxCode, _offset, _align);\n }\n\n i64_load16_s(idxCode, _offset, _align) {\n return this.genLoad(\"i64.load16_s\", 1,idxCode, _offset, _align);\n }\n\n i64_load16_u(idxCode, _offset, _align) {\n return this.genLoad(\"i64.load16_u\", 1, idxCode, _offset, _align);\n }\n\n i64_load32_s(idxCode, _offset, _align) {\n return this.genLoad(\"i64.load32_s\", 2, idxCode, _offset, _align);\n }\n\n i64_load32_u(idxCode, _offset, _align) {\n return this.genLoad(\"i64.load32_u\", 2, idxCode, _offset, _align);\n }\n\n i64_load(idxCode, _offset, _align) {\n return this.genLoad(\"i64.load\", 3, idxCode, _offset, _align);\n }\n\n\n i64_store(idxCode, _offset, _align, _codeVal) {\n return this.genStore(\"i64.store\", 3, idxCode, _offset, _align, _codeVal);\n }\n\n i64_store32(idxCode, _offset, _align, _codeVal) {\n return this.genStore(\"i64.store32\", 2, idxCode, _offset, _align, _codeVal);\n }\n\n i64_store16(idxCode, _offset, _align, _codeVal) {\n return this.genStore(\"i64.store16\", 1, idxCode, _offset, _align, _codeVal);\n }\n\n i64_store8(idxCode, _offset, _align, _codeVal) {\n return this.genStore(\"i64.store8\", 0, idxCode, _offset, _align, _codeVal);\n }\n\n i32_load8_s(idxCode, _offset, _align) {\n return this.genLoad(\"i32.load8_s\", 0, idxCode, _offset, _align);\n }\n\n i32_load8_u(idxCode, _offset, _align) {\n return this.genLoad(\"i32.load8_u\", 0, idxCode, _offset, _align);\n }\n\n i32_load16_s(idxCode, _offset, _align) {\n return this.genLoad(\"i32.load16_s\", 1, idxCode, _offset, _align);\n }\n\n i32_load16_u(idxCode, _offset, _align) {\n return this.genLoad(\"i32.load16_u\", 1, idxCode, _offset, _align);\n }\n\n i32_load(idxCode, _offset, _align) {\n return this.genLoad(\"i32.load\", 2, idxCode, _offset, _align);\n }\n\n i32_store(idxCode, _offset, _align, _codeVal) {\n return this.genStore(\"i32.store\", 2, idxCode, _offset, _align, _codeVal);\n }\n\n i32_store16(idxCode, _offset, _align, _codeVal) {\n return this.genStore(\"i32.store16\", 1, idxCode, _offset, _align, _codeVal);\n }\n\n i32_store8(idxCode, _offset, _align, _codeVal) {\n return this.genStore(\"i32.store8\", 0, idxCode, _offset, _align, _codeVal);\n }\n\n call(fnName, ...args) {\n const idx = this.module.functionIdxByName[fnName];\n if (idx === undefined)\n throw new Error(`Function not defined: Function: ${fnName}`);\n return [args, `call $${fnName}`];\n }\n\n call_indirect(fnIdx, ...args) {\n return [args, fnIdx, \"call_indirect (type 0)\"];\n }\n\n if(condCode, thenCode, elseCode) {\n if (elseCode) {\n return [condCode, \"if\", utils.ident(thenCode), \"else\", utils.ident(elseCode), \"end\"];\n } else {\n return [condCode, \"if\", utils.ident(thenCode), \"end\"];\n }\n }\n\n block(bCode) { return [\"block\", utils.ident(bCode), \"end\"]; }\n loop(...args) { return [\"loop\", utils.ident(args), \"end\"]; }\n br_if(relPath, condCode) { return [condCode, `br_if ${relPath}`]; }\n br(relPath) { return `br ${relPath}`; }\n ret(rCode) { return [rCode, \"return\"]; }\n drop(dCode) { return [dCode, \"drop\"]; }\n\n i64_const(num) { return `i64.const ${num}`; }\n i32_const(num) { return `i32.const ${num}`; }\n\n i64_eqz(opcode) { return [opcode, \"i64.eqz\"]; }\n i64_eq(op1code, op2code) { return [op1code, op2code, \"i64.eq\"]; }\n i64_ne(op1code, op2code) { return [op1code, op2code, \"i64.ne\"]; }\n i64_lt_s(op1code, op2code) { return [op1code, op2code, \"i64.lt_s\"]; }\n i64_lt_u(op1code, op2code) { return [op1code, op2code, \"i64.lt_u\"]; }\n i64_gt_s(op1code, op2code) { return [op1code, op2code, \"i64.gt_s\"]; }\n i64_gt_u(op1code, op2code) { return [op1code, op2code, \"i64.gt_u\"]; }\n i64_le_s(op1code, op2code) { return [op1code, op2code, \"i64.le_s\"]; }\n i64_le_u(op1code, op2code) { return [op1code, op2code, \"i64.le_u\"]; }\n i64_ge_s(op1code, op2code) { return [op1code, op2code, \"i64.ge_s\"]; }\n i64_ge_u(op1code, op2code) { return [op1code, op2code, \"i64.ge_u\"]; }\n i64_add(op1code, op2code) { return [op1code, op2code, \"i64.add\"]; }\n i64_sub(op1code, op2code) { return [op1code, op2code, \"i64.sub\"]; }\n i64_mul(op1code, op2code) { return [op1code, op2code, \"i64.mul\"]; }\n i64_div_s(op1code, op2code) { return [op1code, op2code, \"i64.div_s\"]; }\n i64_div_u(op1code, op2code) { return [op1code, op2code, \"i64.div_u\"]; }\n i64_rem_s(op1code, op2code) { return [op1code, op2code, \"i64.rem_s\"]; }\n i64_rem_u(op1code, op2code) { return [op1code, op2code, \"i64.rem_u\"]; }\n i64_and(op1code, op2code) { return [op1code, op2code, \"i64.and\"]; }\n i64_or(op1code, op2code) { return [op1code, op2code, \"i64.or\"]; }\n i64_xor(op1code, op2code) { return [op1code, op2code, \"i64.xor\"]; }\n i64_shl(op1code, op2code) { return [op1code, op2code, \"i64.shl\"]; }\n i64_shr_s(op1code, op2code) { return [op1code, op2code, \"i64.shr_s\"]; }\n i64_shr_u(op1code, op2code) { return [op1code, op2code, \"i64.shr_u\"]; }\n i64_extend_i32_s(op1code) { return [op1code, \"i64.extend_s/i32\"]; }\n i64_extend_i32_u(op1code) { return [op1code, \"i64.extend_u/i32\"]; }\n\n\n i32_eqz(op1code) { return [op1code, \"i32.eqz\"]; }\n i32_eq(op1code, op2code) { return [op1code, op2code, \"i32.eq\"]; }\n i32_ne(op1code, op2code) { return [op1code, op2code, \"i32.ne\"]; }\n i32_lt_s(op1code, op2code) { return [op1code, op2code, \"i32.lt_s\"]; }\n i32_lt_u(op1code, op2code) { return [op1code, op2code, \"i32.lt_u\"]; }\n i32_gt_s(op1code, op2code) { return [op1code, op2code, \"i32.gt_s\"]; }\n i32_gt_u(op1code, op2code) { return [op1code, op2code, \"i32.gt_u\"]; }\n i32_le_s(op1code, op2code) { return [op1code, op2code, \"i32.le_s\"]; }\n i32_le_u(op1code, op2code) { return [op1code, op2code, \"i32.le_u\"]; }\n i32_ge_s(op1code, op2code) { return [op1code, op2code, \"i32.ge_s\"]; }\n i32_ge_u(op1code, op2code) { return [op1code, op2code, \"i32.ge_u\"]; }\n i32_add(op1code, op2code) { return [op1code, op2code, \"i32.add\"]; }\n i32_sub(op1code, op2code) { return [op1code, op2code, \"i32.sub\"]; }\n i32_mul(op1code, op2code) { return [op1code, op2code, \"i32.mul\"]; }\n i32_div_s(op1code, op2code) { return [op1code, op2code, \"i32.div_s\"]; }\n i32_div_u(op1code, op2code) { return [op1code, op2code, \"i32.div_u\"]; }\n i32_rem_s(op1code, op2code) { return [op1code, op2code, \"i32.rem_s\"]; }\n i32_rem_u(op1code, op2code) { return [op1code, op2code, \"i32.rem_u\"]; }\n i32_and(op1code, op2code) { return [op1code, op2code, \"i32.and\"]; }\n i32_or(op1code, op2code) { return [op1code, op2code, \"i32.or\"]; }\n i32_xor(op1code, op2code) { return [op1code, op2code, \"i32.xor\"]; }\n i32_shl(op1code, op2code) { return [op1code, op2code, \"i32.shl\"]; }\n i32_shr_s(op1code, op2code) { return [op1code, op2code, \"i32.shr_s\"]; }\n i32_shr_u(op1code, op2code) { return [op1code, op2code, \"i32.shr_u\"]; }\n i32_rotl(op1code, op2code) { return [op1code, op2code, \"i32.rotl\"]; }\n i32_rotr(op1code, op2code) { return [op1code, op2code, \"i32.rotr\"]; }\n i32_wrap_i64(op1code) { return [op1code, \"i32.wrap/i64\"]; }\n\n ureachable() { return \"unreachable\"; }\n\n current_memory() { return \"current_memory\"; }\n\n comment(c) { return \";; \" + c; }\n\n}\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmbuilder\n\n wasmbuilder is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmbuilder is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmbuilder. If not, see .\n*/\n\nimport { CodeBuilderWat } from \"./codebuilder_wat.js\";\nimport * as utils from \"./utils.js\";\n\nexport class FunctionBuilderWat {\n\n constructor (module, fnName, fnType, moduleName, fieldName) {\n if (fnType == \"import\") {\n this.fnType = \"import\";\n this.moduleName = moduleName;\n this.fieldName = fieldName;\n } else if (fnType == \"internal\") {\n this.fnType = \"internal\";\n this.comment = moduleName;\n } else {\n throw new Error(\"Invalid function fnType: \" + fnType);\n }\n this.module = module;\n this.fnName = fnName;\n this.params = [];\n this.locals = [];\n this.localIdxByName = {};\n this.code = [];\n this.returnType = null;\n this.nextLocal =0;\n }\n\n addParam(paramName, paramType) {\n if (this.localIdxByName[paramName])\n throw new Error(`param already exists. Function: ${this.fnName}, Param: ${paramName} `);\n const idx = this.nextLocal++;\n this.localIdxByName[paramName] = idx;\n this.params.push({\n type: paramType,\n name: paramName\n });\n }\n\n addLocal(localName, localType, _length) {\n if ((typeof _length != \"undefined\") && (_length != 1)) {\n throw new Error(\"Locals greater than 1 not implemented\");\n }\n if (this.localIdxByName[localName])\n throw new Error(`local already exists. Function: ${this.fnName}, Param: ${localName} `);\n const idx = this.nextLocal++;\n this.localIdxByName[localName] = idx;\n this.locals.push({\n type: localType,\n name: localName,\n });\n }\n\n setReturnType(returnType) {\n if (this.returnType)\n throw new Error(`returnType already defined. Function: ${this.fnName}`);\n this.returnType = returnType;\n }\n\n getSignature() {\n let p = \"\";\n for (let i=0; i.\n*/\n\n\nimport { FunctionBuilderWat } from \"./functionbuilder_wat.js\";\nimport * as utils from \"./utils.js\";\n\nexport class ModuleBuilderWat {\n\n constructor() {\n this.functions = [];\n this.functionIdxByName = {};\n this.nImportFunctions = 0;\n this.nInternalFunctions =0;\n this.memory = {\n pagesSize: 1,\n moduleName: \"env\",\n fieldName: \"memory\"\n };\n this.free = 8;\n this.datas = [];\n this.modules = {};\n this.exports = [];\n this.functionsTable = [];\n }\n\n build() {\n const src = [];\n this._setSignatures();\n src.push(this._buildType());\n src.push(this._buildImport());\n if (this.functionsTable.length>0) {\n src.push(this._buildFunctionsTable());\n }\n if (this.exports.length > 0) {\n src.push(this._buildExports());\n }\n if (this.functionsTable.length>0) {\n src.push(this._buildElements());\n }\n if (this.nInternalFunctions>0) {\n src.push(this._buildFunctions());\n }\n src.push(this._buildData());\n return [\n \"(module\",\n utils.ident(src),\n \")\"\n ];\n }\n\n addFunction(fnName, comment) {\n if (typeof(this.functionIdxByName[fnName]) !== \"undefined\")\n throw new Error(`Function already defined: ${fnName}`);\n\n const idx = this.functions.length;\n this.functionIdxByName[fnName] = idx;\n\n this.functions.push(new FunctionBuilderWat(this, fnName, \"internal\", comment));\n\n this.nInternalFunctions++;\n return this.functions[idx];\n }\n\n addIimportFunction(fnName, moduleName, _fieldName) {\n if (typeof(this.functionIdxByName[fnName]) !== \"undefined\")\n throw new Error(`Function already defined: ${fnName}`);\n\n if ( (this.functions.length>0)\n &&(this.functions[this.functions.length-1].type == \"internal\"))\n throw new Error(`Import functions must be declared before internal: ${fnName}`);\n\n let fieldName = _fieldName || fnName;\n\n const idx = this.functions.length;\n this.functionIdxByName[fnName] = idx;\n\n this.functions.push(new FunctionBuilderWat(this, fnName, \"import\", moduleName, fieldName));\n\n this.nImportFunctions ++;\n return this.functions[idx];\n }\n\n setMemory(pagesSize, moduleName, fieldName) {\n this.memory = {\n pagesSize: pagesSize,\n moduleName: moduleName || \"env\",\n fieldName: fieldName || \"memory\"\n };\n }\n\n exportFunction(fnName, _exportName) {\n const exportName = _exportName || fnName;\n if (typeof(this.functionIdxByName[fnName]) === \"undefined\")\n throw new Error(`Function not defined: ${fnName}`);\n const idx = this.functionIdxByName[fnName];\n if (exportName != fnName) {\n this.functionIdxByName[exportName] = idx;\n }\n this.exports.push({\n exportName: exportName,\n idx: idx\n });\n }\n\n addFunctionToTable(fnName) {\n const idx = this.functionIdxByName[fnName];\n this.functionsTable.push(idx);\n }\n\n addData(offset, bytes) {\n this.datas.push({\n offset: offset,\n bytes: bytes\n });\n }\n\n alloc(a, b) {\n let size;\n let bytes;\n if ((Array.isArray(a) || ArrayBuffer.isView(a)) && (typeof(b) === \"undefined\")) {\n size = a.length;\n bytes = a;\n } else {\n size = a;\n bytes = b;\n }\n size = (((size-1)>>3) +1)<<3; // Align to 64 bits.\n const p = this.free;\n this.free += size;\n if (bytes) {\n this.addData(p, bytes);\n }\n return p;\n }\n\n allocString(s) {\n const encoder = new TextEncoder();\n const uint8array = encoder.encode(s);\n return this.alloc([...uint8array, 0]);\n }\n\n _setSignatures() {\n this.signatures = [];\n const signatureIdxByName = {};\n if (this.functionsTable.length>0) {\n const signature = this.functions[this.functionsTable[0]].getSignature();\n const signatureName = this.functions[this.functionsTable[0]].getSignatureName();\n signatureIdxByName[signatureName] = 0;\n this.signatures.push(signature);\n }\n for (let i=0; i126 || b[i] == 34 || b[i]==92) {\n let h=b[i].toString(16);\n while (h.length<2) h = \"0\"+h;\n S += \"\\\\\" + h;\n } else {\n S += String.fromCharCode(b[i]);\n }\n }\n S += \"\\\"\";\n return S;\n }\n }\n\n}\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of websnark (Web Assembly zkSnark Prover).\n\n websnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n websnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with websnark. If not, see .\n*/\n\nimport { ModuleBuilder } from \"./modulebuilder.js\";\n\nexport async function buildProtoboard(builder, defBytes, bitsPerBytes) {\n const protoboard = new Protoboard();\n\n protoboard.defBytes = defBytes;\n protoboard.bitsPerBytes = bitsPerBytes || 32;\n\n protoboard.memory = new WebAssembly.Memory({initial:20000});\n protoboard.i32 = new Uint32Array(protoboard.memory.buffer);\n protoboard.i8 = new Uint8Array(protoboard.memory.buffer);\n\n const moduleBuilder = new ModuleBuilder();\n\n const fLog32 = moduleBuilder.addIimportFunction(\"debug_log32\", \"debug\", \"log32\");\n fLog32.addParam(\"x\", \"i32\");\n const fLog64 = moduleBuilder.addIimportFunction(\"debug_log64\", \"debug\", \"log64\");\n fLog64.addParam(\"x\", \"i32\");\n fLog64.addParam(\"y\", \"i32\");\n\n buildLog32(moduleBuilder);\n buildLog64(moduleBuilder);\n\n builder(moduleBuilder, protoboard);\n\n\n const code = moduleBuilder.build();\n\n const wasmModule = await WebAssembly.compile(code);\n\n protoboard.log = console.log;\n\n protoboard.instance = await WebAssembly.instantiate(wasmModule, {\n env: {\n \"memory\": protoboard.memory\n },\n debug: {\n log32: function (c1) {\n if (c1<0) c1 = 0x100000000+c1;\n let s=c1.toString(16);\n while (s.length<8) s = \"0\"+s;\n protoboard.log(s + \": \" + c1.toString());\n },\n log64: function (c1, c2) {\n if (c1<0) c1 = 0x100000000+c1;\n if (c2<0) c2 = 0x100000000+c2;\n const n = BigInt(c1) + (BigInt(c2) << 32n);\n let s=n.toString(16);\n while (s.length<16) s = \"0\"+s;\n protoboard.log(s + \": \" + n.toString());\n }\n }\n });\n\n Object.assign(protoboard, protoboard.instance.exports);\n Object.assign(protoboard, moduleBuilder.modules);\n\n return protoboard;\n\n function buildLog32(module) {\n\n const f = module.addFunction(\"log32\");\n f.addParam(\"x\", \"i32\");\n\n const c = f.getCodeBuilder();\n f.addCode(c.call(\"debug_log32\", c.getLocal(\"x\")));\n }\n\n function buildLog64(module) {\n\n const f = module.addFunction(\"log64\");\n f.addParam(\"x\", \"i64\");\n\n const c = f.getCodeBuilder();\n f.addCode(c.call(\n \"debug_log64\",\n c.i32_wrap_i64(c.getLocal(\"x\")),\n c.i32_wrap_i64(\n c.i64_shr_u(\n c.getLocal(\"x\"),\n c.i64_const(32)\n )\n )\n ));\n }\n\n}\n\nclass Protoboard {\n\n constructor() {\n\n }\n\n alloc(length) {\n if (typeof length === \"undefined\") {\n length = this.defBytes;\n }\n length = (((length-1)>>3) +1)<<3; // Align to 64 bits.\n\n const res = this.i32[0];\n this.i32[0] += length;\n return res;\n }\n\n set(pos, nums, nBytes) {\n if (!Array.isArray(nums)) {\n nums = [nums];\n }\n if (typeof nBytes === \"undefined\") {\n nBytes = this.defBytes;\n }\n\n const words = Math.floor((nBytes -1)/4)+1;\n let p = pos;\n\n const CHUNK = 1n << BigInt(this.bitsPerBytes);\n\n for (let i=0; i>2] = Number(remainder);\n v = quotient;\n p += 4;\n }\n if (v !== 0n) {\n throw new Error(\"Expected v to be 0\");\n }\n }\n\n return pos;\n }\n\n get(pos, nElements, nBytes) {\n if (typeof nBytes == \"undefined\") {\n if (typeof nElements == \"undefined\") {\n nElements = 1;\n nBytes = this.defBytes;\n } else {\n nElements = nBytes;\n nBytes = this.defBytes;\n }\n }\n\n const words = Math.floor((nBytes -1)/4)+1;\n\n const CHUNK = 1n << BigInt(this.bitsPerBytes);\n\n\n const nums = [];\n for (let i=0; i=0; j--) {\n acc = acc * CHUNK;\n let v = this.i32[(pos>>2)+j];\n if (this.bitsPerBytes <32) {\n if (v&0x80000000) v = v-0x100000000;\n }\n acc = acc + BigInt(v);\n }\n nums.push(acc);\n pos += words*4;\n }\n\n if (nums.length == 1) return nums[0];\n return nums;\n }\n}\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmbuilder\n\n wasmbuilder is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmbuilder is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmbuilder. If not, see .\n*/\n\nexport { ModuleBuilder } from \"./src/modulebuilder.js\";\nexport { ModuleBuilderWat } from \"./src/modulebuilder_wat.js\";\nexport { buildProtoboard } from \"./src/protoboard.js\";\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nexport function bigInt2BytesLE(_a, len) {\n const b = Array(len);\n let v = BigInt(_a);\n for (let i=0; i> 8n;\n }\n return b;\n}\n\nexport function bigInt2U32LE(_a, len) {\n const b = Array(len);\n let v = BigInt(_a);\n for (let i=0; i> 32n;\n }\n return b;\n}\n\nexport function isOcamNum(a) {\n if (!Array.isArray(a)) return false;\n if (a.length != 3) return false;\n if (typeof a[0] !== \"number\") return false;\n if (typeof a[1] !== \"number\") return false;\n if (!Array.isArray(a[2])) return false;\n return true;\n}\n\n\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nexport default function buildInt(module, n64, _prefix) {\n\n const prefix = _prefix || \"int\";\n if (module.modules[prefix]) return prefix; // already builded\n module.modules[prefix] = {};\n\n const n32 = n64*2;\n const n8 = n64*8;\n\n function buildCopy() {\n const f = module.addFunction(prefix+\"_copy\");\n f.addParam(\"px\", \"i32\");\n f.addParam(\"pr\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n for (let i=0; i>1) )&&(i>1, k>>1)\n )\n )\n );\n\n f.addCode(\n c.setLocal(c1,\n c.i64_add(\n c.getLocal(c1),\n c.i64_shr_u(\n c.getLocal(c0),\n c.i64_const(32)\n )\n )\n )\n );\n }\n\n // Add the old carry\n\n if (k>0) {\n f.addCode(\n c.setLocal(c0,\n c.i64_add(\n c.i64_and(\n c.getLocal(c0),\n c.i64_const(0xFFFFFFFF)\n ),\n c.i64_and(\n c.getLocal(c0_old),\n c.i64_const(0xFFFFFFFF)\n ),\n )\n )\n );\n\n f.addCode(\n c.setLocal(c1,\n c.i64_add(\n c.i64_add(\n c.getLocal(c1),\n c.i64_shr_u(\n c.getLocal(c0),\n c.i64_const(32)\n )\n ),\n c.getLocal(c1_old)\n )\n )\n );\n }\n\n f.addCode(\n c.i64_store32(\n c.getLocal(\"r\"),\n k*4,\n c.getLocal(c0)\n )\n );\n\n f.addCode(\n c.setLocal(\n c0_old,\n c.getLocal(c1)\n ),\n c.setLocal(\n c1_old,\n c.i64_shr_u(\n c.getLocal(c0_old),\n c.i64_const(32)\n )\n )\n );\n\n }\n f.addCode(\n c.i64_store32(\n c.getLocal(\"r\"),\n n32*4*2-4,\n c.getLocal(c0_old)\n )\n );\n\n }\n\n\n function buildSquareOld() {\n const f = module.addFunction(prefix+\"_squareOld\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(c.call(prefix + \"_mul\", c.getLocal(\"x\"), c.getLocal(\"x\"), c.getLocal(\"r\")));\n }\n\n function _buildMul1() {\n const f = module.addFunction(prefix+\"__mul1\");\n f.addParam(\"px\", \"i32\");\n f.addParam(\"y\", \"i64\");\n f.addParam(\"pr\", \"i32\");\n f.addLocal(\"c\", \"i64\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(c.setLocal(\n \"c\",\n c.i64_mul(\n c.i64_load32_u(c.getLocal(\"px\"), 0, 0),\n c.getLocal(\"y\")\n )\n ));\n\n f.addCode(c.i64_store32(\n c.getLocal(\"pr\"),\n 0,\n 0,\n c.getLocal(\"c\"),\n ));\n\n for (let i=1; i3)&&(Y[eY]==0) ey--;\n f.addCode(c.block(c.loop(\n c.br_if(\n 1,\n c.i32_or(\n c.i32_load8_u(\n c.i32_add(Y , c.getLocal(\"eY\")),\n 0,\n 0\n ),\n c.i32_eq(\n c.getLocal(\"eY\"),\n c.i32_const(3)\n )\n )\n ),\n c.setLocal(\"eY\", c.i32_sub(c.getLocal(\"eY\"), c.i32_const(1))),\n c.br(0)\n )));\n\n f.addCode(\n c.setLocal(\n \"sy\",\n c.i64_add(\n c.i64_load32_u(\n c.i32_sub(\n c.i32_add( Y, c.getLocal(\"eY\")),\n c.i32_const(3)\n ),\n 0,\n 0\n ),\n c.i64_const(1)\n )\n )\n );\n\n // Force a divide by 0 if quotien is 0\n f.addCode(\n c.if(\n c.i64_eq(\n c.getLocal(\"sy\"),\n c.i64_const(1)\n ),\n c.drop(c.i64_div_u(c.i64_const(0), c.i64_const(0)))\n )\n );\n\n f.addCode(c.block(c.loop(\n\n // while (eX>7)&&(Y[eX]==0) ex--;\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_or(\n c.i32_load8_u(\n c.i32_add(R , c.getLocal(\"eX\")),\n 0,\n 0\n ),\n c.i32_eq(\n c.getLocal(\"eX\"),\n c.i32_const(7)\n )\n )\n ),\n c.setLocal(\"eX\", c.i32_sub(c.getLocal(\"eX\"), c.i32_const(1))),\n c.br(0)\n )),\n\n c.setLocal(\n \"sx\",\n c.i64_load(\n c.i32_sub(\n c.i32_add( R, c.getLocal(\"eX\")),\n c.i32_const(7)\n ),\n 0,\n 0\n )\n ),\n\n c.setLocal(\n \"sx\",\n c.i64_div_u(\n c.getLocal(\"sx\"),\n c.getLocal(\"sy\")\n )\n ),\n c.setLocal(\n \"ec\",\n c.i32_sub(\n c.i32_sub(\n c.getLocal(\"eX\"),\n c.getLocal(\"eY\")\n ),\n c.i32_const(4)\n )\n ),\n\n // While greater than 32 bits or ec is neg, shr and inc exp\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_and(\n c.i64_eqz(\n c.i64_and(\n c.getLocal(\"sx\"),\n c.i64_const(\"0xFFFFFFFF00000000\")\n )\n ),\n c.i32_ge_s(\n c.getLocal(\"ec\"),\n c.i32_const(0)\n )\n )\n ),\n\n c.setLocal(\n \"sx\",\n c.i64_shr_u(\n c.getLocal(\"sx\"),\n c.i64_const(8)\n )\n ),\n\n c.setLocal(\n \"ec\",\n c.i32_add(\n c.getLocal(\"ec\"),\n c.i32_const(1)\n )\n ),\n c.br(0)\n )),\n\n c.if(\n c.i64_eqz(c.getLocal(\"sx\")),\n [\n ...c.br_if(\n 2,\n c.i32_eqz(c.call(prefix + \"_gte\", R, Y))\n ),\n ...c.setLocal(\"sx\", c.i64_const(1)),\n ...c.setLocal(\"ec\", c.i32_const(0))\n ]\n ),\n\n c.call(prefix + \"__mul1\", Y, c.getLocal(\"sx\"), R2),\n c.drop(c.call(\n prefix + \"_sub\",\n R,\n c.i32_sub(R2, c.getLocal(\"ec\")),\n R\n )),\n c.call(\n prefix + \"__add1\",\n c.i32_add(C, c.getLocal(\"ec\")),\n c.getLocal(\"sx\")\n ),\n c.br(0)\n )));\n }\n\n function buildInverseMod() {\n\n const f = module.addFunction(prefix+\"_inverseMod\");\n f.addParam(\"px\", \"i32\");\n f.addParam(\"pm\", \"i32\");\n f.addParam(\"pr\", \"i32\");\n f.addLocal(\"t\", \"i32\");\n f.addLocal(\"newt\", \"i32\");\n f.addLocal(\"r\", \"i32\");\n f.addLocal(\"qq\", \"i32\");\n f.addLocal(\"qr\", \"i32\");\n f.addLocal(\"newr\", \"i32\");\n f.addLocal(\"swp\", \"i32\");\n f.addLocal(\"x\", \"i32\");\n f.addLocal(\"signt\", \"i32\");\n f.addLocal(\"signnewt\", \"i32\");\n f.addLocal(\"signx\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const aux1 = c.i32_const(module.alloc(n8));\n const aux2 = c.i32_const(module.alloc(n8));\n const aux3 = c.i32_const(module.alloc(n8));\n const aux4 = c.i32_const(module.alloc(n8));\n const aux5 = c.i32_const(module.alloc(n8));\n const aux6 = c.i32_const(module.alloc(n8));\n const mulBuff = c.i32_const(module.alloc(n8*2));\n const aux7 = c.i32_const(module.alloc(n8));\n\n f.addCode(\n c.setLocal(\"t\", aux1),\n c.call(prefix + \"_zero\", aux1),\n c.setLocal(\"signt\", c.i32_const(0)),\n );\n\n f.addCode(\n c.setLocal(\"r\", aux2),\n c.call(prefix + \"_copy\", c.getLocal(\"pm\"), aux2)\n );\n\n f.addCode(\n c.setLocal(\"newt\", aux3),\n c.call(prefix + \"_one\", aux3),\n c.setLocal(\"signnewt\", c.i32_const(0)),\n );\n\n f.addCode(\n c.setLocal(\"newr\", aux4),\n c.call(prefix + \"_copy\", c.getLocal(\"px\"), aux4)\n );\n\n\n\n\n f.addCode(c.setLocal(\"qq\", aux5));\n f.addCode(c.setLocal(\"qr\", aux6));\n f.addCode(c.setLocal(\"x\", aux7));\n\n f.addCode(c.block(c.loop(\n c.br_if(\n 1,\n c.call(prefix + \"_isZero\", c.getLocal(\"newr\") )\n ),\n c.call(prefix + \"_div\", c.getLocal(\"r\"), c.getLocal(\"newr\"), c.getLocal(\"qq\"), c.getLocal(\"qr\")),\n\n c.call(prefix + \"_mul\", c.getLocal(\"qq\"), c.getLocal(\"newt\"), mulBuff),\n\n c.if(\n c.getLocal(\"signt\"),\n c.if(\n c.getLocal(\"signnewt\"),\n c.if (\n c.call(prefix + \"_gte\", mulBuff, c.getLocal(\"t\")),\n [\n ...c.drop(c.call(prefix + \"_sub\", mulBuff, c.getLocal(\"t\"), c.getLocal(\"x\"))),\n ...c.setLocal(\"signx\", c.i32_const(0))\n ],\n [\n ...c.drop(c.call(prefix + \"_sub\", c.getLocal(\"t\"), mulBuff, c.getLocal(\"x\"))),\n ...c.setLocal(\"signx\", c.i32_const(1))\n ],\n ),\n [\n ...c.drop(c.call(prefix + \"_add\", mulBuff, c.getLocal(\"t\"), c.getLocal(\"x\"))),\n ...c.setLocal(\"signx\", c.i32_const(1))\n ]\n ),\n c.if(\n c.getLocal(\"signnewt\"),\n [\n ...c.drop(c.call(prefix + \"_add\", mulBuff, c.getLocal(\"t\"), c.getLocal(\"x\"))),\n ...c.setLocal(\"signx\", c.i32_const(0))\n ],\n c.if (\n c.call(prefix + \"_gte\", c.getLocal(\"t\"), mulBuff),\n [\n ...c.drop(c.call(prefix + \"_sub\", c.getLocal(\"t\"), mulBuff, c.getLocal(\"x\"))),\n ...c.setLocal(\"signx\", c.i32_const(0))\n ],\n [\n ...c.drop(c.call(prefix + \"_sub\", mulBuff, c.getLocal(\"t\"), c.getLocal(\"x\"))),\n ...c.setLocal(\"signx\", c.i32_const(1))\n ]\n )\n )\n ),\n\n c.setLocal(\"swp\", c.getLocal(\"t\")),\n c.setLocal(\"t\", c.getLocal(\"newt\")),\n c.setLocal(\"newt\", c.getLocal(\"x\")),\n c.setLocal(\"x\", c.getLocal(\"swp\")),\n\n c.setLocal(\"signt\", c.getLocal(\"signnewt\")),\n c.setLocal(\"signnewt\", c.getLocal(\"signx\")),\n\n c.setLocal(\"swp\", c.getLocal(\"r\")),\n c.setLocal(\"r\", c.getLocal(\"newr\")),\n c.setLocal(\"newr\", c.getLocal(\"qr\")),\n c.setLocal(\"qr\", c.getLocal(\"swp\")),\n\n c.br(0)\n )));\n\n f.addCode(c.if(\n c.getLocal(\"signt\"),\n c.drop(c.call(prefix + \"_sub\", c.getLocal(\"pm\"), c.getLocal(\"t\"), c.getLocal(\"pr\"))),\n c.call(prefix + \"_copy\", c.getLocal(\"t\"), c.getLocal(\"pr\"))\n ));\n }\n\n\n buildCopy();\n buildZero();\n buildIsZero();\n buildOne();\n buildEq();\n buildGte();\n buildAdd();\n buildSub();\n buildMul();\n buildSquare();\n buildSquareOld();\n buildDiv();\n buildInverseMod();\n module.exportFunction(prefix+\"_copy\");\n module.exportFunction(prefix+\"_zero\");\n module.exportFunction(prefix+\"_one\");\n module.exportFunction(prefix+\"_isZero\");\n module.exportFunction(prefix+\"_eq\");\n module.exportFunction(prefix+\"_gte\");\n module.exportFunction(prefix+\"_add\");\n module.exportFunction(prefix+\"_sub\");\n module.exportFunction(prefix+\"_mul\");\n module.exportFunction(prefix+\"_square\");\n module.exportFunction(prefix+\"_squareOld\");\n module.exportFunction(prefix+\"_div\");\n module.exportFunction(prefix+\"_inverseMod\");\n\n return prefix;\n};\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nexport default function buildTimesScalar(module, fnName, elementLen, opAB, opAA, opCopy, opInit) {\n\n const f = module.addFunction(fnName);\n f.addParam(\"base\", \"i32\");\n f.addParam(\"scalar\", \"i32\");\n f.addParam(\"scalarLength\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"b\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const aux = c.i32_const(module.alloc(elementLen));\n\n f.addCode(\n c.if(\n c.i32_eqz(c.getLocal(\"scalarLength\")),\n [\n ...c.call(opInit, c.getLocal(\"r\")),\n ...c.ret([])\n ]\n )\n );\n f.addCode(c.call(opCopy, c.getLocal(\"base\"), aux));\n f.addCode(c.call(opInit, c.getLocal(\"r\")));\n f.addCode(c.setLocal(\"i\", c.getLocal(\"scalarLength\")));\n f.addCode(c.block(c.loop(\n c.setLocal(\"i\", c.i32_sub(c.getLocal(\"i\"), c.i32_const(1))),\n\n c.setLocal(\n \"b\",\n c.i32_load8_u(\n c.i32_add(\n c.getLocal(\"scalar\"),\n c.getLocal(\"i\")\n )\n )\n ),\n ...innerLoop(),\n c.br_if(1, c.i32_eqz ( c.getLocal(\"i\") )),\n c.br(0)\n )));\n\n\n function innerLoop() {\n const code = [];\n for (let i=0; i<8; i++) {\n code.push(\n ...c.call(opAA, c.getLocal(\"r\"), c.getLocal(\"r\")),\n ...c.if(\n c.i32_ge_u( c.getLocal(\"b\"), c.i32_const(0x80 >> i)),\n [\n ...c.setLocal(\n \"b\",\n c.i32_sub(\n c.getLocal(\"b\"),\n c.i32_const(0x80 >> i)\n )\n ),\n ...c.call(opAB, c.getLocal(\"r\"),aux, c.getLocal(\"r\"))\n ]\n )\n );\n }\n return code;\n }\n\n};\n","\nexport default buildBatchInverse;\n\nfunction buildBatchInverse(module, prefix) {\n\n\n const n8 = module.modules[prefix].n64*8;\n\n const f = module.addFunction(prefix+\"_batchInverse\");\n f.addParam(\"pIn\", \"i32\");\n f.addParam(\"inStep\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"pOut\", \"i32\");\n f.addParam(\"outStep\", \"i32\");\n f.addLocal(\"itAux\", \"i32\");\n f.addLocal(\"itIn\", \"i32\");\n f.addLocal(\"itOut\",\"i32\");\n f.addLocal(\"i\",\"i32\");\n\n const c = f.getCodeBuilder();\n\n const AUX = c.i32_const(module.alloc(n8));\n\n\n // Alloc Working space for accumulated umltiplications\n f.addCode(\n c.setLocal(\"itAux\", c.i32_load( c.i32_const(0) )),\n c.i32_store(\n c.i32_const(0),\n c.i32_add(\n c.getLocal(\"itAux\"),\n c.i32_mul(\n c.i32_add(\n c.getLocal(\"n\"),\n c.i32_const(1)\n ),\n c.i32_const(n8)\n )\n )\n )\n );\n\n f.addCode(\n\n // aux[0] = a;\n c.call(prefix+\"_one\", c.getLocal(\"itAux\")),\n // for (i=0;i b ? 1 : -1;\n}\n\nfunction square(n) {\n return n * n;\n}\n\nfunction isOdd(n) {\n return n % 2n !== 0n;\n}\n\nfunction isEven(n) {\n return n % 2n === 0n;\n}\n\nfunction isNegative(n) {\n return n < 0n;\n}\n\nfunction isPositive(n) {\n return n > 0n;\n}\n\nfunction bitLength(n) {\n if (isNegative(n)) {\n return n.toString(2).length - 1; // discard the - sign\n } else {\n return n.toString(2).length;\n }\n}\n\nfunction abs(n) {\n return n < 0n ? -n : n;\n}\n\nfunction isUnit(n) {\n return abs(n) === 1n;\n}\n\nfunction modInv(a, n) {\n var t = 0n, newT = 1n, r = n, newR = abs(a), q, lastT, lastR;\n while (newR !== 0n) {\n q = r / newR;\n lastT = t;\n lastR = r;\n t = newT;\n r = newR;\n newT = lastT - (q * newT);\n newR = lastR - (q * newR);\n }\n if (!isUnit(r)) throw new Error(a.toString() + \" and \" + n.toString() + \" are not co-prime\");\n if (compare(t, 0n) === -1) {\n t = t + n;\n }\n if (isNegative(a)) {\n return -t;\n }\n return t;\n}\n\nfunction modPow(n, exp, mod) {\n if (mod === 0n) throw new Error(\"Cannot take modPow with modulus 0\");\n var r = 1n,\n base = n % mod;\n if (isNegative(exp)) {\n exp = exp * -1n;\n base = modInv(base, mod);\n }\n while (isPositive(exp)) {\n if (base === 0n) return 0n;\n if (isOdd(exp)) r = r * base % mod;\n exp = exp / 2n;\n base = square(base) % mod;\n }\n return r;\n}\n\nfunction compareAbs(a, b) {\n a = a >= 0n ? a : -a;\n b = b >= 0n ? b : -b;\n return a === b ? 0 : a > b ? 1 : -1;\n}\n\nfunction isDivisibleBy(a, n) {\n if (n === 0n) return false;\n if (isUnit(n)) return true;\n if (compareAbs(n, 2n) === 0) return isEven(a);\n return a % n === 0n;\n}\n\nfunction isBasicPrime(v) {\n var n = abs(v);\n if (isUnit(n)) return false;\n if (n === 2n || n === 3n || n === 5n) return true;\n if (isEven(n) || isDivisibleBy(n, 3n) || isDivisibleBy(n, 5n)) return false;\n if (n < 49n) return true;\n // we don't know if it's prime: let the other functions figure it out\n}\n\nfunction prev(n) {\n return n - 1n;\n}\n\nfunction isKnownPrime(v) {\n let n = abs(v);\n switch (n) {\n case 21888242871839275222246405745257275088696311157297823662689037894645226208583n:\n case 21888242871839275222246405745257275088548364400416034343698204186575808495617n:\n case 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaabn:\n case 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001n:\n case 41898490967918953402344214791240637128170709919953949071783502921025352812571106773058893763790338921418070971888458477323173057491593855069696241854796396165721416325350064441470418137846398469611935719059908164220784476160001n:\n return true;\n }\n return false;\n}\n\nfunction millerRabinTest(n, a) {\n var nPrev = prev(n),\n b = nPrev,\n r = 0,\n d, i, x;\n while (isEven(b)) b = b / 2n, r++;\n next: for (i = 0; i < a.length; i++) {\n if (n < a[i]) continue;\n x = modPow(BigInt(a[i]), b, n);\n if (isUnit(x) || x === nPrev) continue;\n for (d = r - 1; d != 0; d--) {\n x = square(x) % n;\n if (isUnit(x)) return false;\n if (x === nPrev) continue next;\n }\n return false;\n }\n return true;\n}\n\nfunction isPrime(p) {\n let isPrime;\n isPrime = isKnownPrime(p);\n if (isPrime !== undefined) return isPrime;\n isPrime = isBasicPrime(p);\n if (isPrime !== undefined) return isPrime;\n var n = abs(p);\n var bits = bitLength(n);\n if (bits <= 64)\n return millerRabinTest(n, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37]);\n var logN = Math.log(2) * Number(bits);\n var t = Math.ceil(logN);\n for (var a = [], i = 0; i < t; i++) {\n a.push(BigInt(i + 2));\n }\n return millerRabinTest(n, a);\n}\n\nexport { bitLength, isOdd, isNegative, abs, isUnit, compare, modInv, modPow, isPrime, square };\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nimport buildInt from \"./build_int.js\";\nimport * as utils from \"./utils.js\";\nimport buildExp from \"./build_timesscalar.js\";\nimport buildBatchInverse from \"./build_batchinverse.js\";\nimport buildBatchConvertion from \"./build_batchconvertion.js\";\nimport buildBatchOp from \"./build_batchop.js\";\nimport { bitLength, modInv, modPow, isPrime, isOdd, square } from \"./bigint.js\";\n\nexport default function buildF1m(module, _q, _prefix, _intPrefix) {\n const q = BigInt(_q);\n const n64 = Math.floor((bitLength(q - 1n) - 1)/64) +1;\n const n32 = n64*2;\n const n8 = n64*8;\n\n const prefix = _prefix || \"f1m\";\n if (module.modules[prefix]) return prefix; // already builded\n\n const intPrefix = buildInt(module, n64, _intPrefix);\n const pq = module.alloc(n8, utils.bigInt2BytesLE(q, n8));\n\n const pR2 = module.alloc(utils.bigInt2BytesLE(square(1n << BigInt(n64*64)) % q, n8));\n const pOne = module.alloc(utils.bigInt2BytesLE((1n << BigInt(n64*64)) % q, n8));\n const pZero = module.alloc(utils.bigInt2BytesLE(0n, n8));\n const _minusOne = q - 1n;\n const _e = _minusOne >> 1n; // e = (p-1)/2\n const pe = module.alloc(n8, utils.bigInt2BytesLE(_e, n8));\n\n const _ePlusOne = _e + 1n; // e = (p-1)/2\n const pePlusOne = module.alloc(n8, utils.bigInt2BytesLE(_ePlusOne, n8));\n\n module.modules[prefix] = {\n pq: pq,\n pR2: pR2,\n n64: n64,\n q: q,\n pOne: pOne,\n pZero: pZero,\n pePlusOne: pePlusOne\n };\n\n function buildOne() {\n const f = module.addFunction(prefix+\"_one\");\n f.addParam(\"pr\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(c.call(intPrefix + \"_copy\", c.i32_const(pOne), c.getLocal(\"pr\")));\n }\n\n function buildAdd() {\n const f = module.addFunction(prefix+\"_add\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.if(\n c.call(intPrefix+\"_add\", c.getLocal(\"x\"), c.getLocal(\"y\"), c.getLocal(\"r\")),\n c.drop(c.call(intPrefix+\"_sub\", c.getLocal(\"r\"), c.i32_const(pq), c.getLocal(\"r\"))),\n c.if(\n c.call(intPrefix+\"_gte\", c.getLocal(\"r\"), c.i32_const(pq) ),\n c.drop(c.call(intPrefix+\"_sub\", c.getLocal(\"r\"), c.i32_const(pq), c.getLocal(\"r\"))),\n )\n )\n );\n }\n\n function buildSub() {\n const f = module.addFunction(prefix+\"_sub\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.if(\n c.call(intPrefix+\"_sub\", c.getLocal(\"x\"), c.getLocal(\"y\"), c.getLocal(\"r\")),\n c.drop(c.call(intPrefix+\"_add\", c.getLocal(\"r\"), c.i32_const(pq), c.getLocal(\"r\")))\n )\n );\n }\n\n function buildNeg() {\n const f = module.addFunction(prefix+\"_neg\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.call(prefix + \"_sub\", c.i32_const(pZero), c.getLocal(\"x\"), c.getLocal(\"r\"))\n );\n }\n\n\n function buildIsNegative() {\n const f = module.addFunction(prefix+\"_isNegative\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const AUX = c.i32_const(module.alloc(n8));\n\n f.addCode(\n c.call(prefix + \"_fromMontgomery\", c.getLocal(\"x\"), AUX),\n c.call(intPrefix + \"_gte\", AUX, c.i32_const(pePlusOne) )\n );\n }\n\n function buildSign() {\n const f = module.addFunction(prefix+\"_sign\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const AUX = c.i32_const(module.alloc(n8));\n\n f.addCode(\n c.if (\n c.call(intPrefix + \"_isZero\", c.getLocal(\"x\")),\n c.ret(c.i32_const(0))\n ),\n c.call(prefix + \"_fromMontgomery\", c.getLocal(\"x\"), AUX),\n c.if(\n c.call(intPrefix + \"_gte\", AUX, c.i32_const(pePlusOne)),\n c.ret(c.i32_const(-1))\n ),\n c.ret(c.i32_const(1))\n );\n }\n\n\n function buildMReduct() {\n const carries = module.alloc(n32*n32*8);\n\n const f = module.addFunction(prefix+\"_mReduct\");\n f.addParam(\"t\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"np32\", \"i64\");\n f.addLocal(\"c\", \"i64\");\n f.addLocal(\"m\", \"i64\");\n\n const c = f.getCodeBuilder();\n\n const np32 = Number(0x100000000n - modInv(q, 0x100000000n));\n\n f.addCode(c.setLocal(\"np32\", c.i64_const(np32)));\n\n for (let i=0; i=n32) {\n f.addCode(\n c.i64_store32(\n c.getLocal(\"r\"),\n (k-n32)*4,\n c.getLocal(c0)\n )\n );\n }\n [c0, c1] = [c1, c0];\n f.addCode(\n c.setLocal(c1,\n c.i64_shr_u(\n c.getLocal(c0),\n c.i64_const(32)\n )\n )\n );\n }\n f.addCode(\n c.i64_store32(\n c.getLocal(\"r\"),\n n32*4-4,\n c.getLocal(c0)\n )\n );\n\n f.addCode(\n c.if(\n c.i32_wrap_i64(c.getLocal(c1)),\n c.drop(c.call(intPrefix+\"_sub\", c.getLocal(\"r\"), c.i32_const(pq), c.getLocal(\"r\"))),\n c.if(\n c.call(intPrefix+\"_gte\", c.getLocal(\"r\"), c.i32_const(pq) ),\n c.drop(c.call(intPrefix+\"_sub\", c.getLocal(\"r\"), c.i32_const(pq), c.getLocal(\"r\"))),\n )\n )\n );\n }\n\n\n function buildSquare() {\n\n const f = module.addFunction(prefix+\"_square\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"c0\", \"i64\");\n f.addLocal(\"c1\", \"i64\");\n f.addLocal(\"c0_old\", \"i64\");\n f.addLocal(\"c1_old\", \"i64\");\n f.addLocal(\"np32\", \"i64\");\n\n\n for (let i=0;i>1) )&&(i>1, k>>1)\n )\n )\n );\n\n f.addCode(\n c.setLocal(c1,\n c.i64_add(\n c.getLocal(c1),\n c.i64_shr_u(\n c.getLocal(c0),\n c.i64_const(32)\n )\n )\n )\n );\n }\n\n // Add the old carry\n\n if (k>0) {\n f.addCode(\n c.setLocal(c0,\n c.i64_add(\n c.i64_and(\n c.getLocal(c0),\n c.i64_const(0xFFFFFFFF)\n ),\n c.i64_and(\n c.getLocal(c0_old),\n c.i64_const(0xFFFFFFFF)\n ),\n )\n )\n );\n\n f.addCode(\n c.setLocal(c1,\n c.i64_add(\n c.i64_add(\n c.getLocal(c1),\n c.i64_shr_u(\n c.getLocal(c0),\n c.i64_const(32)\n )\n ),\n c.getLocal(c1_old)\n )\n )\n );\n }\n\n\n for (let i=Math.max(1, k-n32+1); (i<=k)&&(i=n32) {\n f.addCode(\n c.i64_store32(\n c.getLocal(\"r\"),\n (k-n32)*4,\n c.getLocal(c0)\n )\n );\n }\n f.addCode(\n c.setLocal(\n c0_old,\n c.getLocal(c1)\n ),\n c.setLocal(\n c1_old,\n c.i64_shr_u(\n c.getLocal(c0_old),\n c.i64_const(32)\n )\n )\n );\n }\n f.addCode(\n c.i64_store32(\n c.getLocal(\"r\"),\n n32*4-4,\n c.getLocal(c0_old)\n )\n );\n\n f.addCode(\n c.if(\n c.i32_wrap_i64(c.getLocal(c1_old)),\n c.drop(c.call(intPrefix+\"_sub\", c.getLocal(\"r\"), c.i32_const(pq), c.getLocal(\"r\"))),\n c.if(\n c.call(intPrefix+\"_gte\", c.getLocal(\"r\"), c.i32_const(pq) ),\n c.drop(c.call(intPrefix+\"_sub\", c.getLocal(\"r\"), c.i32_const(pq), c.getLocal(\"r\"))),\n )\n )\n );\n }\n\n\n function buildSquareOld() {\n const f = module.addFunction(prefix+\"_squareOld\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(c.call(prefix + \"_mul\", c.getLocal(\"x\"), c.getLocal(\"x\"), c.getLocal(\"r\")));\n }\n\n function buildToMontgomery() {\n const f = module.addFunction(prefix+\"_toMontgomery\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n f.addCode(c.call(prefix+\"_mul\", c.getLocal(\"x\"), c.i32_const(pR2), c.getLocal(\"r\")));\n }\n\n function buildFromMontgomery() {\n\n const pAux2 = module.alloc(n8*2);\n\n const f = module.addFunction(prefix+\"_fromMontgomery\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n f.addCode(c.call(intPrefix + \"_copy\", c.getLocal(\"x\"), c.i32_const(pAux2) ));\n f.addCode(c.call(intPrefix + \"_zero\", c.i32_const(pAux2 + n8) ));\n f.addCode(c.call(prefix+\"_mReduct\", c.i32_const(pAux2), c.getLocal(\"r\")));\n }\n\n function buildInverse() {\n\n const f = module.addFunction(prefix+ \"_inverse\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n f.addCode(c.call(prefix + \"_fromMontgomery\", c.getLocal(\"x\"), c.getLocal(\"r\")));\n f.addCode(c.call(intPrefix + \"_inverseMod\", c.getLocal(\"r\"), c.i32_const(pq), c.getLocal(\"r\")));\n f.addCode(c.call(prefix + \"_toMontgomery\", c.getLocal(\"r\"), c.getLocal(\"r\")));\n }\n\n // Calculate various valuse needed for sqrt\n\n\n let _nqr = 2n;\n if (isPrime(q)) {\n while (modPow(_nqr, _e, q) !== _minusOne) _nqr = _nqr + 1n;\n }\n\n let s2 = 0;\n let _t = _minusOne;\n\n while ((!isOdd(_t))&&(_t !== 0n)) {\n s2++;\n _t = _t >> 1n;\n }\n const pt = module.alloc(n8, utils.bigInt2BytesLE(_t, n8));\n\n const _nqrToT = modPow(_nqr, _t, q);\n const pNqrToT = module.alloc(utils.bigInt2BytesLE((_nqrToT << BigInt(n64*64)) % q, n8));\n\n const _tPlusOneOver2 = (_t + 1n) >> 1n;\n const ptPlusOneOver2 = module.alloc(n8, utils.bigInt2BytesLE(_tPlusOneOver2, n8));\n\n function buildSqrt() {\n\n const f = module.addFunction(prefix+ \"_sqrt\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"m\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"j\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const ONE = c.i32_const(pOne);\n const C = c.i32_const(module.alloc(n8));\n const T = c.i32_const(module.alloc(n8));\n const R = c.i32_const(module.alloc(n8));\n const SQ = c.i32_const(module.alloc(n8));\n const B = c.i32_const(module.alloc(n8));\n\n f.addCode(\n\n // If (n==0) return 0\n c.if(\n c.call(prefix + \"_isZero\", c.getLocal(\"n\")),\n c.ret(\n c.call(prefix + \"_zero\", c.getLocal(\"r\"))\n )\n ),\n\n c.setLocal(\"m\", c.i32_const(s2)),\n c.call(prefix + \"_copy\", c.i32_const(pNqrToT), C),\n c.call(prefix + \"_exp\", c.getLocal(\"n\"), c.i32_const(pt), c.i32_const(n8), T),\n c.call(prefix + \"_exp\", c.getLocal(\"n\"), c.i32_const(ptPlusOneOver2), c.i32_const(n8), R),\n\n c.block(c.loop(\n c.br_if(1, c.call(prefix + \"_eq\", T, ONE)),\n\n c.call(prefix + \"_square\", T, SQ),\n c.setLocal(\"i\", c.i32_const(1)),\n c.block(c.loop(\n c.br_if(1, c.call(prefix + \"_eq\", SQ, ONE)),\n c.call(prefix + \"_square\", SQ, SQ),\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n )),\n\n c.call(prefix + \"_copy\", C, B),\n c.setLocal(\"j\", c.i32_sub(c.i32_sub( c.getLocal(\"m\"), c.getLocal(\"i\")), c.i32_const(1)) ),\n c.block(c.loop(\n c.br_if(1, c.i32_eqz(c.getLocal(\"j\"))),\n c.call(prefix + \"_square\", B, B),\n c.setLocal(\"j\", c.i32_sub(c.getLocal(\"j\"), c.i32_const(1))),\n c.br(0)\n )),\n\n c.setLocal(\"m\", c.getLocal(\"i\")),\n c.call(prefix + \"_square\", B, C),\n c.call(prefix + \"_mul\", T, C, T),\n c.call(prefix + \"_mul\", R, B, R),\n\n c.br(0)\n )),\n\n c.if(\n c.call(prefix + \"_isNegative\", R),\n c.call(prefix + \"_neg\", R, c.getLocal(\"r\")),\n c.call(prefix + \"_copy\", R, c.getLocal(\"r\")),\n )\n );\n }\n\n function buildIsSquare() {\n const f = module.addFunction(prefix+\"_isSquare\");\n f.addParam(\"n\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const ONE = c.i32_const(pOne);\n const AUX = c.i32_const(module.alloc(n8));\n\n f.addCode(\n c.if(\n c.call(prefix + \"_isZero\", c.getLocal(\"n\")),\n c.ret(c.i32_const(1))\n ),\n c.call(prefix + \"_exp\", c.getLocal(\"n\"), c.i32_const(pe), c.i32_const(n8), AUX),\n c.call(prefix + \"_eq\", AUX, ONE)\n );\n }\n\n\n function buildLoad() {\n const f = module.addFunction(prefix+\"_load\");\n f.addParam(\"scalar\", \"i32\");\n f.addParam(\"scalarLen\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"p\", \"i32\");\n f.addLocal(\"l\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"j\", \"i32\");\n const c = f.getCodeBuilder();\n\n const R = c.i32_const(module.alloc(n8));\n const pAux = module.alloc(n8);\n const AUX = c.i32_const(pAux);\n\n f.addCode(\n c.call(intPrefix + \"_zero\", c.getLocal(\"r\")),\n c.setLocal(\"i\", c.i32_const(n8)),\n c.setLocal(\"p\", c.getLocal(\"scalar\")),\n c.block(c.loop(\n c.br_if(1, c.i32_gt_u(c.getLocal(\"i\"), c.getLocal(\"scalarLen\"))),\n\n c.if(\n c.i32_eq(c.getLocal(\"i\"), c.i32_const(n8)),\n c.call(prefix + \"_one\", R),\n c.call(prefix + \"_mul\", R, c.i32_const(pR2), R)\n ),\n c.call(prefix + \"_mul\", c.getLocal(\"p\"), R, AUX),\n c.call(prefix + \"_add\", c.getLocal(\"r\"), AUX, c.getLocal(\"r\")),\n\n c.setLocal(\"p\", c.i32_add(c.getLocal(\"p\"), c.i32_const(n8))),\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(n8))),\n c.br(0)\n )),\n\n c.setLocal(\"l\", c.i32_rem_u( c.getLocal(\"scalarLen\"), c.i32_const(n8))),\n c.if(c.i32_eqz(c.getLocal(\"l\")), c.ret([])),\n c.call(intPrefix + \"_zero\", AUX),\n c.setLocal(\"j\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(1, c.i32_eq(c.getLocal(\"j\"), c.getLocal(\"l\"))),\n\n c.i32_store8(\n c.getLocal(\"j\"),\n pAux,\n c.i32_load8_u(c.getLocal(\"p\")),\n ),\n c.setLocal(\"p\", c.i32_add(c.getLocal(\"p\"), c.i32_const(1))),\n c.setLocal(\"j\", c.i32_add(c.getLocal(\"j\"), c.i32_const(1))),\n c.br(0)\n )),\n\n c.if(\n c.i32_eq(c.getLocal(\"i\"), c.i32_const(n8)),\n c.call(prefix + \"_one\", R),\n c.call(prefix + \"_mul\", R, c.i32_const(pR2), R)\n ),\n c.call(prefix + \"_mul\", AUX, R, AUX),\n c.call(prefix + \"_add\", c.getLocal(\"r\"), AUX, c.getLocal(\"r\")),\n );\n }\n\n function buildTimesScalar() {\n const f = module.addFunction(prefix+\"_timesScalar\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"scalar\", \"i32\");\n f.addParam(\"scalarLen\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const AUX = c.i32_const(module.alloc(n8));\n\n f.addCode(\n c.call(prefix + \"_load\", c.getLocal(\"scalar\"), c.getLocal(\"scalarLen\"), AUX),\n c.call(prefix + \"_toMontgomery\", AUX, AUX),\n c.call(prefix + \"_mul\", c.getLocal(\"x\"), AUX, c.getLocal(\"r\")),\n );\n }\n\n function buildIsOne() {\n const f = module.addFunction(prefix+\"_isOne\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n f.addCode(\n c.ret(c.call(intPrefix + \"_eq\", c.getLocal(\"x\"), c.i32_const(pOne)))\n );\n }\n\n\n module.exportFunction(intPrefix + \"_copy\", prefix+\"_copy\");\n module.exportFunction(intPrefix + \"_zero\", prefix+\"_zero\");\n module.exportFunction(intPrefix + \"_isZero\", prefix+\"_isZero\");\n module.exportFunction(intPrefix + \"_eq\", prefix+\"_eq\");\n\n buildIsOne();\n buildAdd();\n buildSub();\n buildNeg();\n buildMReduct();\n buildMul();\n buildSquare();\n buildSquareOld();\n buildToMontgomery();\n buildFromMontgomery();\n buildIsNegative();\n buildSign();\n buildInverse();\n buildOne();\n buildLoad();\n buildTimesScalar();\n buildBatchInverse(module, prefix);\n buildBatchConvertion(module, prefix + \"_batchToMontgomery\", prefix + \"_toMontgomery\", n8, n8);\n buildBatchConvertion(module, prefix + \"_batchFromMontgomery\", prefix + \"_fromMontgomery\", n8, n8);\n buildBatchConvertion(module, prefix + \"_batchNeg\", prefix + \"_neg\", n8, n8);\n buildBatchOp(module, prefix + \"_batchAdd\", prefix + \"_add\", n8, n8);\n buildBatchOp(module, prefix + \"_batchSub\", prefix + \"_sub\", n8, n8);\n buildBatchOp(module, prefix + \"_batchMul\", prefix + \"_mul\", n8, n8);\n\n module.exportFunction(prefix + \"_add\");\n module.exportFunction(prefix + \"_sub\");\n module.exportFunction(prefix + \"_neg\");\n module.exportFunction(prefix + \"_isNegative\");\n module.exportFunction(prefix + \"_isOne\");\n module.exportFunction(prefix + \"_sign\");\n module.exportFunction(prefix + \"_mReduct\");\n module.exportFunction(prefix + \"_mul\");\n module.exportFunction(prefix + \"_square\");\n module.exportFunction(prefix + \"_squareOld\");\n module.exportFunction(prefix + \"_fromMontgomery\");\n module.exportFunction(prefix + \"_toMontgomery\");\n module.exportFunction(prefix + \"_inverse\");\n module.exportFunction(prefix + \"_one\");\n module.exportFunction(prefix + \"_load\");\n module.exportFunction(prefix + \"_timesScalar\");\n buildExp(\n module,\n prefix + \"_exp\",\n n8,\n prefix + \"_mul\",\n prefix + \"_square\",\n intPrefix + \"_copy\",\n prefix + \"_one\",\n );\n module.exportFunction(prefix + \"_exp\");\n module.exportFunction(prefix + \"_batchInverse\");\n if (isPrime(q)) {\n buildSqrt();\n buildIsSquare();\n module.exportFunction(prefix + \"_sqrt\");\n module.exportFunction(prefix + \"_isSquare\");\n }\n module.exportFunction(prefix + \"_batchToMontgomery\");\n module.exportFunction(prefix + \"_batchFromMontgomery\");\n // console.log(module.functionIdxByName);\n\n return prefix;\n};\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nimport buildF1m from \"./build_f1m.js\";\nimport { bitLength } from \"./bigint.js\";\n\nexport default function buildF1(module, _q, _prefix, _f1mPrefix, _intPrefix) {\n\n const q = BigInt(_q);\n const n64 = Math.floor((bitLength(q - 1n) - 1)/64) +1;\n const n8 = n64*8;\n\n const prefix = _prefix || \"f1\";\n if (module.modules[prefix]) return prefix; // already builded\n module.modules[prefix] = {\n n64: n64\n };\n\n const intPrefix = _intPrefix || \"int\";\n const f1mPrefix = buildF1m(module, q, _f1mPrefix, intPrefix);\n\n\n const pR2 = module.modules[f1mPrefix].pR2;\n const pq = module.modules[f1mPrefix].pq;\n const pePlusOne = module.modules[f1mPrefix].pePlusOne;\n\n function buildMul() {\n const pAux1 = module.alloc(n8);\n\n const f = module.addFunction(prefix+ \"_mul\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n f.addCode(c.call(f1mPrefix + \"_mul\", c.getLocal(\"x\"), c.getLocal(\"y\"), c.i32_const(pAux1)));\n f.addCode(c.call(f1mPrefix + \"_mul\", c.i32_const(pAux1), c.i32_const(pR2), c.getLocal(\"r\")));\n }\n\n function buildSquare() {\n const f = module.addFunction(prefix+\"_square\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(c.call(prefix + \"_mul\", c.getLocal(\"x\"), c.getLocal(\"x\"), c.getLocal(\"r\")));\n }\n\n\n function buildInverse() {\n\n const f = module.addFunction(prefix+ \"_inverse\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n f.addCode(c.call(intPrefix + \"_inverseMod\", c.getLocal(\"x\"), c.i32_const(pq), c.getLocal(\"r\")));\n }\n\n function buildIsNegative() {\n const f = module.addFunction(prefix+\"_isNegative\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.call(intPrefix + \"_gte\", c.getLocal(\"x\"), c.i32_const(pePlusOne) )\n );\n }\n\n\n buildMul();\n buildSquare();\n buildInverse();\n buildIsNegative();\n module.exportFunction(f1mPrefix + \"_add\", prefix + \"_add\");\n module.exportFunction(f1mPrefix + \"_sub\", prefix + \"_sub\");\n module.exportFunction(f1mPrefix + \"_neg\", prefix + \"_neg\");\n module.exportFunction(prefix + \"_mul\");\n module.exportFunction(prefix + \"_square\");\n module.exportFunction(prefix + \"_inverse\");\n module.exportFunction(prefix + \"_isNegative\");\n module.exportFunction(f1mPrefix + \"_copy\", prefix+\"_copy\");\n module.exportFunction(f1mPrefix + \"_zero\", prefix+\"_zero\");\n module.exportFunction(f1mPrefix + \"_one\", prefix+\"_one\");\n module.exportFunction(f1mPrefix + \"_isZero\", prefix+\"_isZero\");\n module.exportFunction(f1mPrefix + \"_eq\", prefix+\"_eq\");\n\n return prefix;\n};\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\nimport buildExp from \"./build_timesscalar.js\";\nimport buildBatchInverse from \"./build_batchinverse.js\";\nimport * as utils from \"./utils.js\";\n\nexport default function buildF2m(module, mulNonResidueFn, prefix, f1mPrefix) {\n\n if (module.modules[prefix]) return prefix; // already builded\n\n const f1n8 = module.modules[f1mPrefix].n64*8;\n const q = module.modules[f1mPrefix].q;\n\n module.modules[prefix] = {\n n64: module.modules[f1mPrefix].n64*2\n };\n\n function buildAdd() {\n const f = module.addFunction(prefix+\"_add\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const y0 = c.getLocal(\"y\");\n const y1 = c.i32_add(c.getLocal(\"y\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_add\", x0, y0, r0),\n c.call(f1mPrefix+\"_add\", x1, y1, r1),\n );\n }\n\n function buildTimesScalar() {\n const f = module.addFunction(prefix+\"_timesScalar\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"scalar\", \"i32\");\n f.addParam(\"scalarLen\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_timesScalar\", x0, c.getLocal(\"scalar\"), c.getLocal(\"scalarLen\"), r0),\n c.call(f1mPrefix+\"_timesScalar\", x1, c.getLocal(\"scalar\"), c.getLocal(\"scalarLen\"), r1),\n );\n }\n\n function buildSub() {\n const f = module.addFunction(prefix+\"_sub\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const y0 = c.getLocal(\"y\");\n const y1 = c.i32_add(c.getLocal(\"y\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_sub\", x0, y0, r0),\n c.call(f1mPrefix+\"_sub\", x1, y1, r1),\n );\n }\n\n function buildNeg() {\n const f = module.addFunction(prefix+\"_neg\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_neg\", x0, r0),\n c.call(f1mPrefix+\"_neg\", x1, r1),\n );\n }\n\n function buildConjugate() {\n const f = module.addFunction(prefix+\"_conjugate\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_copy\", x0, r0),\n c.call(f1mPrefix+\"_neg\", x1, r1),\n );\n }\n\n\n function buildIsNegative() {\n const f = module.addFunction(prefix+\"_isNegative\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n\n f.addCode(\n c.if(\n c.call(f1mPrefix+\"_isZero\", x1),\n c.ret(c.call(f1mPrefix+\"_isNegative\", x0))\n ),\n c.ret(c.call(f1mPrefix+\"_isNegative\", x1))\n );\n }\n\n function buildMul() {\n const f = module.addFunction(prefix+\"_mul\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const y0 = c.getLocal(\"y\");\n const y1 = c.i32_add(c.getLocal(\"y\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n const A = c.i32_const(module.alloc(f1n8));\n const B = c.i32_const(module.alloc(f1n8));\n const C = c.i32_const(module.alloc(f1n8));\n const D = c.i32_const(module.alloc(f1n8));\n\n\n f.addCode(\n c.call(f1mPrefix + \"_mul\", x0, y0, A), // A = x0*y0\n c.call(f1mPrefix + \"_mul\", x1, y1, B), // B = x1*y1\n\n c.call(f1mPrefix + \"_add\", x0, x1, C), // C = x0 + x1\n c.call(f1mPrefix + \"_add\", y0, y1, D), // D = y0 + y1\n c.call(f1mPrefix + \"_mul\", C, D, C), // C = (x0 + x1)*(y0 + y1) = x0*y0+x0*y1+x1*y0+x1*y1\n\n // c.call(f1mPrefix + \"_mul\", B, c.i32_const(pNonResidue), r0), // r0 = nr*(x1*y1)\n c.call(mulNonResidueFn, B, r0), // r0 = nr*(x1*y1)\n c.call(f1mPrefix + \"_add\", A, r0, r0), // r0 = x0*y0 + nr*(x1*y1)\n c.call(f1mPrefix + \"_add\", A, B, r1), // r1 = x0*y0+x1*y1\n c.call(f1mPrefix + \"_sub\", C, r1, r1) // r1 = x0*y0+x0*y1+x1*y0+x1*y1 - x0*y0+x1*y1 = x0*y1+x1*y0\n );\n\n }\n\n function buildMul1() {\n const f = module.addFunction(prefix+\"_mul1\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const y = c.getLocal(\"y\");\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n\n f.addCode(\n c.call(f1mPrefix + \"_mul\", x0, y, r0), // A = x0*y\n c.call(f1mPrefix + \"_mul\", x1, y, r1), // B = x1*y\n );\n }\n\n function buildSquare() {\n const f = module.addFunction(prefix+\"_square\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n const AB = c.i32_const(module.alloc(f1n8));\n const APB = c.i32_const(module.alloc(f1n8));\n const APNB = c.i32_const(module.alloc(f1n8));\n const ABPNAB = c.i32_const(module.alloc(f1n8));\n\n\n f.addCode(\n // AB = x0*y1\n c.call(f1mPrefix + \"_mul\", x0, x1, AB),\n\n // APB = x0+y1\n c.call(f1mPrefix + \"_add\", x0, x1, APB),\n\n // APBN0 = x0 + nr*x1\n c.call(mulNonResidueFn, x1, APNB),\n c.call(f1mPrefix + \"_add\", x0, APNB, APNB),\n\n // ABPNAB = ab + nr*ab\n c.call(mulNonResidueFn, AB, ABPNAB),\n c.call(f1mPrefix + \"_add\", ABPNAB, AB, ABPNAB),\n\n // r0 = APB * APNB - ABPNAB\n c.call(f1mPrefix + \"_mul\", APB, APNB, r0),\n c.call(f1mPrefix + \"_sub\", r0, ABPNAB, r0),\n\n // r1 = AB + AB\n c.call(f1mPrefix + \"_add\", AB, AB, r1),\n );\n\n }\n\n\n function buildToMontgomery() {\n const f = module.addFunction(prefix+\"_toMontgomery\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_toMontgomery\", x0, r0),\n c.call(f1mPrefix+\"_toMontgomery\", x1, r1)\n );\n }\n\n function buildFromMontgomery() {\n const f = module.addFunction(prefix+\"_fromMontgomery\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_fromMontgomery\", x0, r0),\n c.call(f1mPrefix+\"_fromMontgomery\", x1, r1)\n );\n }\n\n function buildCopy() {\n const f = module.addFunction(prefix+\"_copy\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_copy\", x0, r0),\n c.call(f1mPrefix+\"_copy\", x1, r1)\n );\n }\n\n function buildZero() {\n const f = module.addFunction(prefix+\"_zero\");\n f.addParam(\"x\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_zero\", x0),\n c.call(f1mPrefix+\"_zero\", x1)\n );\n }\n\n function buildOne() {\n const f = module.addFunction(prefix+\"_one\");\n f.addParam(\"x\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_one\", x0),\n c.call(f1mPrefix+\"_zero\", x1)\n );\n }\n\n function buildEq() {\n const f = module.addFunction(prefix+\"_eq\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const y0 = c.getLocal(\"y\");\n const y1 = c.i32_add(c.getLocal(\"y\"), c.i32_const(f1n8));\n\n f.addCode(\n c.i32_and(\n c.call(f1mPrefix+\"_eq\", x0, y0),\n c.call(f1mPrefix+\"_eq\", x1, y1)\n )\n );\n }\n\n function buildIsZero() {\n const f = module.addFunction(prefix+\"_isZero\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n\n f.addCode(\n c.i32_and(\n c.call(f1mPrefix+\"_isZero\", x0),\n c.call(f1mPrefix+\"_isZero\", x1)\n )\n );\n }\n\n function buildInverse() {\n const f = module.addFunction(prefix+\"_inverse\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n\n const t0 = c.i32_const(module.alloc(f1n8));\n const t1 = c.i32_const(module.alloc(f1n8));\n const t2 = c.i32_const(module.alloc(f1n8));\n const t3 = c.i32_const(module.alloc(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_square\", x0, t0),\n c.call(f1mPrefix+\"_square\", x1, t1),\n // c.call(f1mPrefix+\"_mul\", t1, c.i32_const(pNonResidue), t2),\n c.call(mulNonResidueFn, t1, t2),\n\n c.call(f1mPrefix+\"_sub\", t0, t2, t2),\n c.call(f1mPrefix+\"_inverse\", t2, t3),\n\n c.call(f1mPrefix+\"_mul\", x0, t3, r0),\n c.call(f1mPrefix+\"_mul\", x1, t3, r1),\n c.call(f1mPrefix+\"_neg\", r1, r1),\n );\n }\n\n\n function buildSign() {\n const f = module.addFunction(prefix+\"_sign\");\n f.addParam(\"x\", \"i32\");\n f.addLocal(\"s\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n\n f.addCode(\n c.setLocal(\"s\" , c.call( f1mPrefix + \"_sign\", x1)),\n c.if(\n c.getLocal(\"s\"),\n c.ret(c.getLocal(\"s\"))\n ),\n c.ret(c.call( f1mPrefix + \"_sign\", x0))\n );\n }\n\n function buildIsOne() {\n const f = module.addFunction(prefix+\"_isOne\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n\n f.addCode(\n c.ret(c.i32_and(\n c.call(f1mPrefix + \"_isOne\", x0),\n c.call(f1mPrefix + \"_isZero\", x1),\n ))\n );\n }\n\n\n // Check here: https://eprint.iacr.org/2012/685.pdf\n // Alg 9adj\n function buildSqrt() {\n\n const f = module.addFunction(prefix+\"_sqrt\");\n f.addParam(\"a\", \"i32\");\n f.addParam(\"pr\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n // BigInt can't take `undefined` so we use `|| 0`\n const e34 = c.i32_const(module.alloc(utils.bigInt2BytesLE((BigInt(q || 0) - 3n) / 4n, f1n8 )));\n // BigInt can't take `undefined` so we use `|| 0`\n const e12 = c.i32_const(module.alloc(utils.bigInt2BytesLE((BigInt(q || 0) - 1n) / 2n, f1n8 )));\n\n const a = c.getLocal(\"a\");\n const a1 = c.i32_const(module.alloc(f1n8*2));\n const alpha = c.i32_const(module.alloc(f1n8*2));\n const a0 = c.i32_const(module.alloc(f1n8*2));\n const pn1 = module.alloc(f1n8*2);\n const n1 = c.i32_const(pn1);\n const n1a = c.i32_const(pn1);\n const n1b = c.i32_const(pn1+f1n8);\n const x0 = c.i32_const(module.alloc(f1n8*2));\n const b = c.i32_const(module.alloc(f1n8*2));\n\n f.addCode(\n\n c.call(prefix + \"_one\", n1),\n c.call(prefix + \"_neg\", n1, n1),\n\n // const a1 = F.pow(a, F.sqrt_e34);\n c.call(prefix + \"_exp\", a, e34, c.i32_const(f1n8), a1),\n\n // const a1 = F.pow(a, F.sqrt_e34);\n c.call(prefix + \"_square\", a1, alpha),\n c.call(prefix + \"_mul\", a, alpha, alpha),\n\n // const a0 = F.mul(F.frobenius(1, alfa), alfa);\n c.call(prefix + \"_conjugate\", alpha, a0),\n c.call(prefix + \"_mul\", a0, alpha, a0),\n\n // if (F.eq(a0, F.negone)) return null;\n c.if(c.call(prefix + \"_eq\",a0,n1), c.unreachable() ),\n\n // const x0 = F.mul(a1, a);\n c.call(prefix + \"_mul\", a1, a, x0),\n\n // if (F.eq(alfa, F.negone)) {\n c.if(\n c.call(prefix + \"_eq\", alpha, n1),\n [\n // x = F.mul(x0, [F.F.zero, F.F.one]);\n ...c.call(f1mPrefix + \"_zero\", n1a),\n ...c.call(f1mPrefix + \"_one\", n1b),\n ...c.call(prefix + \"_mul\", n1, x0, c.getLocal(\"pr\")),\n ],\n [\n // const b = F.pow(F.add(F.one, alfa), F.sqrt_e12);\n ...c.call(prefix + \"_one\", b),\n ...c.call(prefix + \"_add\", b, alpha, b),\n ...c.call(prefix + \"_exp\", b, e12, c.i32_const(f1n8), b),\n\n // x = F.mul(b, x0);\n ...c.call(prefix + \"_mul\", b, x0, c.getLocal(\"pr\")),\n ]\n )\n );\n\n }\n\n\n function buildIsSquare() {\n\n const f = module.addFunction(prefix+\"_isSquare\");\n f.addParam(\"a\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n // BigInt can't take `undefined` so we use `|| 0`\n const e34 = c.i32_const(module.alloc(utils.bigInt2BytesLE((BigInt(q || 0) - 3n) / 4n, f1n8 )));\n\n const a = c.getLocal(\"a\");\n const a1 = c.i32_const(module.alloc(f1n8*2));\n const alpha = c.i32_const(module.alloc(f1n8*2));\n const a0 = c.i32_const(module.alloc(f1n8*2));\n const pn1 = module.alloc(f1n8*2);\n const n1 = c.i32_const(pn1);\n\n f.addCode(\n\n c.call(prefix + \"_one\", n1),\n c.call(prefix + \"_neg\", n1, n1),\n\n // const a1 = F.pow(a, F.sqrt_e34);\n c.call(prefix + \"_exp\", a, e34, c.i32_const(f1n8), a1),\n\n // const a1 = F.pow(a, F.sqrt_e34);\n c.call(prefix + \"_square\", a1, alpha),\n c.call(prefix + \"_mul\", a, alpha, alpha),\n\n // const a0 = F.mul(F.frobenius(1, alfa), alfa);\n c.call(prefix + \"_conjugate\", alpha, a0),\n c.call(prefix + \"_mul\", a0, alpha, a0),\n\n // if (F.eq(a0, F.negone)) return null;\n c.if(\n c.call(\n prefix + \"_eq\",\n a0,\n n1\n ),\n c.ret(c.i32_const(0))\n ),\n c.ret(c.i32_const(1))\n );\n\n }\n\n\n buildIsZero();\n buildIsOne();\n buildZero();\n buildOne();\n buildCopy();\n buildMul();\n buildMul1();\n buildSquare();\n buildAdd();\n buildSub();\n buildNeg();\n buildConjugate();\n buildToMontgomery();\n buildFromMontgomery();\n buildEq();\n buildInverse();\n buildTimesScalar();\n buildSign();\n buildIsNegative();\n\n module.exportFunction(prefix + \"_isZero\");\n module.exportFunction(prefix + \"_isOne\");\n module.exportFunction(prefix + \"_zero\");\n module.exportFunction(prefix + \"_one\");\n module.exportFunction(prefix + \"_copy\");\n module.exportFunction(prefix + \"_mul\");\n module.exportFunction(prefix + \"_mul1\");\n module.exportFunction(prefix + \"_square\");\n module.exportFunction(prefix + \"_add\");\n module.exportFunction(prefix + \"_sub\");\n module.exportFunction(prefix + \"_neg\");\n module.exportFunction(prefix + \"_sign\");\n module.exportFunction(prefix + \"_conjugate\");\n module.exportFunction(prefix + \"_fromMontgomery\");\n module.exportFunction(prefix + \"_toMontgomery\");\n module.exportFunction(prefix + \"_eq\");\n module.exportFunction(prefix + \"_inverse\");\n buildBatchInverse(module, prefix);\n buildExp(\n module,\n prefix + \"_exp\",\n f1n8*2,\n prefix + \"_mul\",\n prefix + \"_square\",\n prefix + \"_copy\",\n prefix + \"_one\",\n );\n buildSqrt();\n buildIsSquare();\n\n module.exportFunction(prefix + \"_exp\");\n module.exportFunction(prefix + \"_timesScalar\");\n module.exportFunction(prefix + \"_batchInverse\");\n module.exportFunction(prefix + \"_sqrt\");\n module.exportFunction(prefix + \"_isSquare\");\n module.exportFunction(prefix + \"_isNegative\");\n\n\n return prefix;\n};\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\nimport buildExp from \"./build_timesscalar.js\";\nimport buildBatchInverse from \"./build_batchinverse.js\";\n\nexport default function buildF3m(module, mulNonResidueFn, prefix, f1mPrefix) {\n\n if (module.modules[prefix]) return prefix; // already builded\n\n const f1n8 = module.modules[f1mPrefix].n64*8;\n module.modules[prefix] = {\n n64: module.modules[f1mPrefix].n64*3\n };\n\n function buildAdd() {\n const f = module.addFunction(prefix+\"_add\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const y0 = c.getLocal(\"y\");\n const y1 = c.i32_add(c.getLocal(\"y\"), c.i32_const(f1n8));\n const y2 = c.i32_add(c.getLocal(\"y\"), c.i32_const(2*f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_add\", x0, y0, r0),\n c.call(f1mPrefix+\"_add\", x1, y1, r1),\n c.call(f1mPrefix+\"_add\", x2, y2, r2),\n );\n }\n\n function buildTimesScalar() {\n const f = module.addFunction(prefix+\"_timesScalar\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"scalar\", \"i32\");\n f.addParam(\"scalarLen\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_timesScalar\", x0, c.getLocal(\"scalar\"), c.getLocal(\"scalarLen\"), r0),\n c.call(f1mPrefix+\"_timesScalar\", x1, c.getLocal(\"scalar\"), c.getLocal(\"scalarLen\"), r1),\n c.call(f1mPrefix+\"_timesScalar\", x2, c.getLocal(\"scalar\"), c.getLocal(\"scalarLen\"), r2),\n );\n }\n\n\n function buildSub() {\n const f = module.addFunction(prefix+\"_sub\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const y0 = c.getLocal(\"y\");\n const y1 = c.i32_add(c.getLocal(\"y\"), c.i32_const(f1n8));\n const y2 = c.i32_add(c.getLocal(\"y\"), c.i32_const(2*f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_sub\", x0, y0, r0),\n c.call(f1mPrefix+\"_sub\", x1, y1, r1),\n c.call(f1mPrefix+\"_sub\", x2, y2, r2),\n );\n }\n\n function buildNeg() {\n const f = module.addFunction(prefix+\"_neg\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_neg\", x0, r0),\n c.call(f1mPrefix+\"_neg\", x1, r1),\n c.call(f1mPrefix+\"_neg\", x2, r2),\n );\n }\n\n function buildIsNegative() {\n const f = module.addFunction(prefix+\"_isNegative\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.if(\n c.call(f1mPrefix+\"_isZero\", x2),\n c.if(\n c.call(f1mPrefix+\"_isZero\", x1),\n c.ret(c.call(f1mPrefix+\"_isNegative\", x0)),\n c.ret(c.call(f1mPrefix+\"_isNegative\", x1))\n )\n ),\n c.ret(c.call(f1mPrefix+\"_isNegative\", x2))\n );\n }\n\n\n function buildMul() {\n const f = module.addFunction(prefix+\"_mul\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const cd = f.getCodeBuilder();\n\n const a = cd.getLocal(\"x\");\n const b = cd.i32_add(cd.getLocal(\"x\"), cd.i32_const(f1n8));\n const c = cd.i32_add(cd.getLocal(\"x\"), cd.i32_const(2*f1n8));\n const A = cd.getLocal(\"y\");\n const B = cd.i32_add(cd.getLocal(\"y\"), cd.i32_const(f1n8));\n const C = cd.i32_add(cd.getLocal(\"y\"), cd.i32_const(2*f1n8));\n const r0 = cd.getLocal(\"r\");\n const r1 = cd.i32_add(cd.getLocal(\"r\"), cd.i32_const(f1n8));\n const r2 = cd.i32_add(cd.getLocal(\"r\"), cd.i32_const(2*f1n8));\n\n const aA = cd.i32_const(module.alloc(f1n8));\n const bB = cd.i32_const(module.alloc(f1n8));\n const cC = cd.i32_const(module.alloc(f1n8));\n const a_b = cd.i32_const(module.alloc(f1n8));\n const A_B = cd.i32_const(module.alloc(f1n8));\n const a_c = cd.i32_const(module.alloc(f1n8));\n const A_C = cd.i32_const(module.alloc(f1n8));\n const b_c = cd.i32_const(module.alloc(f1n8));\n const B_C = cd.i32_const(module.alloc(f1n8));\n const aA_bB = cd.i32_const(module.alloc(f1n8));\n const aA_cC = cd.i32_const(module.alloc(f1n8));\n const bB_cC = cd.i32_const(module.alloc(f1n8));\n const AUX = cd.i32_const(module.alloc(f1n8));\n\n\n f.addCode(\n cd.call(f1mPrefix + \"_mul\", a, A, aA),\n cd.call(f1mPrefix + \"_mul\", b, B, bB),\n cd.call(f1mPrefix + \"_mul\", c, C, cC),\n\n cd.call(f1mPrefix + \"_add\", a, b, a_b),\n cd.call(f1mPrefix + \"_add\", A, B, A_B),\n cd.call(f1mPrefix + \"_add\", a, c, a_c),\n cd.call(f1mPrefix + \"_add\", A, C, A_C),\n cd.call(f1mPrefix + \"_add\", b, c, b_c),\n cd.call(f1mPrefix + \"_add\", B, C, B_C),\n\n cd.call(f1mPrefix + \"_add\", aA, bB, aA_bB),\n cd.call(f1mPrefix + \"_add\", aA, cC, aA_cC),\n cd.call(f1mPrefix + \"_add\", bB, cC, bB_cC),\n\n cd.call(f1mPrefix + \"_mul\", b_c, B_C, r0),\n cd.call(f1mPrefix + \"_sub\", r0, bB_cC, r0),\n cd.call(mulNonResidueFn, r0, r0),\n cd.call(f1mPrefix + \"_add\", aA, r0, r0),\n\n cd.call(f1mPrefix + \"_mul\", a_b, A_B, r1),\n cd.call(f1mPrefix + \"_sub\", r1, aA_bB, r1),\n cd.call(mulNonResidueFn, cC, AUX),\n cd.call(f1mPrefix + \"_add\", r1, AUX, r1),\n\n cd.call(f1mPrefix + \"_mul\", a_c, A_C, r2),\n cd.call(f1mPrefix + \"_sub\", r2, aA_cC, r2),\n cd.call(f1mPrefix + \"_add\", r2, bB, r2),\n );\n\n }\n\n function buildSquare() {\n const f = module.addFunction(prefix+\"_square\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const A = c.getLocal(\"x\");\n const B = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const C = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f1n8));\n\n const s0 = c.i32_const(module.alloc(f1n8));\n const ab = c.i32_const(module.alloc(f1n8));\n const s1 = c.i32_const(module.alloc(f1n8));\n const s2 = c.i32_const(module.alloc(f1n8));\n const bc = c.i32_const(module.alloc(f1n8));\n const s3 = c.i32_const(module.alloc(f1n8));\n const s4 = c.i32_const(module.alloc(f1n8));\n\n\n f.addCode(\n\n c.call(f1mPrefix + \"_square\", A, s0),\n c.call(f1mPrefix + \"_mul\", A, B, ab),\n c.call(f1mPrefix + \"_add\", ab, ab, s1),\n\n c.call(f1mPrefix + \"_sub\", A, B, s2),\n c.call(f1mPrefix + \"_add\", s2, C, s2),\n c.call(f1mPrefix + \"_square\", s2, s2),\n\n c.call(f1mPrefix + \"_mul\", B, C, bc),\n c.call(f1mPrefix + \"_add\", bc, bc, s3),\n\n c.call(f1mPrefix + \"_square\", C, s4),\n\n c.call(mulNonResidueFn, s3, r0),\n c.call(f1mPrefix + \"_add\", s0, r0, r0),\n\n c.call(mulNonResidueFn, s4, r1),\n c.call(f1mPrefix + \"_add\", s1, r1, r1),\n\n c.call(f1mPrefix + \"_add\", s0, s4, r2),\n c.call(f1mPrefix + \"_sub\", s3, r2, r2),\n c.call(f1mPrefix + \"_add\", s2, r2, r2),\n c.call(f1mPrefix + \"_add\", s1, r2, r2),\n );\n\n }\n\n\n function buildToMontgomery() {\n const f = module.addFunction(prefix+\"_toMontgomery\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_toMontgomery\", x0, r0),\n c.call(f1mPrefix+\"_toMontgomery\", x1, r1),\n c.call(f1mPrefix+\"_toMontgomery\", x2, r2)\n );\n }\n\n function buildFromMontgomery() {\n const f = module.addFunction(prefix+\"_fromMontgomery\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_fromMontgomery\", x0, r0),\n c.call(f1mPrefix+\"_fromMontgomery\", x1, r1),\n c.call(f1mPrefix+\"_fromMontgomery\", x2, r2)\n );\n }\n\n function buildCopy() {\n const f = module.addFunction(prefix+\"_copy\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_copy\", x0, r0),\n c.call(f1mPrefix+\"_copy\", x1, r1),\n c.call(f1mPrefix+\"_copy\", x2, r2),\n );\n }\n\n function buildZero() {\n const f = module.addFunction(prefix+\"_zero\");\n f.addParam(\"x\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_zero\", x0),\n c.call(f1mPrefix+\"_zero\", x1),\n c.call(f1mPrefix+\"_zero\", x2),\n );\n }\n\n function buildOne() {\n const f = module.addFunction(prefix+\"_one\");\n f.addParam(\"x\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_one\", x0),\n c.call(f1mPrefix+\"_zero\", x1),\n c.call(f1mPrefix+\"_zero\", x2),\n );\n }\n\n function buildEq() {\n const f = module.addFunction(prefix+\"_eq\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"y\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const y0 = c.getLocal(\"y\");\n const y1 = c.i32_add(c.getLocal(\"y\"), c.i32_const(f1n8));\n const y2 = c.i32_add(c.getLocal(\"y\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.i32_and(\n c.i32_and(\n c.call(f1mPrefix+\"_eq\", x0, y0),\n c.call(f1mPrefix+\"_eq\", x1, y1),\n ),\n c.call(f1mPrefix+\"_eq\", x2, y2)\n )\n );\n }\n\n function buildIsZero() {\n const f = module.addFunction(prefix+\"_isZero\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.i32_and(\n c.i32_and(\n c.call(f1mPrefix+\"_isZero\", x0),\n c.call(f1mPrefix+\"_isZero\", x1)\n ),\n c.call(f1mPrefix+\"_isZero\", x2)\n )\n );\n }\n\n function buildInverse() {\n const f = module.addFunction(prefix+\"_inverse\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n const r0 = c.getLocal(\"r\");\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f1n8));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f1n8));\n\n const t0 = c.i32_const(module.alloc(f1n8));\n const t1 = c.i32_const(module.alloc(f1n8));\n const t2 = c.i32_const(module.alloc(f1n8));\n const t3 = c.i32_const(module.alloc(f1n8));\n const t4 = c.i32_const(module.alloc(f1n8));\n const t5 = c.i32_const(module.alloc(f1n8));\n const c0 = c.i32_const(module.alloc(f1n8));\n const c1 = c.i32_const(module.alloc(f1n8));\n const c2 = c.i32_const(module.alloc(f1n8));\n const t6 = c.i32_const(module.alloc(f1n8));\n const AUX = c.i32_const(module.alloc(f1n8));\n\n f.addCode(\n c.call(f1mPrefix+\"_square\", x0, t0),\n c.call(f1mPrefix+\"_square\", x1, t1),\n c.call(f1mPrefix+\"_square\", x2, t2),\n c.call(f1mPrefix+\"_mul\", x0, x1, t3),\n c.call(f1mPrefix+\"_mul\", x0, x2, t4),\n c.call(f1mPrefix+\"_mul\", x1, x2, t5),\n\n c.call(mulNonResidueFn, t5, c0),\n c.call(f1mPrefix+\"_sub\", t0, c0, c0),\n\n c.call(mulNonResidueFn, t2, c1),\n c.call(f1mPrefix+\"_sub\", c1, t3, c1),\n\n c.call(f1mPrefix+\"_sub\", t1, t4, c2),\n\n c.call(f1mPrefix+\"_mul\", x2, c1, t6),\n c.call(f1mPrefix+\"_mul\", x1, c2, AUX),\n c.call(f1mPrefix+\"_add\", t6, AUX, t6),\n c.call(mulNonResidueFn, t6, t6),\n c.call(f1mPrefix+\"_mul\", x0, c0, AUX),\n c.call(f1mPrefix+\"_add\", AUX, t6, t6),\n\n c.call(f1mPrefix+\"_inverse\", t6, t6),\n\n c.call(f1mPrefix+\"_mul\", t6, c0, r0),\n c.call(f1mPrefix+\"_mul\", t6, c1, r1),\n c.call(f1mPrefix+\"_mul\", t6, c2, r2)\n );\n }\n\n\n function buildSign() {\n const f = module.addFunction(prefix+\"_sign\");\n f.addParam(\"x\", \"i32\");\n f.addLocal(\"s\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f1n8));\n\n f.addCode(\n c.setLocal(\"s\" , c.call( f1mPrefix + \"_sign\", x2)),\n c.if(\n c.getLocal(\"s\"),\n c.ret(c.getLocal(\"s\"))\n ),\n c.setLocal(\"s\" , c.call( f1mPrefix + \"_sign\", x1)),\n c.if(\n c.getLocal(\"s\"),\n c.ret(c.getLocal(\"s\"))\n ),\n c.ret(c.call( f1mPrefix + \"_sign\", x0))\n );\n }\n\n function buildIsOne() {\n const f = module.addFunction(prefix+\"_isOne\");\n f.addParam(\"x\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f1n8*2));\n\n f.addCode(\n c.ret(\n c.i32_and(\n c.i32_and(\n c.call(f1mPrefix + \"_isOne\", x0),\n c.call(f1mPrefix + \"_isZero\", x1)\n ),\n c.call(f1mPrefix + \"_isZero\", x2)\n )\n )\n );\n }\n\n buildIsZero();\n buildIsOne();\n buildZero();\n buildOne();\n buildCopy();\n buildMul();\n buildSquare();\n buildAdd();\n buildSub();\n buildNeg();\n buildSign();\n buildToMontgomery();\n buildFromMontgomery();\n buildEq();\n buildInverse();\n buildTimesScalar();\n buildIsNegative();\n\n module.exportFunction(prefix + \"_isZero\");\n module.exportFunction(prefix + \"_isOne\");\n module.exportFunction(prefix + \"_zero\");\n module.exportFunction(prefix + \"_one\");\n module.exportFunction(prefix + \"_copy\");\n module.exportFunction(prefix + \"_mul\");\n module.exportFunction(prefix + \"_square\");\n module.exportFunction(prefix + \"_add\");\n module.exportFunction(prefix + \"_sub\");\n module.exportFunction(prefix + \"_neg\");\n module.exportFunction(prefix + \"_sign\");\n module.exportFunction(prefix + \"_fromMontgomery\");\n module.exportFunction(prefix + \"_toMontgomery\");\n module.exportFunction(prefix + \"_eq\");\n module.exportFunction(prefix + \"_inverse\");\n buildBatchInverse(module, prefix);\n buildExp(\n module,\n prefix + \"_exp\",\n f1n8*3,\n prefix + \"_mul\",\n prefix + \"_square\",\n prefix + \"_copy\",\n prefix + \"_one\"\n );\n module.exportFunction(prefix + \"_exp\");\n module.exportFunction(prefix + \"_timesScalar\");\n module.exportFunction(prefix + \"_batchInverse\");\n module.exportFunction(prefix + \"_isNegative\");\n\n return prefix;\n};\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nexport default function buildTimesScalarNAF(module, fnName, elementLen, opAB, opAA, opAmB, opCopy, opInit) {\n\n const f = module.addFunction(fnName);\n f.addParam(\"base\", \"i32\");\n f.addParam(\"scalar\", \"i32\");\n f.addParam(\"scalarLength\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"old0\", \"i32\");\n f.addLocal(\"nbits\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"last\", \"i32\");\n f.addLocal(\"cur\", \"i32\");\n f.addLocal(\"carry\", \"i32\");\n f.addLocal(\"p\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const aux = c.i32_const(module.alloc(elementLen));\n\n function getBit(IDX) {\n return c.i32_and(\n c.i32_shr_u(\n c.i32_load(\n c.i32_add(\n c.getLocal(\"scalar\"),\n c.i32_and(\n c.i32_shr_u(\n IDX,\n c.i32_const(3)\n ),\n c.i32_const(0xFFFFFFFC)\n )\n )\n ),\n c.i32_and(\n IDX,\n c.i32_const(0x1F)\n )\n ),\n c.i32_const(1)\n );\n }\n\n function pushBit(b) {\n return [\n ...c.i32_store8(\n c.getLocal(\"p\"),\n c.i32_const(b)\n ),\n ...c.setLocal(\n \"p\",\n c.i32_add(\n c.getLocal(\"p\"),\n c.i32_const(1)\n )\n )\n ];\n }\n\n f.addCode(\n c.if(\n c.i32_eqz(c.getLocal(\"scalarLength\")),\n [\n ...c.call(opInit, c.getLocal(\"r\")),\n ...c.ret([])\n ]\n ),\n c.setLocal(\"nbits\", c.i32_shl(c.getLocal(\"scalarLength\"), c.i32_const(3))),\n c.setLocal(\"old0\", c.i32_load(c.i32_const(0))),\n c.setLocal(\"p\", c.getLocal(\"old0\")),\n c.i32_store(\n c.i32_const(0),\n c.i32_and(\n c.i32_add(\n c.i32_add(\n c.getLocal(\"old0\"),\n c.i32_const(32)\n ),\n c.getLocal(\"nbits\")\n ),\n c.i32_const(0xFFFFFFF8)\n )\n ),\n c.setLocal(\"i\", c.i32_const(1)),\n\n c.setLocal(\"last\",getBit(c.i32_const(0))),\n c.setLocal(\"carry\",c.i32_const(0)),\n\n c.block(c.loop(\n c.br_if(1, c.i32_eq( c.getLocal(\"i\"), c.getLocal(\"nbits\"))),\n\n c.setLocal(\"cur\", getBit(c.getLocal(\"i\"))),\n c.if( c.getLocal(\"last\"),\n c.if( c.getLocal(\"cur\"),\n c.if(c.getLocal(\"carry\"),\n [\n ...c.setLocal(\"last\", c.i32_const(0)),\n ...c.setLocal(\"carry\", c.i32_const(1)),\n ...pushBit(1)\n ]\n ,\n [\n ...c.setLocal(\"last\", c.i32_const(0)),\n ...c.setLocal(\"carry\", c.i32_const(1)),\n ...pushBit(255)\n ],\n ),\n c.if(c.getLocal(\"carry\"),\n [\n ...c.setLocal(\"last\", c.i32_const(0)),\n ...c.setLocal(\"carry\", c.i32_const(1)),\n ...pushBit(255)\n ]\n ,\n [\n ...c.setLocal(\"last\", c.i32_const(0)),\n ...c.setLocal(\"carry\", c.i32_const(0)),\n ...pushBit(1)\n ],\n ),\n ),\n c.if( c.getLocal(\"cur\"),\n c.if(c.getLocal(\"carry\"),\n [\n ...c.setLocal(\"last\", c.i32_const(0)),\n ...c.setLocal(\"carry\", c.i32_const(1)),\n ...pushBit(0)\n ]\n ,\n [\n ...c.setLocal(\"last\", c.i32_const(1)),\n ...c.setLocal(\"carry\", c.i32_const(0)),\n ...pushBit(0)\n ],\n ),\n c.if(c.getLocal(\"carry\"),\n [\n ...c.setLocal(\"last\", c.i32_const(1)),\n ...c.setLocal(\"carry\", c.i32_const(0)),\n ...pushBit(0)\n ]\n ,\n [\n ...c.setLocal(\"last\", c.i32_const(0)),\n ...c.setLocal(\"carry\", c.i32_const(0)),\n ...pushBit(0)\n ],\n ),\n )\n ),\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n )),\n\n c.if( c.getLocal(\"last\"),\n c.if(c.getLocal(\"carry\"),\n [\n ...pushBit(255),\n ...pushBit(0),\n ...pushBit(1)\n ]\n ,\n [\n ...pushBit(1)\n ],\n ),\n c.if(c.getLocal(\"carry\"),\n [\n ...pushBit(0),\n ...pushBit(1)\n ]\n ),\n ),\n\n c.setLocal(\"p\", c.i32_sub(c.getLocal(\"p\"), c.i32_const(1))),\n\n // p already points to the last bit\n\n c.call(opCopy, c.getLocal(\"base\"), aux),\n\n c.call(opInit, c.getLocal(\"r\")),\n\n c.block(c.loop(\n\n\n c.call(opAA, c.getLocal(\"r\"), c.getLocal(\"r\")),\n\n\n c.setLocal(\"cur\",\n c.i32_load8_u(\n c.getLocal(\"p\")\n )\n ),\n\n c.if(\n c.getLocal(\"cur\"),\n c.if(\n c.i32_eq(c.getLocal(\"cur\"), c.i32_const(1)),\n c.call(opAB, c.getLocal(\"r\"), aux, c.getLocal(\"r\")),\n c.call(opAmB, c.getLocal(\"r\"), aux, c.getLocal(\"r\")),\n )\n ),\n\n c.br_if(1, c.i32_eq( c.getLocal(\"old0\"), c.getLocal(\"p\"))),\n c.setLocal(\"p\", c.i32_sub(c.getLocal(\"p\"), c.i32_const(1))),\n c.br(0)\n\n )),\n\n c.i32_store( c.i32_const(0), c.getLocal(\"old0\"))\n\n );\n\n};\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nexport default function buildMultiexp(module, prefix, fnName, opAdd, n8b) {\n\n const n64g = module.modules[prefix].n64;\n const n8g = n64g*8;\n\n function buildGetChunk() {\n const f = module.addFunction(fnName + \"_getChunk\");\n f.addParam(\"pScalar\", \"i32\");\n f.addParam(\"scalarSize\", \"i32\"); // Number of bytes of the scalar\n f.addParam(\"startBit\", \"i32\"); // Bit to start extract\n f.addParam(\"chunkSize\", \"i32\"); // Chunk size in bits\n f.addLocal(\"bitsToEnd\", \"i32\");\n f.addLocal(\"mask\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.setLocal(\"bitsToEnd\",\n c.i32_sub(\n c.i32_mul(\n c.getLocal(\"scalarSize\"),\n c.i32_const(8)\n ),\n c.getLocal(\"startBit\")\n )\n ),\n c.if(\n c.i32_gt_s(\n c.getLocal(\"chunkSize\"),\n c.getLocal(\"bitsToEnd\")\n ),\n c.setLocal(\n \"mask\",\n c.i32_sub(\n c.i32_shl(\n c.i32_const(1),\n c.getLocal(\"bitsToEnd\")\n ),\n c.i32_const(1)\n )\n ),\n c.setLocal(\n \"mask\",\n c.i32_sub(\n c.i32_shl(\n c.i32_const(1),\n c.getLocal(\"chunkSize\")\n ),\n c.i32_const(1)\n )\n )\n ),\n c.i32_and(\n c.i32_shr_u(\n c.i32_load(\n c.i32_add(\n c.getLocal(\"pScalar\"),\n c.i32_shr_u(\n c.getLocal(\"startBit\"),\n c.i32_const(3)\n )\n ),\n 0, // offset\n 0 // align to byte.\n ),\n c.i32_and(\n c.getLocal(\"startBit\"),\n c.i32_const(0x7)\n )\n ),\n c.getLocal(\"mask\")\n )\n );\n }\n\n function buildMutiexpChunk() {\n const f = module.addFunction(fnName + \"_chunk\");\n f.addParam(\"pBases\", \"i32\");\n f.addParam(\"pScalars\", \"i32\");\n f.addParam(\"scalarSize\", \"i32\"); // Number of points\n f.addParam(\"n\", \"i32\"); // Number of points\n f.addParam(\"startBit\", \"i32\"); // bit where it starts the chunk\n f.addParam(\"chunkSize\", \"i32\"); // bit where it starts the chunk\n f.addParam(\"pr\", \"i32\");\n f.addLocal(\"nChunks\", \"i32\");\n f.addLocal(\"itScalar\", \"i32\");\n f.addLocal(\"endScalar\", \"i32\");\n f.addLocal(\"itBase\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"j\", \"i32\");\n f.addLocal(\"nTable\", \"i32\");\n f.addLocal(\"pTable\", \"i32\");\n f.addLocal(\"idx\", \"i32\");\n f.addLocal(\"pIdxTable\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.if(\n c.i32_eqz(c.getLocal(\"n\")),\n [\n ...c.call(prefix + \"_zero\", c.getLocal(\"pr\")),\n ...c.ret([])\n ]\n ),\n\n // Allocate memory\n\n c.setLocal(\n \"nTable\",\n c.i32_shl(\n c.i32_const(1),\n c.getLocal(\"chunkSize\")\n )\n ),\n c.setLocal(\"pTable\", c.i32_load( c.i32_const(0) )),\n c.i32_store(\n c.i32_const(0),\n c.i32_add(\n c.getLocal(\"pTable\"),\n c.i32_mul(\n c.getLocal(\"nTable\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n // Reset Table\n c.setLocal(\"j\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"j\"),\n c.getLocal(\"nTable\")\n )\n ),\n\n c.call(\n prefix + \"_zero\",\n c.i32_add(\n c.getLocal(\"pTable\"),\n c.i32_mul(\n c.getLocal(\"j\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\"j\", c.i32_add(c.getLocal(\"j\"), c.i32_const(1))),\n c.br(0)\n )),\n\n // Distribute elements\n c.setLocal(\"itBase\", c.getLocal(\"pBases\")),\n c.setLocal(\"itScalar\", c.getLocal(\"pScalars\")),\n c.setLocal(\"endScalar\",\n c.i32_add(\n c.getLocal(\"pScalars\"),\n c.i32_mul(\n c.getLocal(\"n\"),\n c.getLocal(\"scalarSize\")\n )\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"itScalar\"),\n c.getLocal(\"endScalar\")\n )\n ),\n\n c.setLocal(\n \"idx\",\n c.call(fnName + \"_getChunk\",\n c.getLocal(\"itScalar\"),\n c.getLocal(\"scalarSize\"),\n c.getLocal(\"startBit\"),\n c.getLocal(\"chunkSize\")\n )\n ),\n\n c.if(\n c.getLocal(\"idx\"),\n [\n ...c.setLocal(\n \"pIdxTable\",\n c.i32_add(\n c.getLocal(\"pTable\"),\n c.i32_mul(\n c.i32_sub(\n c.getLocal(\"idx\"),\n c.i32_const(1)\n ),\n c.i32_const(n8g)\n )\n )\n ),\n ...c.call(\n opAdd,\n c.getLocal(\"pIdxTable\"),\n c.getLocal(\"itBase\"),\n c.getLocal(\"pIdxTable\"),\n )\n ]\n ),\n\n c.setLocal(\"itScalar\", c.i32_add(c.getLocal(\"itScalar\"), c.getLocal(\"scalarSize\"))),\n c.setLocal(\"itBase\", c.i32_add(c.getLocal(\"itBase\"), c.i32_const(n8b))),\n c.br(0)\n )),\n\n c.call(fnName + \"_reduceTable\", c.getLocal(\"pTable\"), c.getLocal(\"chunkSize\")),\n c.call(\n prefix + \"_copy\",\n c.getLocal(\"pTable\"),\n c.getLocal(\"pr\")\n ),\n\n\n c.i32_store(\n c.i32_const(0),\n c.getLocal(\"pTable\")\n )\n\n );\n }\n\n function buildMultiexp() {\n const f = module.addFunction(fnName);\n f.addParam(\"pBases\", \"i32\");\n f.addParam(\"pScalars\", \"i32\");\n f.addParam(\"scalarSize\", \"i32\"); // Number of points\n f.addParam(\"n\", \"i32\"); // Number of points\n f.addParam(\"pr\", \"i32\");\n f.addLocal(\"chunkSize\", \"i32\");\n f.addLocal(\"nChunks\", \"i32\");\n f.addLocal(\"itScalar\", \"i32\");\n f.addLocal(\"endScalar\", \"i32\");\n f.addLocal(\"itBase\", \"i32\");\n f.addLocal(\"itBit\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"j\", \"i32\");\n f.addLocal(\"nTable\", \"i32\");\n f.addLocal(\"pTable\", \"i32\");\n f.addLocal(\"idx\", \"i32\");\n f.addLocal(\"pIdxTable\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const aux = c.i32_const(module.alloc(n8g));\n\n const pTSizes = module.alloc([\n 17, 17, 17, 17, 17, 17, 17, 17,\n 17, 17, 16, 16, 15, 14, 13, 13,\n 12, 11, 10, 9, 8, 7, 7, 6,\n 5 , 4, 3, 2, 1, 1, 1, 1\n ]);\n\n f.addCode(\n c.call(prefix + \"_zero\", c.getLocal(\"pr\")),\n c.if(\n c.i32_eqz(c.getLocal(\"n\")),\n c.ret([])\n ),\n c.setLocal(\"chunkSize\", c.i32_load8_u( c.i32_clz(c.getLocal(\"n\")), pTSizes )),\n c.setLocal(\n \"nChunks\",\n c.i32_add(\n c.i32_div_u(\n c.i32_sub(\n c.i32_shl(\n c.getLocal(\"scalarSize\"),\n c.i32_const(3)\n ),\n c.i32_const(1)\n ),\n c.getLocal(\"chunkSize\")\n ),\n c.i32_const(1)\n )\n ),\n\n\n // Allocate memory\n\n c.setLocal(\n \"itBit\",\n c.i32_mul(\n c.i32_sub(\n c.getLocal(\"nChunks\"),\n c.i32_const(1)\n ),\n c.getLocal(\"chunkSize\")\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_lt_s(\n c.getLocal(\"itBit\"),\n c.i32_const(0)\n )\n ),\n\n // Double nChunk times\n c.if(\n c.i32_eqz(c.call(prefix + \"_isZero\", c.getLocal(\"pr\"))),\n [\n ...c.setLocal(\"j\", c.i32_const(0)),\n ...c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"j\"),\n c.getLocal(\"chunkSize\")\n )\n ),\n\n c.call(prefix + \"_double\", c.getLocal(\"pr\"), c.getLocal(\"pr\")),\n\n c.setLocal(\"j\", c.i32_add(c.getLocal(\"j\"), c.i32_const(1))),\n c.br(0)\n ))\n ]\n ),\n\n c.call(\n fnName + \"_chunk\",\n c.getLocal(\"pBases\"),\n c.getLocal(\"pScalars\"),\n c.getLocal(\"scalarSize\"),\n c.getLocal(\"n\"),\n c.getLocal(\"itBit\"),\n c.getLocal(\"chunkSize\"),\n aux\n ),\n\n c.call(\n prefix + \"_add\",\n c.getLocal(\"pr\"),\n aux,\n c.getLocal(\"pr\")\n ),\n c.setLocal(\"itBit\", c.i32_sub(c.getLocal(\"itBit\"), c.getLocal(\"chunkSize\"))),\n c.br(0)\n ))\n );\n }\n\n function buildReduceTable() {\n const f = module.addFunction(fnName + \"_reduceTable\");\n f.addParam(\"pTable\", \"i32\");\n f.addParam(\"p\", \"i32\"); // Number of bits of the table\n f.addLocal(\"half\", \"i32\");\n f.addLocal(\"it1\", \"i32\");\n f.addLocal(\"it2\", \"i32\");\n f.addLocal(\"pAcc\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.if(\n c.i32_eq(c.getLocal(\"p\"), c.i32_const(1)),\n c.ret([])\n ),\n c.setLocal(\n \"half\",\n c.i32_shl(\n c.i32_const(1),\n c.i32_sub(\n c.getLocal(\"p\"),\n c.i32_const(1)\n )\n )\n ),\n\n c.setLocal(\"it1\", c.getLocal(\"pTable\")),\n c.setLocal(\n \"it2\",\n c.i32_add(\n c.getLocal(\"pTable\"),\n c.i32_mul(\n c.getLocal(\"half\"),\n c.i32_const(n8g)\n )\n )\n ),\n c.setLocal(\"pAcc\",\n c.i32_sub(\n c.getLocal(\"it2\"),\n c.i32_const(n8g)\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"it1\"),\n c.getLocal(\"pAcc\")\n )\n ),\n c.call(\n prefix + \"_add\",\n c.getLocal(\"it1\"),\n c.getLocal(\"it2\"),\n c.getLocal(\"it1\")\n ),\n c.call(\n prefix + \"_add\",\n c.getLocal(\"pAcc\"),\n c.getLocal(\"it2\"),\n c.getLocal(\"pAcc\")\n ),\n c.setLocal(\"it1\", c.i32_add(c.getLocal(\"it1\"), c.i32_const(n8g))),\n c.setLocal(\"it2\", c.i32_add(c.getLocal(\"it2\"), c.i32_const(n8g))),\n c.br(0)\n )),\n\n c.call(\n fnName + \"_reduceTable\",\n c.getLocal(\"pTable\"),\n c.i32_sub(\n c.getLocal(\"p\"),\n c.i32_const(1)\n )\n ),\n\n c.setLocal(\"p\", c.i32_sub(c.getLocal(\"p\"), c.i32_const(1))),\n c.block(c.loop(\n c.br_if(1, c.i32_eqz(c.getLocal(\"p\"))),\n c.call(prefix + \"_double\", c.getLocal(\"pAcc\"), c.getLocal(\"pAcc\")),\n c.setLocal(\"p\", c.i32_sub(c.getLocal(\"p\"), c.i32_const(1))),\n c.br(0)\n )),\n\n c.call(prefix + \"_add\", c.getLocal(\"pTable\"), c.getLocal(\"pAcc\"), c.getLocal(\"pTable\"))\n );\n }\n\n buildGetChunk();\n buildReduceTable();\n buildMutiexpChunk();\n buildMultiexp();\n\n module.exportFunction(fnName);\n module.exportFunction(fnName +\"_chunk\");\n\n\n};\n\n\n\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nimport buildTimesScalarNAF from \"./build_timesscalarnaf.js\";\n//import buildTimesScalar from \"./build_timesscalar.js\";\nimport buildBatchConvertion from \"./build_batchconvertion.js\";\nimport buildMultiexp from \"./build_multiexp.js\";\n\nexport default function buildCurve(module, prefix, prefixField, pB) {\n\n\n const n64 = module.modules[prefixField].n64;\n const n8 = n64*8;\n\n if (module.modules[prefix]) return prefix; // already builded\n module.modules[prefix] = {\n n64: n64*3\n };\n\n function buildIsZero() {\n const f = module.addFunction(prefix + \"_isZero\");\n f.addParam(\"p1\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(c.call(\n prefixField + \"_isZero\",\n c.i32_add(\n c.getLocal(\"p1\"),\n c.i32_const(n8*2)\n )\n ));\n }\n function buildIsZeroAffine() {\n const f = module.addFunction(prefix + \"_isZeroAffine\");\n f.addParam(\"p1\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.i32_and(\n c.call(\n prefixField + \"_isZero\",\n c.getLocal(\"p1\")\n ),\n c.call(\n prefixField + \"_isZero\",\n c.i32_add(\n c.getLocal(\"p1\"),\n c.i32_const(n8)\n )\n )\n )\n );\n }\n\n function buildCopy() {\n const f = module.addFunction(prefix + \"_copy\");\n f.addParam(\"ps\", \"i32\");\n f.addParam(\"pd\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n for (let i=0; i.\n*/\n\nimport { isOdd, modInv, modPow } from \"./bigint.js\";\nimport * as utils from \"./utils.js\";\n\nexport default function buildFFT(module, prefix, gPrefix, fPrefix, opGtimesF) {\n\n const n64f = module.modules[fPrefix].n64;\n const n8f = n64f*8;\n\n const n64g = module.modules[gPrefix].n64;\n const n8g = n64g*8;\n\n const q = module.modules[fPrefix].q;\n\n let rem = q - 1n;\n let maxBits = 0;\n while (!isOdd(rem)) {\n maxBits ++;\n rem = rem >> 1n;\n }\n\n let nr = 2n;\n\n while ( modPow(nr, q >> 1n, q) === 1n ) nr = nr + 1n;\n\n // console.log(nr);\n\n const w = new Array(maxBits+1);\n w[maxBits] = modPow(nr, rem, q);\n\n let n=maxBits-1;\n while (n>=0) {\n w[n] = modPow(w[n+1], 2n, q);\n n--;\n }\n\n const bytes = [];\n const R = (1n << BigInt(n8f*8)) % q;\n\n for (let i=0; i> i);\n }\n }\n return r;\n }\n\n const rtable = Array(256);\n for (let i=0; i<256; i++) {\n rtable[i] = rev(i);\n }\n\n const REVTABLE = module.alloc(rtable);\n\n\n function buildLog2() {\n const f = module.addFunction(prefix+\"__log2\");\n f.addParam(\"n\", \"i32\");\n f.setReturnType(\"i32\");\n f.addLocal(\"bits\", \"i32\");\n f.addLocal(\"aux\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.setLocal(\n \"aux\",\n c.i32_shr_u(\n c.getLocal(\"n\"),\n c.i32_const(1)\n )\n )\n );\n f.addCode(c.setLocal(\"bits\", c.i32_const(0)));\n\n f.addCode(c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eqz(c.getLocal(\"aux\"))\n ),\n\n c.setLocal(\n \"aux\",\n c.i32_shr_u(\n c.getLocal(\"aux\"),\n c.i32_const(1)\n )\n ),\n\n c.setLocal(\n \"bits\",\n c.i32_add(\n c.getLocal(\"bits\"),\n c.i32_const(1)\n )\n ),\n\n c.br(0)\n )));\n\n f.addCode(c.if(\n c.i32_ne(\n c.getLocal(\"n\"),\n c.i32_shl(\n c.i32_const(1),\n c.getLocal(\"bits\")\n )\n ),\n c.unreachable()\n ));\n\n f.addCode(c.if(\n c.i32_gt_u(\n c.getLocal(\"bits\"),\n c.i32_const(maxBits)\n ),\n c.unreachable()\n ));\n\n f.addCode(c.getLocal(\"bits\"));\n }\n\n function buildFFT() {\n const f = module.addFunction(prefix+\"_fft\");\n f.addParam(\"px\", \"i32\");\n f.addParam(\"n\", \"i32\");\n\n f.addLocal(\"bits\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const One = c.i32_const(module.alloc(n8f));\n\n f.addCode(\n c.setLocal(\n \"bits\",\n c.call(\n prefix + \"__log2\",\n c.getLocal(\"n\")\n )\n ),\n c.call(fPrefix + \"_one\", One),\n c.call(\n prefix+\"_rawfft\",\n c.getLocal(\"px\"),\n c.getLocal(\"bits\"),\n c.i32_const(0),\n One\n )\n );\n\n }\n\n function buildIFFT() {\n const f = module.addFunction(prefix+\"_ifft\");\n f.addParam(\"px\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addLocal(\"bits\", \"i32\");\n f.addLocal(\"pInv2\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.setLocal(\n \"bits\",\n c.call(\n prefix + \"__log2\",\n c.getLocal(\"n\")\n )\n ),\n c.setLocal(\n \"pInv2\",\n c.i32_add(\n c.i32_const(INV2),\n c.i32_mul(\n c.getLocal(\"bits\"),\n c.i32_const(n8f)\n )\n )\n ),\n\n c.call(\n prefix+\"_rawfft\",\n c.getLocal(\"px\"),\n c.getLocal(\"bits\"),\n c.i32_const(1),\n c.getLocal(\"pInv2\")\n ),\n );\n }\n\n function buildRawFFT() {\n const f = module.addFunction(prefix+\"_rawfft\");\n f.addParam(\"px\", \"i32\");\n f.addParam(\"bits\", \"i32\"); // 2 power\n f.addParam(\"reverse\", \"i32\");\n f.addParam(\"mulFactor\", \"i32\");\n\n f.addLocal(\"s\", \"i32\");\n f.addLocal(\"k\", \"i32\");\n f.addLocal(\"j\", \"i32\");\n f.addLocal(\"m\", \"i32\");\n f.addLocal(\"mdiv2\", \"i32\");\n f.addLocal(\"n\", \"i32\");\n f.addLocal(\"pwm\", \"i32\");\n f.addLocal(\"idx1\", \"i32\");\n f.addLocal(\"idx2\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const W = c.i32_const(module.alloc(n8f));\n const T = c.i32_const(module.alloc(n8g));\n const U = c.i32_const(module.alloc(n8g));\n\n f.addCode(\n c.call(prefix + \"__reversePermutation\", c.getLocal(\"px\"), c.getLocal(\"bits\")),\n c.setLocal(\"n\", c.i32_shl(c.i32_const(1), c.getLocal(\"bits\"))),\n c.setLocal(\"s\", c.i32_const(1)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_gt_u(\n c.getLocal(\"s\"),\n c.getLocal(\"bits\")\n )\n ),\n c.setLocal(\"m\", c.i32_shl(c.i32_const(1), c.getLocal(\"s\"))),\n c.setLocal(\"pwm\",\n c.i32_add(\n c.i32_const(ROOTs),\n c.i32_mul(\n c.getLocal(\"s\"),\n c.i32_const(n8f)\n )\n )\n ),\n c.setLocal(\"k\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_ge_u(\n c.getLocal(\"k\"),\n c.getLocal(\"n\")\n )\n ),\n\n c.call(fPrefix + \"_one\", W),\n\n c.setLocal(\"mdiv2\", c.i32_shr_u(c.getLocal(\"m\"), c.i32_const(1)) ),\n c.setLocal(\"j\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_ge_u(\n c.getLocal(\"j\"),\n c.getLocal(\"mdiv2\")\n )\n ),\n\n c.setLocal(\n \"idx1\",\n c.i32_add(\n c.getLocal(\"px\"),\n c.i32_mul(\n c.i32_add(\n c.getLocal(\"k\"),\n c.getLocal(\"j\")\n ),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\n \"idx2\",\n c.i32_add(\n c.getLocal(\"idx1\"),\n c.i32_mul(\n c.getLocal(\"mdiv2\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx2\"),\n W,\n T\n ),\n\n c.call(\n gPrefix + \"_copy\",\n c.getLocal(\"idx1\"),\n U\n ),\n\n c.call(\n gPrefix + \"_add\",\n U,\n T,\n c.getLocal(\"idx1\"),\n ),\n\n c.call(\n gPrefix + \"_sub\",\n U,\n T,\n c.getLocal(\"idx2\"),\n ),\n\n c.call(\n fPrefix + \"_mul\",\n W,\n c.getLocal(\"pwm\"),\n W,\n ),\n\n c.setLocal(\"j\", c.i32_add(c.getLocal(\"j\"), c.i32_const(1))),\n c.br(0)\n )),\n\n c.setLocal(\"k\", c.i32_add(c.getLocal(\"k\"), c.getLocal(\"m\"))),\n c.br(0)\n )),\n\n c.setLocal(\"s\", c.i32_add(c.getLocal(\"s\"), c.i32_const(1))),\n c.br(0)\n )),\n c.call(\n prefix + \"__fftFinal\",\n c.getLocal(\"px\"),\n c.getLocal(\"bits\"),\n c.getLocal(\"reverse\"),\n c.getLocal(\"mulFactor\")\n )\n );\n }\n\n\n function buildFinalInverse() {\n const f = module.addFunction(prefix+\"__fftFinal\");\n f.addParam(\"px\", \"i32\");\n f.addParam(\"bits\", \"i32\");\n f.addParam(\"reverse\", \"i32\");\n f.addParam(\"mulFactor\", \"i32\");\n f.addLocal(\"n\", \"i32\");\n f.addLocal(\"ndiv2\", \"i32\");\n f.addLocal(\"pInv2\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"mask\", \"i32\");\n f.addLocal(\"idx1\", \"i32\");\n f.addLocal(\"idx2\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const T = c.i32_const(module.alloc(n8g));\n\n f.addCode(\n c.if(\n c.i32_and(\n c.i32_eqz(c.getLocal(\"reverse\")),\n c.call(fPrefix + \"_isOne\", c.getLocal(\"mulFactor\"))\n ),\n c.ret([])\n ),\n c.setLocal(\"n\", c.i32_shl( c.i32_const(1), c.getLocal(\"bits\"))),\n\n c.setLocal(\"mask\", c.i32_sub( c.getLocal(\"n\") , c.i32_const(1))),\n c.setLocal(\"i\", c.i32_const(1)),\n c.setLocal(\n \"ndiv2\",\n c.i32_shr_u(\n c.getLocal(\"n\"),\n c.i32_const(1)\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_ge_u(\n c.getLocal(\"i\"),\n c.getLocal(\"ndiv2\")\n )\n ),\n\n c.setLocal(\"idx1\",\n c.i32_add(\n c.getLocal(\"px\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\"idx2\",\n c.i32_add(\n c.getLocal(\"px\"),\n c.i32_mul(\n c.i32_sub(\n c.getLocal(\"n\"),\n c.getLocal(\"i\")\n ),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.if(\n c.getLocal(\"reverse\"),\n c.if(\n c.call(fPrefix + \"_isOne\", c.getLocal(\"mulFactor\")),\n [\n ...c.call(gPrefix + \"_copy\", c.getLocal(\"idx1\"), T),\n ...c.call(gPrefix + \"_copy\", c.getLocal(\"idx2\") , c.getLocal(\"idx1\") ),\n ...c.call(gPrefix + \"_copy\", T , c.getLocal(\"idx2\")),\n ],\n [\n ...c.call(gPrefix + \"_copy\", c.getLocal(\"idx1\"), T),\n ...c.call(opGtimesF , c.getLocal(\"idx2\") , c.getLocal(\"mulFactor\"), c.getLocal(\"idx1\") ),\n ...c.call(opGtimesF , T , c.getLocal(\"mulFactor\"), c.getLocal(\"idx2\")),\n ]\n ),\n c.if(\n c.call(fPrefix + \"_isOne\", c.getLocal(\"mulFactor\")),\n [\n // Do nothing (It should not be here)\n ],\n [\n ...c.call(opGtimesF , c.getLocal(\"idx1\") , c.getLocal(\"mulFactor\"), c.getLocal(\"idx1\") ),\n ...c.call(opGtimesF , c.getLocal(\"idx2\") , c.getLocal(\"mulFactor\"), c.getLocal(\"idx2\")),\n ]\n )\n ),\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n\n c.br(0)\n )),\n\n c.if(\n c.call(fPrefix + \"_isOne\", c.getLocal(\"mulFactor\")),\n [\n // Do nothing (It should not be here)\n ],\n [\n ...c.call(opGtimesF, c.getLocal(\"px\") , c.getLocal(\"mulFactor\"), c.getLocal(\"px\")),\n ...c.setLocal(\"idx2\",\n c.i32_add(\n c.getLocal(\"px\"),\n c.i32_mul(\n c.getLocal(\"ndiv2\"),\n c.i32_const(n8g)\n )\n )\n ),\n ...c.call(opGtimesF, c.getLocal(\"idx2\"),c.getLocal(\"mulFactor\"), c.getLocal(\"idx2\"))\n ]\n )\n );\n }\n\n function buildReversePermutation() {\n const f = module.addFunction(prefix+\"__reversePermutation\");\n f.addParam(\"px\", \"i32\");\n f.addParam(\"bits\", \"i32\");\n f.addLocal(\"n\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"ri\", \"i32\");\n f.addLocal(\"idx1\", \"i32\");\n f.addLocal(\"idx2\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const T = c.i32_const(module.alloc(n8g));\n\n f.addCode(\n c.setLocal(\"n\", c.i32_shl( c.i32_const(1), c.getLocal(\"bits\"))),\n c.setLocal(\"i\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"i\"),\n c.getLocal(\"n\")\n )\n ),\n\n c.setLocal(\"idx1\",\n c.i32_add(\n c.getLocal(\"px\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\"ri\", c.call(prefix + \"__rev\", c.getLocal(\"i\"), c.getLocal(\"bits\"))),\n\n c.setLocal(\"idx2\",\n c.i32_add(\n c.getLocal(\"px\"),\n c.i32_mul(\n c.getLocal(\"ri\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.if(\n c.i32_lt_u(\n c.getLocal(\"i\"),\n c.getLocal(\"ri\")\n ),\n [\n ...c.call(gPrefix + \"_copy\", c.getLocal(\"idx1\"), T),\n ...c.call(gPrefix + \"_copy\", c.getLocal(\"idx2\") , c.getLocal(\"idx1\")),\n ...c.call(gPrefix + \"_copy\", T , c.getLocal(\"idx2\"))\n ]\n ),\n\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n\n c.br(0)\n ))\n );\n }\n\n function buildRev() {\n const f = module.addFunction(prefix+\"__rev\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"bits\", \"i32\");\n f.setReturnType(\"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.i32_rotl(\n c.i32_add(\n c.i32_add(\n c.i32_shl(\n c.i32_load8_u(\n c.i32_and(\n c.getLocal(\"x\"),\n c.i32_const(0xFF)\n ),\n REVTABLE,\n 0\n ),\n c.i32_const(24)\n ),\n c.i32_shl(\n c.i32_load8_u(\n c.i32_and(\n c.i32_shr_u(\n c.getLocal(\"x\"),\n c.i32_const(8)\n ),\n c.i32_const(0xFF)\n ),\n REVTABLE,\n 0\n ),\n c.i32_const(16)\n ),\n ),\n c.i32_add(\n c.i32_shl(\n c.i32_load8_u(\n c.i32_and(\n c.i32_shr_u(\n c.getLocal(\"x\"),\n c.i32_const(16)\n ),\n c.i32_const(0xFF)\n ),\n REVTABLE,\n 0\n ),\n c.i32_const(8)\n ),\n c.i32_load8_u(\n c.i32_and(\n c.i32_shr_u(\n c.getLocal(\"x\"),\n c.i32_const(24)\n ),\n c.i32_const(0xFF)\n ),\n REVTABLE,\n 0\n ),\n )\n ),\n c.getLocal(\"bits\")\n )\n );\n }\n\n\n function buildFFTJoin() {\n const f = module.addFunction(prefix+\"_fftJoin\");\n f.addParam(\"pBuff1\", \"i32\");\n f.addParam(\"pBuff2\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"first\", \"i32\");\n f.addParam(\"inc\", \"i32\");\n f.addLocal(\"idx1\", \"i32\");\n f.addLocal(\"idx2\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const W = c.i32_const(module.alloc(n8f));\n const T = c.i32_const(module.alloc(n8g));\n const U = c.i32_const(module.alloc(n8g));\n\n f.addCode(\n c.call( fPrefix + \"_copy\", c.getLocal(\"first\"), W),\n c.setLocal(\"i\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"i\"),\n c.getLocal(\"n\")\n )\n ),\n\n c.setLocal(\n \"idx1\",\n c.i32_add(\n c.getLocal(\"pBuff1\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\n \"idx2\",\n c.i32_add(\n c.getLocal(\"pBuff2\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx2\"),\n W,\n T\n ),\n\n c.call(\n gPrefix + \"_copy\",\n c.getLocal(\"idx1\"),\n U\n ),\n\n c.call(\n gPrefix + \"_add\",\n U,\n T,\n c.getLocal(\"idx1\"),\n ),\n\n c.call(\n gPrefix + \"_sub\",\n U,\n T,\n c.getLocal(\"idx2\"),\n ),\n\n c.call(\n fPrefix + \"_mul\",\n W,\n c.getLocal(\"inc\"),\n W,\n ),\n\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n }\n\n\n function buildFFTJoinExt() {\n const f = module.addFunction(prefix+\"_fftJoinExt\");\n f.addParam(\"pBuff1\", \"i32\");\n f.addParam(\"pBuff2\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"first\", \"i32\");\n f.addParam(\"inc\", \"i32\");\n f.addParam(\"totalBits\", \"i32\");\n f.addLocal(\"idx1\", \"i32\");\n f.addLocal(\"idx2\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"pShiftToM\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const W = c.i32_const(module.alloc(n8f));\n const U = c.i32_const(module.alloc(n8g));\n\n f.addCode(\n\n c.setLocal(\"pShiftToM\",\n c.i32_add(\n c.i32_const(SHIFT_TO_M),\n c.i32_mul(\n c.getLocal(\"totalBits\"),\n c.i32_const(n8f)\n )\n )\n ),\n\n\n c.call( fPrefix + \"_copy\", c.getLocal(\"first\"), W),\n c.setLocal(\"i\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"i\"),\n c.getLocal(\"n\")\n )\n ),\n\n c.setLocal(\n \"idx1\",\n c.i32_add(\n c.getLocal(\"pBuff1\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\n \"idx2\",\n c.i32_add(\n c.getLocal(\"pBuff2\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.call(\n gPrefix + \"_add\",\n c.getLocal(\"idx1\"),\n c.getLocal(\"idx2\"),\n U\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx2\"),\n c.getLocal(\"pShiftToM\"),\n c.getLocal(\"idx2\")\n ),\n\n c.call(\n gPrefix + \"_add\",\n c.getLocal(\"idx1\"),\n c.getLocal(\"idx2\"),\n c.getLocal(\"idx2\")\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx2\"),\n W,\n c.getLocal(\"idx2\"),\n ),\n\n c.call(\n gPrefix + \"_copy\",\n U,\n c.getLocal(\"idx1\")\n ),\n\n c.call(\n fPrefix + \"_mul\",\n W,\n c.getLocal(\"inc\"),\n W\n ),\n\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n }\n\n function buildFFTJoinExtInv() {\n const f = module.addFunction(prefix+\"_fftJoinExtInv\");\n f.addParam(\"pBuff1\", \"i32\");\n f.addParam(\"pBuff2\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"first\", \"i32\");\n f.addParam(\"inc\", \"i32\");\n f.addParam(\"totalBits\", \"i32\");\n f.addLocal(\"idx1\", \"i32\");\n f.addLocal(\"idx2\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"pShiftToM\", \"i32\");\n f.addLocal(\"pSConst\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const W = c.i32_const(module.alloc(n8f));\n const U = c.i32_const(module.alloc(n8g));\n\n f.addCode(\n\n c.setLocal(\"pShiftToM\",\n c.i32_add(\n c.i32_const(SHIFT_TO_M),\n c.i32_mul(\n c.getLocal(\"totalBits\"),\n c.i32_const(n8f)\n )\n )\n ),\n c.setLocal(\"pSConst\",\n c.i32_add(\n c.i32_const(SCONST),\n c.i32_mul(\n c.getLocal(\"totalBits\"),\n c.i32_const(n8f)\n )\n )\n ),\n\n\n c.call( fPrefix + \"_copy\", c.getLocal(\"first\"), W),\n c.setLocal(\"i\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"i\"),\n c.getLocal(\"n\")\n )\n ),\n\n c.setLocal(\n \"idx1\",\n c.i32_add(\n c.getLocal(\"pBuff1\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\n \"idx2\",\n c.i32_add(\n c.getLocal(\"pBuff2\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx2\"),\n W,\n U\n ),\n\n c.call(\n gPrefix + \"_sub\",\n c.getLocal(\"idx1\"),\n U,\n c.getLocal(\"idx2\"),\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx2\"),\n c.getLocal(\"pSConst\"),\n c.getLocal(\"idx2\")\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx1\"),\n c.getLocal(\"pShiftToM\"),\n c.getLocal(\"idx1\")\n ),\n\n c.call(\n gPrefix + \"_sub\",\n U,\n c.getLocal(\"idx1\"),\n c.getLocal(\"idx1\")\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx1\"),\n c.getLocal(\"pSConst\"),\n c.getLocal(\"idx1\")\n ),\n\n c.call(\n fPrefix + \"_mul\",\n W,\n c.getLocal(\"inc\"),\n W\n ),\n\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n }\n\n\n\n function buildPrepareLagrangeEvaluation() {\n const f = module.addFunction(prefix+\"_prepareLagrangeEvaluation\");\n f.addParam(\"pBuff1\", \"i32\");\n f.addParam(\"pBuff2\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"first\", \"i32\");\n f.addParam(\"inc\", \"i32\");\n f.addParam(\"totalBits\", \"i32\");\n f.addLocal(\"idx1\", \"i32\");\n f.addLocal(\"idx2\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"pShiftToM\", \"i32\");\n f.addLocal(\"pSConst\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const W = c.i32_const(module.alloc(n8f));\n const U = c.i32_const(module.alloc(n8g));\n\n f.addCode(\n\n c.setLocal(\"pShiftToM\",\n c.i32_add(\n c.i32_const(SHIFT_TO_M),\n c.i32_mul(\n c.getLocal(\"totalBits\"),\n c.i32_const(n8f)\n )\n )\n ),\n c.setLocal(\"pSConst\",\n c.i32_add(\n c.i32_const(SCONST),\n c.i32_mul(\n c.getLocal(\"totalBits\"),\n c.i32_const(n8f)\n )\n )\n ),\n\n\n c.call( fPrefix + \"_copy\", c.getLocal(\"first\"), W),\n c.setLocal(\"i\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"i\"),\n c.getLocal(\"n\")\n )\n ),\n\n c.setLocal(\n \"idx1\",\n c.i32_add(\n c.getLocal(\"pBuff1\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\n \"idx2\",\n c.i32_add(\n c.getLocal(\"pBuff2\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx1\"),\n c.getLocal(\"pShiftToM\"),\n U\n ),\n\n c.call(\n gPrefix + \"_sub\",\n c.getLocal(\"idx2\"),\n U,\n U\n ),\n\n c.call(\n gPrefix + \"_sub\",\n c.getLocal(\"idx1\"),\n c.getLocal(\"idx2\"),\n c.getLocal(\"idx2\"),\n ),\n\n c.call(\n opGtimesF,\n U,\n c.getLocal(\"pSConst\"),\n c.getLocal(\"idx1\"),\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx2\"),\n W,\n c.getLocal(\"idx2\"),\n ),\n\n c.call(\n fPrefix + \"_mul\",\n W,\n c.getLocal(\"inc\"),\n W\n ),\n\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n }\n\n function buildFFTMix() {\n const f = module.addFunction(prefix+\"_fftMix\");\n f.addParam(\"pBuff\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"exp\", \"i32\");\n f.addLocal(\"nGroups\", \"i32\");\n f.addLocal(\"nPerGroup\", \"i32\");\n f.addLocal(\"nPerGroupDiv2\", \"i32\");\n f.addLocal(\"pairOffset\", \"i32\");\n f.addLocal(\"idx1\", \"i32\");\n f.addLocal(\"idx2\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"j\", \"i32\");\n f.addLocal(\"pwm\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const W = c.i32_const(module.alloc(n8f));\n const T = c.i32_const(module.alloc(n8g));\n const U = c.i32_const(module.alloc(n8g));\n\n f.addCode(\n c.setLocal(\"nPerGroup\", c.i32_shl(c.i32_const(1), c.getLocal(\"exp\"))),\n c.setLocal(\"nPerGroupDiv2\", c.i32_shr_u(c.getLocal(\"nPerGroup\"), c.i32_const(1))),\n c.setLocal(\"nGroups\", c.i32_shr_u(c.getLocal(\"n\"), c.getLocal(\"exp\"))),\n c.setLocal(\"pairOffset\", c.i32_mul(c.getLocal(\"nPerGroupDiv2\"), c.i32_const(n8g))),\n c.setLocal(\"pwm\",\n c.i32_add(\n c.i32_const(ROOTs),\n c.i32_mul(\n c.getLocal(\"exp\"),\n c.i32_const(n8f)\n )\n )\n ),\n c.setLocal(\"i\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"i\"),\n c.getLocal(\"nGroups\")\n )\n ),\n c.call( fPrefix + \"_one\", W),\n c.setLocal(\"j\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"j\"),\n c.getLocal(\"nPerGroupDiv2\")\n )\n ),\n\n c.setLocal(\n \"idx1\",\n c.i32_add(\n c.getLocal(\"pBuff\"),\n c.i32_mul(\n c.i32_add(\n c.i32_mul(\n c.getLocal(\"i\"),\n c.getLocal(\"nPerGroup\")\n ),\n c.getLocal(\"j\")\n ),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\n \"idx2\",\n c.i32_add(\n c.getLocal(\"idx1\"),\n c.getLocal(\"pairOffset\")\n )\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx2\"),\n W,\n T\n ),\n\n c.call(\n gPrefix + \"_copy\",\n c.getLocal(\"idx1\"),\n U\n ),\n\n c.call(\n gPrefix + \"_add\",\n U,\n T,\n c.getLocal(\"idx1\"),\n ),\n\n c.call(\n gPrefix + \"_sub\",\n U,\n T,\n c.getLocal(\"idx2\"),\n ),\n\n c.call(\n fPrefix + \"_mul\",\n W,\n c.getLocal(\"pwm\"),\n W,\n ),\n c.setLocal(\"j\", c.i32_add(c.getLocal(\"j\"), c.i32_const(1))),\n c.br(0)\n )),\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n }\n\n\n // Reverse all and multiply by factor\n function buildFFTFinal() {\n const f = module.addFunction(prefix+\"_fftFinal\");\n f.addParam(\"pBuff\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"factor\", \"i32\");\n f.addLocal(\"idx1\", \"i32\");\n f.addLocal(\"idx2\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"ndiv2\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const T = c.i32_const(module.alloc(n8g));\n\n f.addCode(\n c.setLocal(\"ndiv2\", c.i32_shr_u(c.getLocal(\"n\"), c.i32_const(1))),\n c.if(\n c.i32_and(\n c.getLocal(\"n\"),\n c.i32_const(1)\n ),\n c.call(\n opGtimesF,\n c.i32_add(\n c.getLocal(\"pBuff\"),\n c.i32_mul(\n c.getLocal(\"ndiv2\"),\n c.i32_const(n8g)\n )\n ),\n c.getLocal(\"factor\"),\n c.i32_add(\n c.getLocal(\"pBuff\"),\n c.i32_mul(\n c.getLocal(\"ndiv2\"),\n c.i32_const(n8g)\n )\n ),\n ),\n ),\n c.setLocal(\"i\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_ge_u(\n c.getLocal(\"i\"),\n c.getLocal(\"ndiv2\")\n )\n ),\n\n c.setLocal(\n \"idx1\",\n c.i32_add(\n c.getLocal(\"pBuff\"),\n c.i32_mul(\n c.getLocal(\"i\"),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.setLocal(\n \"idx2\",\n c.i32_add(\n c.getLocal(\"pBuff\"),\n c.i32_mul(\n c.i32_sub(\n c.i32_sub(\n c.getLocal(\"n\"),\n c.i32_const(1)\n ),\n c.getLocal(\"i\")\n ),\n c.i32_const(n8g)\n )\n )\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx2\"),\n c.getLocal(\"factor\"),\n T\n ),\n\n c.call(\n opGtimesF,\n c.getLocal(\"idx1\"),\n c.getLocal(\"factor\"),\n c.getLocal(\"idx2\"),\n ),\n\n c.call(\n gPrefix + \"_copy\",\n T,\n c.getLocal(\"idx1\"),\n ),\n\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n }\n\n buildRev();\n buildReversePermutation();\n buildFinalInverse();\n buildRawFFT();\n buildLog2();\n buildFFT();\n buildIFFT();\n buildFFTJoin();\n buildFFTJoinExt();\n buildFFTJoinExtInv();\n buildFFTMix();\n buildFFTFinal();\n buildPrepareLagrangeEvaluation();\n\n module.exportFunction(prefix+\"__reversePermutation\");\n module.exportFunction(prefix+\"_fft\");\n module.exportFunction(prefix+\"_ifft\");\n module.exportFunction(prefix+\"_rawfft\");\n module.exportFunction(prefix+\"_fftJoin\");\n module.exportFunction(prefix+\"_fftJoinExt\");\n module.exportFunction(prefix+\"_fftJoinExtInv\");\n module.exportFunction(prefix+\"_fftMix\");\n module.exportFunction(prefix+\"_fftFinal\");\n module.exportFunction(prefix+\"_prepareLagrangeEvaluation\");\n\n};\n","/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nexport default function buildPol(module, prefix, prefixField) {\n\n const n64 = module.modules[prefixField].n64;\n const n8 = n64*8;\n\n\n function buildZero() {\n const f = module.addFunction(prefix+\"_zero\");\n f.addParam(\"px\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addLocal(\"lastp\", \"i32\");\n f.addLocal(\"p\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.setLocal(\"p\", c.getLocal(\"px\")),\n c.setLocal(\n \"lastp\",\n c.i32_add(\n c.getLocal(\"px\"),\n c.i32_mul(\n c.getLocal(\"n\"),\n c.i32_const(n8)\n )\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"p\"),\n c.getLocal(\"lastp\")\n )\n ),\n c.call(prefixField + \"_zero\", c.getLocal(\"p\")),\n c.setLocal(\"p\", c.i32_add(c.getLocal(\"p\"), c.i32_const(n8))),\n c.br(0)\n ))\n );\n }\n\n function buildConstructLC() {\n const f = module.addFunction(prefix+\"_constructLC\");\n f.addParam(\"ppolynomials\", \"i32\");\n f.addParam(\"psignals\", \"i32\");\n f.addParam(\"nSignals\", \"i32\");\n f.addParam(\"pres\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"j\", \"i32\");\n f.addLocal(\"pp\", \"i32\");\n f.addLocal(\"ps\", \"i32\");\n f.addLocal(\"pd\", \"i32\");\n f.addLocal(\"ncoefs\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const aux = c.i32_const(module.alloc(n8));\n\n f.addCode(\n c.setLocal(\"i\", c.i32_const(0)),\n c.setLocal(\"pp\", c.getLocal(\"ppolynomials\")),\n c.setLocal(\"ps\", c.getLocal(\"psignals\")),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"i\"),\n c.getLocal(\"nSignals\")\n )\n ),\n\n c.setLocal(\"ncoefs\", c.i32_load(c.getLocal(\"pp\"))),\n c.setLocal(\"pp\", c.i32_add(c.getLocal(\"pp\"), c.i32_const(4))),\n\n c.setLocal(\"j\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"j\"),\n c.getLocal(\"ncoefs\")\n )\n ),\n\n c.setLocal(\n \"pd\",\n c.i32_add(\n c.getLocal(\"pres\"),\n c.i32_mul(\n c.i32_load(c.getLocal(\"pp\")),\n c.i32_const(n8)\n )\n )\n ),\n\n c.setLocal(\"pp\", c.i32_add(c.getLocal(\"pp\"), c.i32_const(4))),\n\n\n c.call(\n prefixField + \"_mul\",\n c.getLocal(\"ps\"),\n c.getLocal(\"pp\"),\n aux\n ),\n\n c.call(\n prefixField + \"_add\",\n aux,\n c.getLocal(\"pd\"),\n c.getLocal(\"pd\")\n ),\n\n c.setLocal(\"pp\", c.i32_add(c.getLocal(\"pp\"), c.i32_const(n8))),\n c.setLocal(\"j\", c.i32_add(c.getLocal(\"j\"), c.i32_const(1))),\n c.br(0)\n )),\n\n c.setLocal(\"ps\", c.i32_add(c.getLocal(\"ps\"), c.i32_const(n8))),\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n\n }\n\n buildZero();\n buildConstructLC();\n\n\n module.exportFunction(prefix + \"_zero\");\n module.exportFunction(prefix + \"_constructLC\");\n\n return prefix;\n\n\n\n\n};\n","\nexport default function buildQAP(module, prefix, prefixField) {\n\n const n64 = module.modules[prefixField].n64;\n const n8 = n64*8;\n\n\n function buildBuildABC() {\n const f = module.addFunction(prefix+\"_buildABC\");\n f.addParam(\"pCoefs\", \"i32\");\n f.addParam(\"nCoefs\", \"i32\");\n f.addParam(\"pWitness\", \"i32\");\n f.addParam(\"pA\", \"i32\");\n f.addParam(\"pB\", \"i32\");\n f.addParam(\"pC\", \"i32\");\n f.addParam(\"offsetOut\", \"i32\");\n f.addParam(\"nOut\", \"i32\");\n f.addParam(\"offsetWitness\", \"i32\");\n f.addParam(\"nWitness\", \"i32\");\n f.addLocal(\"it\", \"i32\");\n f.addLocal(\"ita\", \"i32\");\n f.addLocal(\"itb\", \"i32\");\n f.addLocal(\"last\", \"i32\");\n f.addLocal(\"m\", \"i32\");\n f.addLocal(\"c\", \"i32\");\n f.addLocal(\"s\", \"i32\");\n f.addLocal(\"pOut\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const aux = c.i32_const(module.alloc(n8));\n\n f.addCode(\n\n // Set output a and b to 0\n c.setLocal(\"ita\", c.getLocal(\"pA\")),\n c.setLocal(\"itb\", c.getLocal(\"pB\")),\n c.setLocal(\n \"last\",\n c.i32_add(\n c.getLocal(\"pA\"),\n c.i32_mul(\n c.getLocal(\"nOut\"),\n c.i32_const(n8)\n )\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"ita\"),\n c.getLocal(\"last\")\n )\n ),\n c.call(prefixField + \"_zero\", c.getLocal(\"ita\")),\n c.call(prefixField + \"_zero\", c.getLocal(\"itb\")),\n c.setLocal(\"ita\", c.i32_add(c.getLocal(\"ita\"), c.i32_const(n8))),\n c.setLocal(\"itb\", c.i32_add(c.getLocal(\"itb\"), c.i32_const(n8))),\n c.br(0)\n )),\n\n\n c.setLocal(\"it\", c.getLocal(\"pCoefs\")),\n c.setLocal(\n \"last\",\n c.i32_add(\n c.getLocal(\"pCoefs\"),\n c.i32_mul(\n c.getLocal(\"nCoefs\"),\n c.i32_const(n8+12)\n )\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"it\"),\n c.getLocal(\"last\")\n )\n ),\n c.setLocal(\n \"s\",\n c.i32_load(c.getLocal(\"it\"), 8)\n ),\n c.if(\n c.i32_or(\n c.i32_lt_u(\n c.getLocal(\"s\"),\n c.getLocal(\"offsetWitness\"),\n ),\n c.i32_ge_u(\n c.getLocal(\"s\"),\n c.i32_add(\n c.getLocal(\"offsetWitness\"),\n c.getLocal(\"nWitness\"),\n )\n )\n ),\n [\n ...c.setLocal(\"it\", c.i32_add(c.getLocal(\"it\"), c.i32_const(n8+12))),\n ...c.br(1)\n ]\n ),\n\n c.setLocal(\n \"m\",\n c.i32_load(c.getLocal(\"it\"))\n ),\n c.if(\n c.i32_eq(c.getLocal(\"m\"), c.i32_const(0)),\n c.setLocal(\"pOut\", c.getLocal(\"pA\")),\n c.if(\n c.i32_eq(c.getLocal(\"m\"), c.i32_const(1)),\n c.setLocal(\"pOut\", c.getLocal(\"pB\")),\n [\n ...c.setLocal(\"it\", c.i32_add(c.getLocal(\"it\"), c.i32_const(n8+12))),\n ...c.br(1)\n ]\n )\n ),\n c.setLocal(\n \"c\",\n c.i32_load(c.getLocal(\"it\"), 4)\n ),\n c.if(\n c.i32_or(\n c.i32_lt_u(\n c.getLocal(\"c\"),\n c.getLocal(\"offsetOut\"),\n ),\n c.i32_ge_u(\n c.getLocal(\"c\"),\n c.i32_add(\n c.getLocal(\"offsetOut\"),\n c.getLocal(\"nOut\"),\n )\n )\n ),\n [\n ...c.setLocal(\"it\", c.i32_add(c.getLocal(\"it\"), c.i32_const(n8+12))),\n ...c.br(1)\n ]\n ),\n c.setLocal(\n \"pOut\",\n c.i32_add(\n c.getLocal(\"pOut\"),\n c.i32_mul(\n c.i32_sub(\n c.getLocal(\"c\"),\n c.getLocal(\"offsetOut\")\n ),\n c.i32_const(n8)\n )\n )\n ),\n c.call(\n prefixField + \"_mul\",\n c.i32_add(\n c.getLocal(\"pWitness\"),\n c.i32_mul(\n c.i32_sub(c.getLocal(\"s\"), c.getLocal(\"offsetWitness\")),\n c.i32_const(n8)\n )\n ),\n c.i32_add( c.getLocal(\"it\"), c.i32_const(12)),\n aux\n ),\n c.call(\n prefixField + \"_add\",\n c.getLocal(\"pOut\"),\n aux,\n c.getLocal(\"pOut\"),\n ),\n c.setLocal(\"it\", c.i32_add(c.getLocal(\"it\"), c.i32_const(n8+12))),\n c.br(0)\n )),\n\n c.setLocal(\"ita\", c.getLocal(\"pA\")),\n c.setLocal(\"itb\", c.getLocal(\"pB\")),\n c.setLocal(\"it\", c.getLocal(\"pC\")),\n c.setLocal(\n \"last\",\n c.i32_add(\n c.getLocal(\"pA\"),\n c.i32_mul(\n c.getLocal(\"nOut\"),\n c.i32_const(n8)\n )\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"ita\"),\n c.getLocal(\"last\")\n )\n ),\n c.call(\n prefixField + \"_mul\",\n c.getLocal(\"ita\"),\n c.getLocal(\"itb\"),\n c.getLocal(\"it\")\n ),\n c.setLocal(\"ita\", c.i32_add(c.getLocal(\"ita\"), c.i32_const(n8))),\n c.setLocal(\"itb\", c.i32_add(c.getLocal(\"itb\"), c.i32_const(n8))),\n c.setLocal(\"it\", c.i32_add(c.getLocal(\"it\"), c.i32_const(n8))),\n c.br(0)\n )),\n\n );\n }\n\n function buildJoinABC() {\n const f = module.addFunction(prefix+\"_joinABC\");\n f.addParam(\"pA\", \"i32\");\n f.addParam(\"pB\", \"i32\");\n f.addParam(\"pC\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"pP\", \"i32\");\n f.addLocal(\"ita\", \"i32\");\n f.addLocal(\"itb\", \"i32\");\n f.addLocal(\"itc\", \"i32\");\n f.addLocal(\"itp\", \"i32\");\n f.addLocal(\"last\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const aux = c.i32_const(module.alloc(n8));\n\n f.addCode(\n c.setLocal(\"ita\", c.getLocal(\"pA\")),\n c.setLocal(\"itb\", c.getLocal(\"pB\")),\n c.setLocal(\"itc\", c.getLocal(\"pC\")),\n c.setLocal(\"itp\", c.getLocal(\"pP\")),\n c.setLocal(\n \"last\",\n c.i32_add(\n c.getLocal(\"pA\"),\n c.i32_mul(\n c.getLocal(\"n\"),\n c.i32_const(n8)\n )\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"ita\"),\n c.getLocal(\"last\")\n )\n ),\n c.call(\n prefixField + \"_mul\",\n c.getLocal(\"ita\"),\n c.getLocal(\"itb\"),\n aux\n ),\n c.call(\n prefixField + \"_sub\",\n aux,\n c.getLocal(\"itc\"),\n c.getLocal(\"itp\"),\n ),\n c.setLocal(\"ita\", c.i32_add(c.getLocal(\"ita\"), c.i32_const(n8))),\n c.setLocal(\"itb\", c.i32_add(c.getLocal(\"itb\"), c.i32_const(n8))),\n c.setLocal(\"itc\", c.i32_add(c.getLocal(\"itc\"), c.i32_const(n8))),\n c.setLocal(\"itp\", c.i32_add(c.getLocal(\"itp\"), c.i32_const(n8))),\n c.br(0)\n ))\n );\n }\n\n function buildBatchAdd() {\n const f = module.addFunction(prefix+\"_batchAdd\");\n f.addParam(\"pa\", \"i32\");\n f.addParam(\"pb\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"pr\", \"i32\");\n f.addLocal(\"ita\", \"i32\");\n f.addLocal(\"itb\", \"i32\");\n f.addLocal(\"itr\", \"i32\");\n f.addLocal(\"last\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.setLocal(\"ita\", c.getLocal(\"pa\")),\n c.setLocal(\"itb\", c.getLocal(\"pb\")),\n c.setLocal(\"itr\", c.getLocal(\"pr\")),\n c.setLocal(\n \"last\",\n c.i32_add(\n c.getLocal(\"pa\"),\n c.i32_mul(\n c.getLocal(\"n\"),\n c.i32_const(n8)\n )\n )\n ),\n c.block(c.loop(\n c.br_if(\n 1,\n c.i32_eq(\n c.getLocal(\"ita\"),\n c.getLocal(\"last\")\n )\n ),\n c.call(\n prefixField + \"_add\",\n c.getLocal(\"ita\"),\n c.getLocal(\"itb\"),\n c.getLocal(\"itr\"),\n ),\n c.setLocal(\"ita\", c.i32_add(c.getLocal(\"ita\"), c.i32_const(n8))),\n c.setLocal(\"itb\", c.i32_add(c.getLocal(\"itb\"), c.i32_const(n8))),\n c.setLocal(\"itr\", c.i32_add(c.getLocal(\"itr\"), c.i32_const(n8))),\n c.br(0)\n ))\n );\n }\n\n buildBuildABC();\n buildJoinABC();\n buildBatchAdd();\n\n module.exportFunction(prefix + \"_buildABC\");\n module.exportFunction(prefix + \"_joinABC\");\n module.exportFunction(prefix + \"_batchAdd\");\n\n return prefix;\n\n};\n\n","\n\n/*\n Copyright 2019 0KIMS association.\n\n This file is part of wasmsnark (Web Assembly zkSnark Prover).\n\n wasmsnark is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n wasmsnark is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with wasmsnark. If not, see .\n*/\n\nexport default function buildApplyKey(module, fnName, gPrefix, frPrefix, sizeGIn, sizeGOut, sizeF, opGtimesF) {\n\n const f = module.addFunction(fnName);\n f.addParam(\"pIn\", \"i32\");\n f.addParam(\"n\", \"i32\");\n f.addParam(\"pFirst\", \"i32\");\n f.addParam(\"pInc\", \"i32\");\n f.addParam(\"pOut\", \"i32\");\n f.addLocal(\"pOldFree\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n f.addLocal(\"pFrom\", \"i32\");\n f.addLocal(\"pTo\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const t = c.i32_const(module.alloc(sizeF));\n\n f.addCode(\n c.setLocal(\"pFrom\", c.getLocal(\"pIn\")),\n c.setLocal(\"pTo\", c.getLocal(\"pOut\")),\n );\n\n // t = first\n f.addCode(\n c.call(\n frPrefix + \"_copy\",\n c.getLocal(\"pFirst\"),\n t\n )\n );\n f.addCode(\n c.setLocal(\"i\", c.i32_const(0)),\n c.block(c.loop(\n c.br_if(1, c.i32_eq ( c.getLocal(\"i\"), c.getLocal(\"n\") )),\n\n c.call(\n opGtimesF,\n c.getLocal(\"pFrom\"),\n t,\n c.getLocal(\"pTo\")\n ),\n c.setLocal(\"pFrom\", c.i32_add(c.getLocal(\"pFrom\"), c.i32_const(sizeGIn))),\n c.setLocal(\"pTo\", c.i32_add(c.getLocal(\"pTo\"), c.i32_const(sizeGOut))),\n\n // t = t* inc\n c.call(\n frPrefix + \"_mul\",\n t,\n c.getLocal(\"pInc\"),\n t\n ),\n c.setLocal(\"i\", c.i32_add(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n\n module.exportFunction(fnName);\n\n};\n","import * as utils from \"../utils.js\";\nimport buildF1m from \"../build_f1m.js\";\nimport buildF1 from \"../build_f1.js\";\nimport buildF2m from \"../build_f2m.js\";\nimport buildF3m from \"../build_f3m.js\";\nimport buildCurve from \"../build_curve_jacobian_a0.js\";\nimport buildFFT from \"../build_fft.js\";\nimport buildPol from \"../build_pol.js\";\nimport buildQAP from \"../build_qap.js\";\nimport buildApplyKey from \"../build_applykey.js\";\nimport { bitLength, modInv, isOdd, isNegative } from \"../bigint.js\";\n\nexport default function buildBN128(module, _prefix) {\n\n const prefix = _prefix || \"bn128\";\n\n if (module.modules[prefix]) return prefix; // already builded\n\n const q = 21888242871839275222246405745257275088696311157297823662689037894645226208583n;\n const r = 21888242871839275222246405745257275088548364400416034343698204186575808495617n;\n\n\n const n64 = Math.floor((bitLength(q - 1n) - 1)/64) +1;\n const n8 = n64*8;\n const frsize = n8;\n const f1size = n8;\n const f2size = f1size * 2;\n const ftsize = f1size * 12;\n\n const pr = module.alloc(utils.bigInt2BytesLE( r, frsize ));\n\n const f1mPrefix = buildF1m(module, q, \"f1m\");\n buildF1(module, r, \"fr\", \"frm\");\n\n const pG1b = module.alloc(utils.bigInt2BytesLE( toMontgomery(3n), f1size ));\n const g1mPrefix = buildCurve(module, \"g1m\", \"f1m\", pG1b);\n\n buildFFT(module, \"frm\", \"frm\", \"frm\", \"frm_mul\");\n\n buildPol(module, \"pol\", \"frm\");\n buildQAP(module, \"qap\", \"frm\");\n\n const f2mPrefix = buildF2m(module, \"f1m_neg\", \"f2m\", \"f1m\");\n const pG2b = module.alloc([\n ...utils.bigInt2BytesLE( toMontgomery(19485874751759354771024239261021720505790618469301721065564631296452457478373n), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(266929791119991161246907387137283842545076965332900288569378510910307636690n), f1size )\n ]);\n const g2mPrefix = buildCurve(module, \"g2m\", \"f2m\", pG2b);\n\n\n function buildGTimesFr(fnName, opMul) {\n const f = module.addFunction(fnName);\n f.addParam(\"pG\", \"i32\");\n f.addParam(\"pFr\", \"i32\");\n f.addParam(\"pr\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const AUX = c.i32_const(module.alloc(n8));\n\n f.addCode(\n c.call(\"frm_fromMontgomery\", c.getLocal(\"pFr\"), AUX),\n c.call(\n opMul,\n c.getLocal(\"pG\"),\n AUX,\n c.i32_const(n8),\n c.getLocal(\"pr\")\n )\n );\n\n module.exportFunction(fnName);\n }\n buildGTimesFr(\"g1m_timesFr\", \"g1m_timesScalar\");\n buildFFT(module, \"g1m\", \"g1m\", \"frm\", \"g1m_timesFr\");\n\n buildGTimesFr(\"g2m_timesFr\", \"g2m_timesScalar\");\n buildFFT(module, \"g2m\", \"g2m\", \"frm\", \"g2m_timesFr\");\n\n buildGTimesFr(\"g1m_timesFrAffine\", \"g1m_timesScalarAffine\");\n buildGTimesFr(\"g2m_timesFrAffine\", \"g2m_timesScalarAffine\");\n\n buildApplyKey(module, \"frm_batchApplyKey\", \"fmr\", \"frm\", n8, n8, n8, \"frm_mul\");\n buildApplyKey(module, \"g1m_batchApplyKey\", \"g1m\", \"frm\", n8*3, n8*3, n8, \"g1m_timesFr\");\n buildApplyKey(module, \"g1m_batchApplyKeyMixed\", \"g1m\", \"frm\", n8*2, n8*3, n8, \"g1m_timesFrAffine\");\n buildApplyKey(module, \"g2m_batchApplyKey\", \"g2m\", \"frm\", n8*2*3, n8*3*2, n8, \"g2m_timesFr\");\n buildApplyKey(module, \"g2m_batchApplyKeyMixed\", \"g2m\", \"frm\", n8*2*2, n8*3*2, n8, \"g2m_timesFrAffine\");\n\n function toMontgomery(a) {\n return BigInt(a) * ( 1n << BigInt(f1size*8)) % q;\n }\n\n const G1gen = [\n 1n,\n 2n,\n 1n\n ];\n\n const pG1gen = module.alloc(\n [\n ...utils.bigInt2BytesLE( toMontgomery(G1gen[0]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G1gen[1]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G1gen[2]), f1size ),\n ]\n );\n\n const G1zero = [\n 0n,\n 1n,\n 0n\n ];\n\n const pG1zero = module.alloc(\n [\n ...utils.bigInt2BytesLE( toMontgomery(G1zero[0]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G1zero[1]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G1zero[2]), f1size )\n ]\n );\n\n const G2gen = [\n [\n 10857046999023057135944570762232829481370756359578518086990519993285655852781n,\n 11559732032986387107991004021392285783925812861821192530917403151452391805634n,\n ],[\n 8495653923123431417604973247489272438418190587263600148770280649306958101930n,\n 4082367875863433681332203403145435568316851327593401208105741076214120093531n,\n ],[\n 1n,\n 0n,\n ]\n ];\n\n const pG2gen = module.alloc(\n [\n ...utils.bigInt2BytesLE( toMontgomery(G2gen[0][0]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2gen[0][1]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2gen[1][0]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2gen[1][1]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2gen[2][0]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2gen[2][1]), f1size ),\n ]\n );\n\n const G2zero = [\n [\n 0n,\n 0n,\n ],[\n 1n,\n 0n,\n ],[\n 0n,\n 0n,\n ]\n ];\n\n const pG2zero = module.alloc(\n [\n ...utils.bigInt2BytesLE( toMontgomery(G2zero[0][0]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2zero[0][1]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2zero[1][0]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2zero[1][1]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2zero[2][0]), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(G2zero[2][1]), f1size ),\n ]\n );\n\n const pOneT = module.alloc([\n ...utils.bigInt2BytesLE( toMontgomery(1), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(0), f1size ),\n ]);\n\n const pNonResidueF6 = module.alloc([\n ...utils.bigInt2BytesLE( toMontgomery(9), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(1), f1size ),\n ]);\n\n const pTwoInv = module.alloc([\n ...utils.bigInt2BytesLE( toMontgomery( modInv(2n, q)), f1size ),\n ...utils.bigInt2BytesLE( 0n, f1size )\n ]);\n\n const pAltBn128Twist = pNonResidueF6;\n\n const pTwistCoefB = module.alloc([\n ...utils.bigInt2BytesLE( toMontgomery(19485874751759354771024239261021720505790618469301721065564631296452457478373n), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(266929791119991161246907387137283842545076965332900288569378510910307636690n), f1size ),\n ]);\n\n function build_mulNR6() {\n const f = module.addFunction(prefix + \"_mulNR6\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"pr\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.call(\n f2mPrefix + \"_mul\",\n c.i32_const(pNonResidueF6),\n c.getLocal(\"x\"),\n c.getLocal(\"pr\")\n )\n );\n }\n build_mulNR6();\n\n const f6mPrefix = buildF3m(module, prefix+\"_mulNR6\", \"f6m\", \"f2m\");\n\n function build_mulNR12() {\n const f = module.addFunction(prefix + \"_mulNR12\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"pr\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.call(\n f2mPrefix + \"_mul\",\n c.i32_const(pNonResidueF6),\n c.i32_add(c.getLocal(\"x\"), c.i32_const(n8*4)),\n c.getLocal(\"pr\")\n ),\n c.call(\n f2mPrefix + \"_copy\",\n c.getLocal(\"x\"),\n c.i32_add(c.getLocal(\"pr\"), c.i32_const(n8*2)),\n ),\n c.call(\n f2mPrefix + \"_copy\",\n c.i32_add(c.getLocal(\"x\"), c.i32_const(n8*2)),\n c.i32_add(c.getLocal(\"pr\"), c.i32_const(n8*4)),\n )\n );\n }\n build_mulNR12();\n\n const ftmPrefix = buildF2m(module, prefix+\"_mulNR12\", \"ftm\", f6mPrefix);\n\n\n const ateLoopCount = 29793968203157093288n;\n const ateLoopBitBytes = bits(ateLoopCount);\n const pAteLoopBitBytes = module.alloc(ateLoopBitBytes);\n const isLoopNegative = false;\n\n const ateCoefSize = 3 * f2size;\n const ateNDblCoefs = ateLoopBitBytes.length-1;\n const ateNAddCoefs = ateLoopBitBytes.reduce((acc, b) => acc + ( b!=0 ? 1 : 0) ,0);\n const ateNCoefs = ateNAddCoefs + ateNDblCoefs + 1;\n const prePSize = 3*2*n8;\n const preQSize = 3*n8*2 + ateNCoefs*ateCoefSize;\n const finalExpIsNegative = false;\n\n\n module.modules[prefix] = {\n n64: n64,\n pG1gen: pG1gen,\n pG1zero: pG1zero,\n pG1b: pG1b,\n pG2gen: pG2gen,\n pG2zero: pG2zero,\n pG2b: pG2b,\n pq: module.modules[\"f1m\"].pq,\n pr: pr,\n pOneT: pOneT,\n prePSize: prePSize,\n preQSize: preQSize,\n r: r.toString(),\n q: q.toString()\n };\n\n // console.log(\"PrePSize: \" +prePSize);\n // console.log(\"PreQSize: \" +preQSize);\n\n const finalExpZ = 4965661367192848881n;\n\n function naf(n) {\n let E = n;\n const res = [];\n while (E > 0n) {\n if (isOdd(E)) {\n const z = 2 - Number(E % 4n);\n res.push( z );\n E = E - BigInt(z);\n } else {\n res.push( 0 );\n }\n E = E >> 1n;\n }\n return res;\n }\n\n function bits(n) {\n let E = n;\n const res = [];\n while (E > 0n) {\n if (isOdd(E)) {\n res.push( 1 );\n } else {\n res.push( 0 );\n }\n E = E >> 1n;\n }\n return res;\n }\n\n function buildPrepareG1() {\n const f = module.addFunction(prefix+ \"_prepareG1\");\n f.addParam(\"pP\", \"i32\");\n f.addParam(\"ppreP\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.call(g1mPrefix + \"_normalize\", c.getLocal(\"pP\"), c.getLocal(\"ppreP\")), // TODO Remove if already in affine\n );\n }\n\n function buildPrepAddStep() {\n const f = module.addFunction(prefix+ \"_prepAddStep\");\n f.addParam(\"pQ\", \"i32\");\n f.addParam(\"pR\", \"i32\");\n f.addParam(\"pCoef\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const X2 = c.getLocal(\"pQ\");\n const Y2 = c.i32_add(c.getLocal(\"pQ\"), c.i32_const(f2size));\n\n const X1 = c.getLocal(\"pR\");\n const Y1 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(f2size));\n const Z1 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(2*f2size));\n\n const ELL_0 = c.getLocal(\"pCoef\");\n const ELL_VW = c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(f2size));\n const ELL_VV = c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(2*f2size));\n\n const D = ELL_VW;\n const E = c.i32_const(module.alloc(f2size));\n const F = c.i32_const(module.alloc(f2size));\n const G = c.i32_const(module.alloc(f2size));\n const H = c.i32_const(module.alloc(f2size));\n const I = c.i32_const(module.alloc(f2size));\n const J = c.i32_const(module.alloc(f2size));\n const AUX = c.i32_const(module.alloc(f2size));\n\n f.addCode(\n // D = X1 - X2*Z1\n c.call(f2mPrefix + \"_mul\", X2, Z1, D),\n c.call(f2mPrefix + \"_sub\", X1, D, D),\n\n // E = Y1 - Y2*Z1\n c.call(f2mPrefix + \"_mul\", Y2, Z1, E),\n c.call(f2mPrefix + \"_sub\", Y1, E, E),\n\n // F = D^2\n c.call(f2mPrefix + \"_square\", D, F),\n\n // G = E^2\n c.call(f2mPrefix + \"_square\", E, G),\n\n // H = D*F\n c.call(f2mPrefix + \"_mul\", D, F, H),\n\n // I = X1 * F\n c.call(f2mPrefix + \"_mul\", X1, F, I),\n\n // J = H + Z1*G - (I+I)\n c.call(f2mPrefix + \"_add\", I, I, AUX),\n c.call(f2mPrefix + \"_mul\", Z1, G, J),\n c.call(f2mPrefix + \"_add\", H, J, J),\n c.call(f2mPrefix + \"_sub\", J, AUX, J),\n\n\n // X3 (X1) = D*J\n c.call(f2mPrefix + \"_mul\", D, J, X1),\n\n // Y3 (Y1) = E*(I-J)-(H*Y1)\n c.call(f2mPrefix + \"_mul\", H, Y1, Y1),\n c.call(f2mPrefix + \"_sub\", I, J, AUX),\n c.call(f2mPrefix + \"_mul\", E, AUX, AUX),\n c.call(f2mPrefix + \"_sub\", AUX, Y1, Y1),\n\n // Z3 (Z1) = Z1*H\n c.call(f2mPrefix + \"_mul\", Z1, H, Z1),\n\n // ell_0 = xi * (E * X2 - D * Y2)\n c.call(f2mPrefix + \"_mul\", D, Y2, AUX),\n c.call(f2mPrefix + \"_mul\", E, X2, ELL_0),\n c.call(f2mPrefix + \"_sub\", ELL_0, AUX, ELL_0),\n c.call(f2mPrefix + \"_mul\", ELL_0, c.i32_const(pAltBn128Twist), ELL_0),\n\n\n // ell_VV = - E (later: * xP)\n c.call(f2mPrefix + \"_neg\", E, ELL_VV),\n\n // ell_VW = D (later: * yP )\n // Already assigned\n\n );\n }\n\n\n\n function buildPrepDoubleStep() {\n const f = module.addFunction(prefix+ \"_prepDblStep\");\n f.addParam(\"pR\", \"i32\");\n f.addParam(\"pCoef\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const X1 = c.getLocal(\"pR\");\n const Y1 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(f2size));\n const Z1 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(2*f2size));\n\n const ELL_0 = c.getLocal(\"pCoef\");\n const ELL_VW = c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(f2size));\n const ELL_VV = c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(2*f2size));\n\n const A = c.i32_const(module.alloc(f2size));\n const B = c.i32_const(module.alloc(f2size));\n const C = c.i32_const(module.alloc(f2size));\n const D = c.i32_const(module.alloc(f2size));\n const E = c.i32_const(module.alloc(f2size));\n const F = c.i32_const(module.alloc(f2size));\n const G = c.i32_const(module.alloc(f2size));\n const H = c.i32_const(module.alloc(f2size));\n const I = c.i32_const(module.alloc(f2size));\n const J = c.i32_const(module.alloc(f2size));\n const E2 = c.i32_const(module.alloc(f2size));\n const AUX = c.i32_const(module.alloc(f2size));\n\n f.addCode(\n\n // A = X1 * Y1 / 2\n c.call(f2mPrefix + \"_mul\", Y1, c.i32_const(pTwoInv), A),\n c.call(f2mPrefix + \"_mul\", X1, A, A),\n\n // B = Y1^2\n c.call(f2mPrefix + \"_square\", Y1, B),\n\n // C = Z1^2\n c.call(f2mPrefix + \"_square\", Z1, C),\n\n // D = 3 * C\n c.call(f2mPrefix + \"_add\", C, C, D),\n c.call(f2mPrefix + \"_add\", D, C, D),\n\n // E = twist_b * D\n c.call(f2mPrefix + \"_mul\", c.i32_const(pTwistCoefB), D, E),\n\n // F = 3 * E\n c.call(f2mPrefix + \"_add\", E, E, F),\n c.call(f2mPrefix + \"_add\", E, F, F),\n\n // G = (B+F)/2\n c.call(f2mPrefix + \"_add\", B, F, G),\n c.call(f2mPrefix + \"_mul\", G, c.i32_const(pTwoInv), G),\n\n // H = (Y1+Z1)^2-(B+C)\n c.call(f2mPrefix + \"_add\", B, C, AUX),\n c.call(f2mPrefix + \"_add\", Y1, Z1, H),\n c.call(f2mPrefix + \"_square\", H, H),\n c.call(f2mPrefix + \"_sub\", H, AUX, H),\n\n // I = E-B\n c.call(f2mPrefix + \"_sub\", E, B, I),\n\n // J = X1^2\n c.call(f2mPrefix + \"_square\", X1, J),\n\n // E_squared = E^2\n c.call(f2mPrefix + \"_square\", E, E2),\n\n // X3 (X1) = A * (B-F)\n c.call(f2mPrefix + \"_sub\", B, F, AUX),\n c.call(f2mPrefix + \"_mul\", A, AUX, X1),\n\n // Y3 (Y1) = G^2 - 3*E^2\n c.call(f2mPrefix + \"_add\", E2, E2, AUX),\n c.call(f2mPrefix + \"_add\", E2, AUX, AUX),\n c.call(f2mPrefix + \"_square\", G, Y1),\n c.call(f2mPrefix + \"_sub\", Y1, AUX, Y1),\n\n // Z3 (Z1) = B * H\n c.call(f2mPrefix + \"_mul\", B, H, Z1),\n\n // ell_0 = xi * I\n c.call(f2mPrefix + \"_mul\", c.i32_const(pAltBn128Twist), I, ELL_0),\n\n // ell_VW = - H (later: * yP)\n c.call(f2mPrefix + \"_neg\", H, ELL_VW),\n\n // ell_VV = 3*J (later: * xP)\n c.call(f2mPrefix + \"_add\", J, J, ELL_VV),\n c.call(f2mPrefix + \"_add\", J, ELL_VV, ELL_VV),\n\n );\n }\n\n function buildMulByQ() {\n const f = module.addFunction(prefix + \"_mulByQ\");\n f.addParam(\"p1\", \"i32\");\n f.addParam(\"pr\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x = c.getLocal(\"p1\");\n const y = c.i32_add(c.getLocal(\"p1\"), c.i32_const(f2size));\n const z = c.i32_add(c.getLocal(\"p1\"), c.i32_const(f2size*2));\n const x3 = c.getLocal(\"pr\");\n const y3 = c.i32_add(c.getLocal(\"pr\"), c.i32_const(f2size));\n const z3 = c.i32_add(c.getLocal(\"pr\"), c.i32_const(f2size*2));\n\n const MulByQX = c.i32_const(module.alloc([\n ...utils.bigInt2BytesLE( toMontgomery(\"21575463638280843010398324269430826099269044274347216827212613867836435027261\"), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(\"10307601595873709700152284273816112264069230130616436755625194854815875713954\"), f1size ),\n ]));\n\n const MulByQY = c.i32_const(module.alloc([\n ...utils.bigInt2BytesLE( toMontgomery(\"2821565182194536844548159561693502659359617185244120367078079554186484126554\"), f1size ),\n ...utils.bigInt2BytesLE( toMontgomery(\"3505843767911556378687030309984248845540243509899259641013678093033130930403\"), f1size ),\n ]));\n\n f.addCode(\n // The frobeniusMap(1) in this field, is the conjugate\n c.call(f2mPrefix + \"_conjugate\", x, x3),\n c.call(f2mPrefix + \"_mul\", MulByQX, x3, x3),\n c.call(f2mPrefix + \"_conjugate\", y, y3),\n c.call(f2mPrefix + \"_mul\", MulByQY, y3, y3),\n c.call(f2mPrefix + \"_conjugate\", z, z3),\n );\n }\n\n\n function buildPrepareG2() {\n buildMulByQ();\n const f = module.addFunction(prefix+ \"_prepareG2\");\n f.addParam(\"pQ\", \"i32\");\n f.addParam(\"ppreQ\", \"i32\");\n f.addLocal(\"pCoef\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const QX = c.getLocal(\"pQ\");\n\n const pR = module.alloc(f2size*3);\n const R = c.i32_const(pR);\n const RX = c.i32_const(pR);\n const RY = c.i32_const(pR+f2size);\n const RZ = c.i32_const(pR+2*f2size);\n\n const cQX = c.i32_add( c.getLocal(\"ppreQ\"), c.i32_const(0));\n const cQY = c.i32_add( c.getLocal(\"ppreQ\"), c.i32_const(f2size));\n\n const pQ1 = module.alloc(f2size*3);\n const Q1 = c.i32_const(pQ1);\n\n const pQ2 = module.alloc(f2size*3);\n const Q2 = c.i32_const(pQ2);\n const Q2Y = c.i32_const(pQ2 + f2size);\n\n f.addCode(\n c.call(g2mPrefix + \"_normalize\", QX, cQX), // TODO Remove if already in affine\n c.call(f2mPrefix + \"_copy\", cQX, RX),\n c.call(f2mPrefix + \"_copy\", cQY, RY),\n c.call(f2mPrefix + \"_one\", RZ),\n );\n\n f.addCode(\n c.setLocal(\"pCoef\", c.i32_add( c.getLocal(\"ppreQ\"), c.i32_const(f2size*3))),\n c.setLocal(\"i\", c.i32_const(ateLoopBitBytes.length-2)),\n c.block(c.loop(\n\n c.call(prefix + \"_prepDblStep\", R, c.getLocal(\"pCoef\")),\n c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n\n c.if(\n c.i32_load8_s(c.getLocal(\"i\"), pAteLoopBitBytes),\n [\n ...c.call(prefix + \"_prepAddStep\", cQX, R, c.getLocal(\"pCoef\")),\n ...c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n ]\n ),\n c.br_if(1, c.i32_eqz ( c.getLocal(\"i\") )),\n c.setLocal(\"i\", c.i32_sub(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n\n f.addCode(\n c.call(prefix + \"_mulByQ\", cQX, Q1),\n c.call(prefix + \"_mulByQ\", Q1, Q2)\n );\n\n if (isLoopNegative) {\n f.addCode(\n c.call(f2mPrefix + \"_neg\", RY, RY),\n );\n }\n\n f.addCode(\n c.call(f2mPrefix + \"_neg\", Q2Y, Q2Y),\n\n c.call(prefix + \"_prepAddStep\", Q1, R, c.getLocal(\"pCoef\")),\n c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n\n c.call(prefix + \"_prepAddStep\", Q2, R, c.getLocal(\"pCoef\")),\n c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n );\n }\n\n function buildMulBy024Old() {\n const f = module.addFunction(prefix+ \"__mulBy024Old\");\n f.addParam(\"pEll0\", \"i32\");\n f.addParam(\"pEllVW\", \"i32\");\n f.addParam(\"pEllVV\", \"i32\");\n f.addParam(\"pR\", \"i32\"); // Result in F12\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"pEll0\");\n const x2 = c.getLocal(\"pEllVV\");\n const x4 = c.getLocal(\"pEllVW\");\n\n const z0 = c.getLocal(\"pR\");\n\n const pAUX12 = module.alloc(ftsize);\n const AUX12 = c.i32_const(pAUX12);\n const AUX12_0 = c.i32_const(pAUX12);\n const AUX12_2 = c.i32_const(pAUX12+f2size);\n const AUX12_4 = c.i32_const(pAUX12+f2size*2);\n const AUX12_6 = c.i32_const(pAUX12+f2size*3);\n const AUX12_8 = c.i32_const(pAUX12+f2size*4);\n const AUX12_10 = c.i32_const(pAUX12+f2size*5);\n\n f.addCode(\n\n c.call(f2mPrefix + \"_copy\", x0, AUX12_0),\n c.call(f2mPrefix + \"_zero\", AUX12_2),\n c.call(f2mPrefix + \"_copy\", x2, AUX12_4),\n c.call(f2mPrefix + \"_zero\", AUX12_6),\n c.call(f2mPrefix + \"_copy\", x4, AUX12_8),\n c.call(f2mPrefix + \"_zero\", AUX12_10),\n c.call(ftmPrefix + \"_mul\", AUX12, z0, z0),\n );\n }\n\n function buildMulBy024() {\n const f = module.addFunction(prefix+ \"__mulBy024\");\n f.addParam(\"pEll0\", \"i32\");\n f.addParam(\"pEllVW\", \"i32\");\n f.addParam(\"pEllVV\", \"i32\");\n f.addParam(\"pR\", \"i32\"); // Result in F12\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"pEll0\");\n const x2 = c.getLocal(\"pEllVV\");\n const x4 = c.getLocal(\"pEllVW\");\n\n const z0 = c.getLocal(\"pR\");\n const z1 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(2*n8));\n const z2 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(4*n8));\n const z3 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(6*n8));\n const z4 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(8*n8));\n const z5 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(10*n8));\n\n const t0 = c.i32_const(module.alloc(f2size));\n const t1 = c.i32_const(module.alloc(f2size));\n const t2 = c.i32_const(module.alloc(f2size));\n const s0 = c.i32_const(module.alloc(f2size));\n const T3 = c.i32_const(module.alloc(f2size));\n const T4 = c.i32_const(module.alloc(f2size));\n const D0 = c.i32_const(module.alloc(f2size));\n const D2 = c.i32_const(module.alloc(f2size));\n const D4 = c.i32_const(module.alloc(f2size));\n const S1 = c.i32_const(module.alloc(f2size));\n const AUX = c.i32_const(module.alloc(f2size));\n\n f.addCode(\n\n // D0 = z0 * x0;\n c.call(f2mPrefix + \"_mul\", z0, x0, D0),\n // D2 = z2 * x2;\n c.call(f2mPrefix + \"_mul\", z2, x2, D2),\n // D4 = z4 * x4;\n c.call(f2mPrefix + \"_mul\", z4, x4, D4),\n // t2 = z0 + z4;\n c.call(f2mPrefix + \"_add\", z0, z4, t2),\n // t1 = z0 + z2;\n c.call(f2mPrefix + \"_add\", z0, z2, t1),\n // s0 = z1 + z3 + z5;\n c.call(f2mPrefix + \"_add\", z1, z3, s0),\n c.call(f2mPrefix + \"_add\", s0, z5, s0),\n\n\n // For z.a_.a_ = z0.\n // S1 = z1 * x2;\n c.call(f2mPrefix + \"_mul\", z1, x2, S1),\n // T3 = S1 + D4;\n c.call(f2mPrefix + \"_add\", S1, D4, T3),\n // T4 = my_Fp6::non_residue * T3 + D0;\n c.call(f2mPrefix + \"_mul\", c.i32_const(pNonResidueF6), T3, T4),\n c.call(f2mPrefix + \"_add\", T4, D0, z0),\n // z0 = T4;\n\n // For z.a_.b_ = z1\n // T3 = z5 * x4;\n c.call(f2mPrefix + \"_mul\", z5, x4, T3),\n // S1 = S1 + T3;\n c.call(f2mPrefix + \"_add\", S1, T3, S1),\n // T3 = T3 + D2;\n c.call(f2mPrefix + \"_add\", T3, D2, T3),\n // T4 = my_Fp6::non_residue * T3;\n c.call(f2mPrefix + \"_mul\", c.i32_const(pNonResidueF6), T3, T4),\n // T3 = z1 * x0;\n c.call(f2mPrefix + \"_mul\", z1, x0, T3),\n // S1 = S1 + T3;\n c.call(f2mPrefix + \"_add\", S1, T3, S1),\n // T4 = T4 + T3;\n c.call(f2mPrefix + \"_add\", T4, T3, z1),\n // z1 = T4;\n\n\n\n // For z.a_.c_ = z2\n // t0 = x0 + x2;\n c.call(f2mPrefix + \"_add\", x0, x2, t0),\n // T3 = t1 * t0 - D0 - D2;\n c.call(f2mPrefix + \"_mul\", t1, t0, T3),\n c.call(f2mPrefix + \"_add\", D0, D2, AUX),\n c.call(f2mPrefix + \"_sub\", T3, AUX, T3),\n // T4 = z3 * x4;\n c.call(f2mPrefix + \"_mul\", z3, x4, T4),\n // S1 = S1 + T4;\n c.call(f2mPrefix + \"_add\", S1, T4, S1),\n\n\n // For z.b_.a_ = z3 (z3 needs z2)\n // t0 = z2 + z4;\n c.call(f2mPrefix + \"_add\", z2, z4, t0),\n // T3 = T3 + T4;\n // z2 = T3;\n c.call(f2mPrefix + \"_add\", T3, T4, z2),\n // t1 = x2 + x4;\n c.call(f2mPrefix + \"_add\", x2, x4, t1),\n // T3 = t0 * t1 - D2 - D4;\n c.call(f2mPrefix + \"_mul\", t1, t0, T3),\n c.call(f2mPrefix + \"_add\", D2, D4, AUX),\n c.call(f2mPrefix + \"_sub\", T3, AUX, T3),\n // T4 = my_Fp6::non_residue * T3;\n c.call(f2mPrefix + \"_mul\", c.i32_const(pNonResidueF6), T3, T4),\n // T3 = z3 * x0;\n c.call(f2mPrefix + \"_mul\", z3, x0, T3),\n // S1 = S1 + T3;\n c.call(f2mPrefix + \"_add\", S1, T3, S1),\n // T4 = T4 + T3;\n c.call(f2mPrefix + \"_add\", T4, T3, z3),\n // z3 = T4;\n\n // For z.b_.b_ = z4\n // T3 = z5 * x2;\n c.call(f2mPrefix + \"_mul\", z5, x2, T3),\n // S1 = S1 + T3;\n c.call(f2mPrefix + \"_add\", S1, T3, S1),\n // T4 = my_Fp6::non_residue * T3;\n c.call(f2mPrefix + \"_mul\", c.i32_const(pNonResidueF6), T3, T4),\n // t0 = x0 + x4;\n c.call(f2mPrefix + \"_add\", x0, x4, t0),\n // T3 = t2 * t0 - D0 - D4;\n c.call(f2mPrefix + \"_mul\", t2, t0, T3),\n c.call(f2mPrefix + \"_add\", D0, D4, AUX),\n c.call(f2mPrefix + \"_sub\", T3, AUX, T3),\n // T4 = T4 + T3;\n c.call(f2mPrefix + \"_add\", T4, T3, z4),\n // z4 = T4;\n\n // For z.b_.c_ = z5.\n // t0 = x0 + x2 + x4;\n c.call(f2mPrefix + \"_add\", x0, x2, t0),\n c.call(f2mPrefix + \"_add\", t0, x4, t0),\n // T3 = s0 * t0 - S1;\n c.call(f2mPrefix + \"_mul\", s0, t0, T3),\n c.call(f2mPrefix + \"_sub\", T3, S1, z5),\n // z5 = T3;\n\n );\n }\n\n\n function buildMillerLoop() {\n const f = module.addFunction(prefix+ \"_millerLoop\");\n f.addParam(\"ppreP\", \"i32\");\n f.addParam(\"ppreQ\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"pCoef\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const preP_PX = c.getLocal(\"ppreP\");\n const preP_PY = c.i32_add(c.getLocal(\"ppreP\"), c.i32_const(f1size));\n\n const ELL_0 = c.getLocal(\"pCoef\");\n const ELL_VW = c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(f2size));\n const ELL_VV = c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(2*f2size));\n\n\n const pVW = module.alloc(f2size);\n const VW = c.i32_const(pVW);\n const pVV = module.alloc(f2size);\n const VV = c.i32_const(pVV);\n\n const F = c.getLocal(\"r\");\n\n\n f.addCode(\n c.call(ftmPrefix + \"_one\", F),\n\n c.setLocal(\"pCoef\", c.i32_add( c.getLocal(\"ppreQ\"), c.i32_const(f2size*3))),\n\n c.setLocal(\"i\", c.i32_const(ateLoopBitBytes.length-2)),\n c.block(c.loop(\n\n\n c.call(ftmPrefix + \"_square\", F, F),\n\n c.call(f2mPrefix + \"_mul1\", ELL_VW,preP_PY, VW),\n c.call(f2mPrefix + \"_mul1\", ELL_VV, preP_PX, VV),\n c.call(prefix + \"__mulBy024\", ELL_0, VW, VV, F),\n c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n\n c.if(\n c.i32_load8_s(c.getLocal(\"i\"), pAteLoopBitBytes),\n [\n ...c.call(f2mPrefix + \"_mul1\", ELL_VW, preP_PY, VW),\n ...c.call(f2mPrefix + \"_mul1\", ELL_VV, preP_PX, VV),\n\n ...c.call(prefix + \"__mulBy024\", ELL_0, VW, VV, F),\n ...c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n\n ]\n ),\n c.br_if(1, c.i32_eqz ( c.getLocal(\"i\") )),\n c.setLocal(\"i\", c.i32_sub(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n\n );\n\n if (isLoopNegative) {\n f.addCode(\n c.call(ftmPrefix + \"_inverse\", F, F),\n );\n }\n\n f.addCode(\n c.call(f2mPrefix + \"_mul1\", ELL_VW, preP_PY, VW),\n c.call(f2mPrefix + \"_mul1\", ELL_VV, preP_PX, VV),\n c.call(prefix + \"__mulBy024\", ELL_0, VW, VV, F),\n c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n\n c.call(f2mPrefix + \"_mul1\", ELL_VW, preP_PY, VW),\n c.call(f2mPrefix + \"_mul1\", ELL_VV, preP_PX, VV),\n c.call(prefix + \"__mulBy024\", ELL_0, VW, VV, F),\n c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n\n );\n\n }\n\n\n function buildFrobeniusMap(n) {\n const F12 = [\n [\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n ],\n [\n [1n, 0n],\n [8376118865763821496583973867626364092589906065868298776909617916018768340080n, 16469823323077808223889137241176536799009286646108169935659301613961712198316n],\n [21888242871839275220042445260109153167277707414472061641714758635765020556617n, 0n],\n [11697423496358154304825782922584725312912383441159505038794027105778954184319n, 303847389135065887422783454877609941456349188919719272345083954437860409601n],\n [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n],\n [3321304630594332808241809054958361220322477375291206261884409189760185844239n, 5722266937896532885780051958958348231143373700109372999374820235121374419868n],\n [21888242871839275222246405745257275088696311157297823662689037894645226208582n, 0n],\n [13512124006075453725662431877630910996106405091429524885779419978626457868503n, 5418419548761466998357268504080738289687024511189653727029736280683514010267n],\n [2203960485148121921418603742825762020974279258880205651966n, 0n],\n [10190819375481120917420622822672549775783927716138318623895010788866272024264n, 21584395482704209334823622290379665147239961968378104390343953940207365798982n],\n [2203960485148121921418603742825762020974279258880205651967n, 0n],\n [18566938241244942414004596690298913868373833782006617400804628704885040364344n, 16165975933942742336466353786298926857552937457188450663314217659523851788715n],\n ]\n ];\n\n const F6 = [\n [\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n ],\n [\n [1n, 0n],\n [21575463638280843010398324269430826099269044274347216827212613867836435027261n, 10307601595873709700152284273816112264069230130616436755625194854815875713954n],\n [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n],\n [3772000881919853776433695186713858239009073593817195771773381919316419345261n, 2236595495967245188281701248203181795121068902605861227855261137820944008926n],\n [2203960485148121921418603742825762020974279258880205651966n, 0n],\n [18429021223477853657660792034369865839114504446431234726392080002137598044644n, 9344045779998320333812420223237981029506012124075525679208581902008406485703n],\n ],\n [\n [1n, 0n],\n [2581911344467009335267311115468803099551665605076196740867805258568234346338n, 19937756971775647987995932169929341994314640652964949448313374472400716661030n],\n [2203960485148121921418603742825762020974279258880205651966n, 0n],\n [5324479202449903542726783395506214481928257762400643279780343368557297135718n, 16208900380737693084919495127334387981393726419856888799917914180988844123039n],\n [21888242871839275220042445260109153167277707414472061641714758635765020556616n, 0n],\n [13981852324922362344252311234282257507216387789820983642040889267519694726527n, 7629828391165209371577384193250820201684255241773809077146787135900891633097n],\n ]\n ];\n\n const f = module.addFunction(prefix+ \"__frobeniusMap\"+n);\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n for (let i=0; i<6; i++) {\n const X = (i==0) ? c.getLocal(\"x\") : c.i32_add(c.getLocal(\"x\"), c.i32_const(i*f2size));\n const Xc0 = X;\n const Xc1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(i*f2size + f1size));\n const R = (i==0) ? c.getLocal(\"r\") : c.i32_add(c.getLocal(\"r\"), c.i32_const(i*f2size));\n const Rc0 = R;\n const Rc1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(i*f2size + f1size));\n const coef = mul2(F12[Math.floor(i/3)][n%12] , F6[i%3][n%6]);\n const pCoef = module.alloc([\n ...utils.bigInt2BytesLE(toMontgomery(coef[0]), 32),\n ...utils.bigInt2BytesLE(toMontgomery(coef[1]), 32),\n ]);\n if (n%2 == 1) {\n f.addCode(\n c.call(f1mPrefix + \"_copy\", Xc0, Rc0),\n c.call(f1mPrefix + \"_neg\", Xc1, Rc1),\n c.call(f2mPrefix + \"_mul\", R, c.i32_const(pCoef), R),\n );\n } else {\n f.addCode(c.call(f2mPrefix + \"_mul\", X, c.i32_const(pCoef), R));\n }\n }\n\n function mul2(a, b) {\n const ac0 = BigInt(a[0]);\n const ac1 = BigInt(a[1]);\n const bc0 = BigInt(b[0]);\n const bc1 = BigInt(b[1]);\n const res = [\n (ac0 * bc0 - ( ac1 * bc1) ) % q,\n (ac0 * bc1 + ( ac1 * bc0) ) % q,\n ];\n if (isNegative(res[0])) res[0] = res[0] + q;\n return res;\n }\n\n }\n\n\n\n function buildFinalExponentiationFirstChunk() {\n\n const f = module.addFunction(prefix+ \"__finalExponentiationFirstChunk\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const elt = c.getLocal(\"x\");\n const eltC0 = elt;\n const eltC1 = c.i32_add(elt, c.i32_const(n8*6));\n const r = c.getLocal(\"r\");\n const pA = module.alloc(ftsize);\n const A = c.i32_const(pA);\n const Ac0 = A;\n const Ac1 = c.i32_const(pA + n8*6);\n const B = c.i32_const(module.alloc(ftsize));\n const C = c.i32_const(module.alloc(ftsize));\n const D = c.i32_const(module.alloc(ftsize));\n\n f.addCode(\n // const alt_bn128_Fq12 A = alt_bn128_Fq12(elt.c0,-elt.c1);\n c.call(f6mPrefix + \"_copy\", eltC0, Ac0),\n c.call(f6mPrefix + \"_neg\", eltC1, Ac1),\n\n // const alt_bn128_Fq12 B = elt.inverse();\n c.call(ftmPrefix + \"_inverse\", elt, B),\n\n // const alt_bn128_Fq12 C = A * B;\n c.call(ftmPrefix + \"_mul\", A, B, C),\n // const alt_bn128_Fq12 D = C.Frobenius_map(2);\n c.call(prefix + \"__frobeniusMap2\", C, D),\n // const alt_bn128_Fq12 result = D * C;\n c.call(ftmPrefix + \"_mul\", C, D, r),\n );\n }\n\n function buildCyclotomicSquare() {\n const f = module.addFunction(prefix+ \"__cyclotomicSquare\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x4 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f2size));\n const x3 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f2size));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(3*f2size));\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(4*f2size));\n const x5 = c.i32_add(c.getLocal(\"x\"), c.i32_const(5*f2size));\n\n const r0 = c.getLocal(\"r\");\n const r4 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f2size));\n const r3 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f2size));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(3*f2size));\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(4*f2size));\n const r5 = c.i32_add(c.getLocal(\"r\"), c.i32_const(5*f2size));\n\n const t0 = c.i32_const(module.alloc(f2size));\n const t1 = c.i32_const(module.alloc(f2size));\n const t2 = c.i32_const(module.alloc(f2size));\n const t3 = c.i32_const(module.alloc(f2size));\n const t4 = c.i32_const(module.alloc(f2size));\n const t5 = c.i32_const(module.alloc(f2size));\n const tmp = c.i32_const(module.alloc(f2size));\n const AUX = c.i32_const(module.alloc(f2size));\n\n\n f.addCode(\n // // t0 + t1*y = (z0 + z1*y)^2 = a^2\n // tmp = z0 * z1;\n // t0 = (z0 + z1) * (z0 + my_Fp6::non_residue * z1) - tmp - my_Fp6::non_residue * tmp;\n // t1 = tmp + tmp;\n c.call(f2mPrefix + \"_mul\", x0, x1, tmp),\n c.call(f2mPrefix + \"_mul\", x1, c.i32_const(pNonResidueF6), t0),\n c.call(f2mPrefix + \"_add\", x0, t0, t0),\n c.call(f2mPrefix + \"_add\", x0, x1, AUX),\n c.call(f2mPrefix + \"_mul\", AUX, t0, t0),\n c.call(f2mPrefix + \"_mul\", c.i32_const(pNonResidueF6), tmp, AUX),\n c.call(f2mPrefix + \"_add\", tmp, AUX, AUX),\n c.call(f2mPrefix + \"_sub\", t0, AUX, t0),\n c.call(f2mPrefix + \"_add\", tmp, tmp, t1),\n\n // // t2 + t3*y = (z2 + z3*y)^2 = b^2\n // tmp = z2 * z3;\n // t2 = (z2 + z3) * (z2 + my_Fp6::non_residue * z3) - tmp - my_Fp6::non_residue * tmp;\n // t3 = tmp + tmp;\n c.call(f2mPrefix + \"_mul\", x2, x3, tmp),\n c.call(f2mPrefix + \"_mul\", x3, c.i32_const(pNonResidueF6), t2),\n c.call(f2mPrefix + \"_add\", x2, t2, t2),\n c.call(f2mPrefix + \"_add\", x2, x3, AUX),\n c.call(f2mPrefix + \"_mul\", AUX, t2, t2),\n c.call(f2mPrefix + \"_mul\", c.i32_const(pNonResidueF6), tmp, AUX),\n c.call(f2mPrefix + \"_add\", tmp, AUX, AUX),\n c.call(f2mPrefix + \"_sub\", t2, AUX, t2),\n c.call(f2mPrefix + \"_add\", tmp, tmp, t3),\n\n // // t4 + t5*y = (z4 + z5*y)^2 = c^2\n // tmp = z4 * z5;\n // t4 = (z4 + z5) * (z4 + my_Fp6::non_residue * z5) - tmp - my_Fp6::non_residue * tmp;\n // t5 = tmp + tmp;\n c.call(f2mPrefix + \"_mul\", x4, x5, tmp),\n c.call(f2mPrefix + \"_mul\", x5, c.i32_const(pNonResidueF6), t4),\n c.call(f2mPrefix + \"_add\", x4, t4, t4),\n c.call(f2mPrefix + \"_add\", x4, x5, AUX),\n c.call(f2mPrefix + \"_mul\", AUX, t4, t4),\n c.call(f2mPrefix + \"_mul\", c.i32_const(pNonResidueF6), tmp, AUX),\n c.call(f2mPrefix + \"_add\", tmp, AUX, AUX),\n c.call(f2mPrefix + \"_sub\", t4, AUX, t4),\n c.call(f2mPrefix + \"_add\", tmp, tmp, t5),\n\n // For A\n // z0 = 3 * t0 - 2 * z0\n c.call(f2mPrefix + \"_sub\", t0, x0, r0),\n c.call(f2mPrefix + \"_add\", r0, r0, r0),\n c.call(f2mPrefix + \"_add\", t0, r0, r0),\n // z1 = 3 * t1 + 2 * z1\n c.call(f2mPrefix + \"_add\", t1, x1, r1),\n c.call(f2mPrefix + \"_add\", r1, r1, r1),\n c.call(f2mPrefix + \"_add\", t1, r1, r1),\n\n // For B\n // z2 = 3 * (xi * t5) + 2 * z2\n c.call(f2mPrefix + \"_mul\", t5, c.i32_const(pAltBn128Twist), AUX),\n c.call(f2mPrefix + \"_add\", AUX, x2, r2),\n c.call(f2mPrefix + \"_add\", r2, r2, r2),\n c.call(f2mPrefix + \"_add\", AUX, r2, r2),\n // z3 = 3 * t4 - 2 * z3\n c.call(f2mPrefix + \"_sub\", t4, x3, r3),\n c.call(f2mPrefix + \"_add\", r3, r3, r3),\n c.call(f2mPrefix + \"_add\", t4, r3, r3),\n\n // For C\n // z4 = 3 * t2 - 2 * z4\n c.call(f2mPrefix + \"_sub\", t2, x4, r4),\n c.call(f2mPrefix + \"_add\", r4, r4, r4),\n c.call(f2mPrefix + \"_add\", t2, r4, r4),\n // z5 = 3 * t3 + 2 * z5\n c.call(f2mPrefix + \"_add\", t3, x5, r5),\n c.call(f2mPrefix + \"_add\", r5, r5, r5),\n c.call(f2mPrefix + \"_add\", t3, r5, r5),\n\n );\n }\n\n\n function buildCyclotomicExp(exponent, fnName) {\n const exponentNafBytes = naf(exponent).map( (b) => (b==-1 ? 0xFF: b) );\n const pExponentNafBytes = module.alloc(exponentNafBytes);\n\n const f = module.addFunction(prefix+ \"__cyclotomicExp_\"+fnName);\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"bit\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x = c.getLocal(\"x\");\n\n const res = c.getLocal(\"r\");\n\n const inverse = c.i32_const(module.alloc(ftsize));\n\n\n f.addCode(\n c.call(ftmPrefix + \"_conjugate\", x, inverse),\n c.call(ftmPrefix + \"_one\", res),\n\n c.if(\n c.teeLocal(\"bit\", c.i32_load8_s(c.i32_const(exponentNafBytes.length-1), pExponentNafBytes)),\n c.if(\n c.i32_eq(\n c.getLocal(\"bit\"),\n c.i32_const(1)\n ),\n c.call(ftmPrefix + \"_mul\", res, x, res),\n c.call(ftmPrefix + \"_mul\", res, inverse, res),\n )\n ),\n\n c.setLocal(\"i\", c.i32_const(exponentNafBytes.length-2)),\n c.block(c.loop(\n c.call(prefix + \"__cyclotomicSquare\", res, res),\n c.if(\n c.teeLocal(\"bit\", c.i32_load8_s(c.getLocal(\"i\"), pExponentNafBytes)),\n c.if(\n c.i32_eq(\n c.getLocal(\"bit\"),\n c.i32_const(1)\n ),\n c.call(ftmPrefix + \"_mul\", res, x, res),\n c.call(ftmPrefix + \"_mul\", res, inverse, res),\n )\n ),\n c.br_if(1, c.i32_eqz ( c.getLocal(\"i\") )),\n c.setLocal(\"i\", c.i32_sub(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n }\n\n\n\n function buildFinalExponentiationLastChunk() {\n buildCyclotomicSquare();\n buildCyclotomicExp(finalExpZ, \"w0\");\n\n const f = module.addFunction(prefix+ \"__finalExponentiationLastChunk\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const elt = c.getLocal(\"x\");\n const result = c.getLocal(\"r\");\n const A = c.i32_const(module.alloc(ftsize));\n const B = c.i32_const(module.alloc(ftsize));\n const C = c.i32_const(module.alloc(ftsize));\n const D = c.i32_const(module.alloc(ftsize));\n const E = c.i32_const(module.alloc(ftsize));\n const F = c.i32_const(module.alloc(ftsize));\n const G = c.i32_const(module.alloc(ftsize));\n const H = c.i32_const(module.alloc(ftsize));\n const I = c.i32_const(module.alloc(ftsize));\n const J = c.i32_const(module.alloc(ftsize));\n const K = c.i32_const(module.alloc(ftsize));\n const L = c.i32_const(module.alloc(ftsize));\n const M = c.i32_const(module.alloc(ftsize));\n const N = c.i32_const(module.alloc(ftsize));\n const O = c.i32_const(module.alloc(ftsize));\n const P = c.i32_const(module.alloc(ftsize));\n const Q = c.i32_const(module.alloc(ftsize));\n const R = c.i32_const(module.alloc(ftsize));\n const S = c.i32_const(module.alloc(ftsize));\n const T = c.i32_const(module.alloc(ftsize));\n const U = c.i32_const(module.alloc(ftsize));\n\n f.addCode(\n\n\n // A = exp_by_neg_z(elt) // = elt^(-z)\n c.call(prefix + \"__cyclotomicExp_w0\", elt, A),\n finalExpIsNegative ? [] : c.call(ftmPrefix + \"_conjugate\", A, A),\n // B = A^2 // = elt^(-2*z)\n c.call(prefix + \"__cyclotomicSquare\", A, B),\n // C = B^2 // = elt^(-4*z)\n c.call(prefix + \"__cyclotomicSquare\", B, C),\n // D = C * B // = elt^(-6*z)\n c.call(ftmPrefix + \"_mul\", C, B, D),\n // E = exp_by_neg_z(D) // = elt^(6*z^2)\n c.call(prefix + \"__cyclotomicExp_w0\", D, E),\n finalExpIsNegative ? [] : c.call(ftmPrefix + \"_conjugate\", E, E),\n // F = E^2 // = elt^(12*z^2)\n c.call(prefix + \"__cyclotomicSquare\", E, F),\n // G = epx_by_neg_z(F) // = elt^(-12*z^3)\n c.call(prefix + \"__cyclotomicExp_w0\", F, G),\n finalExpIsNegative ? [] : c.call(ftmPrefix + \"_conjugate\", G, G),\n // H = conj(D) // = elt^(6*z)\n c.call(ftmPrefix + \"_conjugate\", D, H),\n // I = conj(G) // = elt^(12*z^3)\n c.call(ftmPrefix + \"_conjugate\", G, I),\n // J = I * E // = elt^(12*z^3 + 6*z^2)\n c.call(ftmPrefix + \"_mul\", I, E, J),\n // K = J * H // = elt^(12*z^3 + 6*z^2 + 6*z)\n c.call(ftmPrefix + \"_mul\", J, H, K),\n // L = K * B // = elt^(12*z^3 + 6*z^2 + 4*z)\n c.call(ftmPrefix + \"_mul\", K, B, L),\n // M = K * E // = elt^(12*z^3 + 12*z^2 + 6*z)\n c.call(ftmPrefix + \"_mul\", K, E, M),\n\n // N = M * elt // = elt^(12*z^3 + 12*z^2 + 6*z + 1)\n c.call(ftmPrefix + \"_mul\", M, elt, N),\n\n // O = L.Frobenius_map(1) // = elt^(q*(12*z^3 + 6*z^2 + 4*z))\n c.call(prefix + \"__frobeniusMap1\", L, O),\n // P = O * N // = elt^(q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1))\n c.call(ftmPrefix + \"_mul\", O, N, P),\n // Q = K.Frobenius_map(2) // = elt^(q^2 * (12*z^3 + 6*z^2 + 6*z))\n c.call(prefix + \"__frobeniusMap2\", K, Q),\n // R = Q * P // = elt^(q^2 * (12*z^3 + 6*z^2 + 6*z) + q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1))\n c.call(ftmPrefix + \"_mul\", Q, P, R),\n // S = conj(elt) // = elt^(-1)\n c.call(ftmPrefix + \"_conjugate\", elt, S),\n // T = S * L // = elt^(12*z^3 + 6*z^2 + 4*z - 1)\n c.call(ftmPrefix + \"_mul\", S, L, T),\n // U = T.Frobenius_map(3) // = elt^(q^3(12*z^3 + 6*z^2 + 4*z - 1))\n c.call(prefix + \"__frobeniusMap3\", T, U),\n // V = U * R // = elt^(q^3(12*z^3 + 6*z^2 + 4*z - 1) + q^2 * (12*z^3 + 6*z^2 + 6*z) + q*(12*z^3 + 6*z^2 + 4*z) * (12*z^3 + 12*z^2 + 6*z + 1))\n c.call(ftmPrefix + \"_mul\", U, R, result),\n // result = V\n );\n }\n\n\n function buildFinalExponentiation() {\n buildFinalExponentiationFirstChunk();\n buildFinalExponentiationLastChunk();\n const f = module.addFunction(prefix+ \"_finalExponentiation\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const elt = c.getLocal(\"x\");\n const result = c.getLocal(\"r\");\n const eltToFirstChunk = c.i32_const(module.alloc(ftsize));\n\n f.addCode(\n c.call(prefix + \"__finalExponentiationFirstChunk\", elt, eltToFirstChunk ),\n c.call(prefix + \"__finalExponentiationLastChunk\", eltToFirstChunk, result )\n );\n }\n\n\n function buildFinalExponentiationOld() {\n const f = module.addFunction(prefix+ \"_finalExponentiationOld\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const exponent = 552484233613224096312617126783173147097382103762957654188882734314196910839907541213974502761540629817009608548654680343627701153829446747810907373256841551006201639677726139946029199968412598804882391702273019083653272047566316584365559776493027495458238373902875937659943504873220554161550525926302303331747463515644711876653177129578303191095900909191624817826566688241804408081892785725967931714097716709526092261278071952560171111444072049229123565057483750161460024353346284167282452756217662335528813519139808291170539072125381230815729071544861602750936964829313608137325426383735122175229541155376346436093930287402089517426973178917569713384748081827255472576937471496195752727188261435633271238710131736096299798168852925540549342330775279877006784354801422249722573783561685179618816480037695005515426162362431072245638324744480n;\n\n const pExponent = module.alloc(utils.bigInt2BytesLE( exponent, 352 ));\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.call(ftmPrefix + \"_exp\", c.getLocal(\"x\"), c.i32_const(pExponent), c.i32_const(352), c.getLocal(\"r\")),\n );\n }\n\n\n\n\n const pPreP = module.alloc(prePSize);\n const pPreQ = module.alloc(preQSize);\n\n function buildPairingEquation(nPairings) {\n\n const f = module.addFunction(prefix+ \"_pairingEq\"+nPairings);\n for (let i=0; i acc + ( b!=0 ? 1 : 0) ,0);\n const ateNCoefs = ateNAddCoefs + ateNDblCoefs + 1;\n const prePSize = 3*2*n8q;\n const preQSize = 3*n8q*2 + ateNCoefs*ateCoefSize;\n const finalExpIsNegative = true;\n\n const finalExpZ = 15132376222941642752n;\n\n\n module.modules[prefix] = {\n n64q: n64q,\n n64r: n64r,\n n8q: n8q,\n n8r: n8r,\n pG1gen: pG1gen,\n pG1zero: pG1zero,\n pG1b: pG1b,\n pG2gen: pG2gen,\n pG2zero: pG2zero,\n pG2b: pG2b,\n pq: module.modules[\"f1m\"].pq,\n pr: pr,\n pOneT: pOneT,\n r: r,\n q: q,\n prePSize: prePSize,\n preQSize: preQSize\n };\n\n\n function naf(n) {\n let E = n;\n const res = [];\n while (E > 0n) {\n if (isOdd(E)) {\n const z = 2 - Number(E % 4n);\n res.push( z );\n E = E - BigInt(z);\n } else {\n res.push( 0 );\n }\n E = E >> 1n;\n }\n return res;\n }\n\n function bits(n) {\n let E = n;\n const res = [];\n while (E > 0n) {\n if (isOdd(E)) {\n res.push( 1 );\n } else {\n res.push( 0 );\n }\n E = E >> 1n;\n }\n return res;\n }\n\n function buildPrepareG1() {\n const f = module.addFunction(prefix+ \"_prepareG1\");\n f.addParam(\"pP\", \"i32\");\n f.addParam(\"ppreP\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.call(g1mPrefix + \"_normalize\", c.getLocal(\"pP\"), c.getLocal(\"ppreP\")), // TODO Remove if already in affine\n );\n }\n\n\n\n function buildPrepDoubleStep() {\n const f = module.addFunction(prefix+ \"_prepDblStep\");\n f.addParam(\"R\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const Rx = c.getLocal(\"R\");\n const Ry = c.i32_add(c.getLocal(\"R\"), c.i32_const(2*n8q));\n const Rz = c.i32_add(c.getLocal(\"R\"), c.i32_const(4*n8q));\n\n const t0 = c.getLocal(\"r\");\n const t3 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*n8q));\n const t6 = c.i32_add(c.getLocal(\"r\"), c.i32_const(4*n8q));\n\n\n const zsquared = c.i32_const(module.alloc(f2size));\n const t1 = c.i32_const(module.alloc(f2size));\n const t2 = c.i32_const(module.alloc(f2size));\n const t4 = c.i32_const(module.alloc(f2size));\n const t5 = c.i32_const(module.alloc(f2size));\n\n f.addCode(\n\n // tmp0 = r.x.square();\n c.call(f2mPrefix + \"_square\", Rx, t0),\n\n // tmp1 = r.y.square();\n c.call(f2mPrefix + \"_square\", Ry, t1),\n\n // tmp2 = tmp1.square();\n c.call(f2mPrefix + \"_square\", t1, t2),\n\n // tmp3 = (tmp1 + r.x).square() - tmp0 - tmp2;\n c.call(f2mPrefix + \"_add\", t1, Rx, t3),\n c.call(f2mPrefix + \"_square\", t3, t3),\n c.call(f2mPrefix + \"_sub\", t3, t0, t3),\n c.call(f2mPrefix + \"_sub\", t3, t2, t3),\n\n // tmp3 = tmp3 + tmp3;\n c.call(f2mPrefix + \"_add\", t3, t3, t3),\n\n // tmp4 = tmp0 + tmp0 + tmp0;\n c.call(f2mPrefix + \"_add\", t0, t0, t4),\n c.call(f2mPrefix + \"_add\", t4, t0, t4),\n\n // tmp6 = r.x + tmp4;\n c.call(f2mPrefix + \"_add\", Rx, t4, t6),\n\n // tmp5 = tmp4.square();\n c.call(f2mPrefix + \"_square\", t4, t5),\n\n // zsquared = r.z.square();\n c.call(f2mPrefix + \"_square\", Rz, zsquared),\n\n // r.x = tmp5 - tmp3 - tmp3;\n c.call(f2mPrefix + \"_sub\", t5, t3, Rx),\n c.call(f2mPrefix + \"_sub\", Rx, t3, Rx),\n\n // r.z = (r.z + r.y).square() - tmp1 - zsquared;\n c.call(f2mPrefix + \"_add\", Rz, Ry, Rz),\n c.call(f2mPrefix + \"_square\", Rz, Rz),\n c.call(f2mPrefix + \"_sub\", Rz, t1, Rz),\n c.call(f2mPrefix + \"_sub\", Rz, zsquared, Rz),\n\n // r.y = (tmp3 - r.x) * tmp4;\n c.call(f2mPrefix + \"_sub\", t3, Rx, Ry),\n c.call(f2mPrefix + \"_mul\", Ry, t4, Ry),\n\n // tmp2 = tmp2 + tmp2;\n c.call(f2mPrefix + \"_add\", t2, t2, t2),\n\n // tmp2 = tmp2 + tmp2;\n c.call(f2mPrefix + \"_add\", t2, t2, t2),\n\n // tmp2 = tmp2 + tmp2;\n c.call(f2mPrefix + \"_add\", t2, t2, t2),\n\n // r.y -= tmp2;\n c.call(f2mPrefix + \"_sub\", Ry, t2, Ry),\n\n // tmp3 = tmp4 * zsquared;\n c.call(f2mPrefix + \"_mul\", t4, zsquared, t3),\n\n // tmp3 = tmp3 + tmp3;\n c.call(f2mPrefix + \"_add\", t3, t3, t3),\n\n // tmp3 = -tmp3;\n c.call(f2mPrefix + \"_neg\", t3, t3),\n\n // tmp6 = tmp6.square() - tmp0 - tmp5;\n c.call(f2mPrefix + \"_square\", t6, t6),\n c.call(f2mPrefix + \"_sub\", t6, t0, t6),\n c.call(f2mPrefix + \"_sub\", t6, t5, t6),\n\n // tmp1 = tmp1 + tmp1;\n c.call(f2mPrefix + \"_add\", t1, t1, t1),\n\n // tmp1 = tmp1 + tmp1;\n c.call(f2mPrefix + \"_add\", t1, t1, t1),\n\n // tmp6 = tmp6 - tmp1;\n c.call(f2mPrefix + \"_sub\", t6, t1, t6),\n\n // tmp0 = r.z * zsquared;\n c.call(f2mPrefix + \"_mul\", Rz, zsquared, t0),\n\n // tmp0 = tmp0 + tmp0;\n c.call(f2mPrefix + \"_add\", t0, t0, t0),\n\n );\n }\n\n function buildPrepAddStep() {\n const f = module.addFunction(prefix+ \"_prepAddStep\");\n f.addParam(\"R\", \"i32\");\n f.addParam(\"Q\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const Rx = c.getLocal(\"R\");\n const Ry = c.i32_add(c.getLocal(\"R\"), c.i32_const(2*n8q));\n const Rz = c.i32_add(c.getLocal(\"R\"), c.i32_const(4*n8q));\n\n const Qx = c.getLocal(\"Q\");\n const Qy = c.i32_add(c.getLocal(\"Q\"), c.i32_const(2*n8q));\n\n const t10 = c.getLocal(\"r\");\n const t1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*n8q));\n const t9 = c.i32_add(c.getLocal(\"r\"), c.i32_const(4*n8q));\n\n const zsquared = c.i32_const(module.alloc(f2size));\n const ysquared = c.i32_const(module.alloc(f2size));\n const ztsquared = c.i32_const(module.alloc(f2size));\n const t0 = c.i32_const(module.alloc(f2size));\n const t2 = c.i32_const(module.alloc(f2size));\n const t3 = c.i32_const(module.alloc(f2size));\n const t4 = c.i32_const(module.alloc(f2size));\n const t5 = c.i32_const(module.alloc(f2size));\n const t6 = c.i32_const(module.alloc(f2size));\n const t7 = c.i32_const(module.alloc(f2size));\n const t8 = c.i32_const(module.alloc(f2size));\n\n f.addCode(\n\n // zsquared = r.z.square();\n c.call(f2mPrefix + \"_square\", Rz, zsquared),\n\n // ysquared = q.y.square();\n c.call(f2mPrefix + \"_square\", Qy, ysquared),\n\n // t0 = zsquared * q.x;\n c.call(f2mPrefix + \"_mul\", zsquared, Qx, t0),\n\n // t1 = ((q.y + r.z).square() - ysquared - zsquared) * zsquared;\n c.call(f2mPrefix + \"_add\", Qy, Rz, t1),\n c.call(f2mPrefix + \"_square\", t1, t1),\n c.call(f2mPrefix + \"_sub\", t1, ysquared, t1),\n c.call(f2mPrefix + \"_sub\", t1, zsquared, t1),\n c.call(f2mPrefix + \"_mul\", t1, zsquared, t1),\n\n // t2 = t0 - r.x;\n c.call(f2mPrefix + \"_sub\", t0, Rx, t2),\n\n // t3 = t2.square();\n c.call(f2mPrefix + \"_square\", t2, t3),\n\n // t4 = t3 + t3;\n c.call(f2mPrefix + \"_add\", t3, t3, t4),\n\n // t4 = t4 + t4;\n c.call(f2mPrefix + \"_add\", t4, t4, t4),\n\n // t5 = t4 * t2;\n c.call(f2mPrefix + \"_mul\", t4, t2, t5),\n\n // t6 = t1 - r.y - r.y;\n c.call(f2mPrefix + \"_sub\", t1, Ry, t6),\n c.call(f2mPrefix + \"_sub\", t6, Ry, t6),\n\n // t9 = t6 * q.x;\n c.call(f2mPrefix + \"_mul\", t6, Qx, t9),\n\n // t7 = t4 * r.x;\n c.call(f2mPrefix + \"_mul\", t4, Rx, t7),\n\n // r.x = t6.square() - t5 - t7 - t7;\n c.call(f2mPrefix + \"_square\", t6, Rx),\n c.call(f2mPrefix + \"_sub\", Rx, t5, Rx),\n c.call(f2mPrefix + \"_sub\", Rx, t7, Rx),\n c.call(f2mPrefix + \"_sub\", Rx, t7, Rx),\n\n // r.z = (r.z + t2).square() - zsquared - t3;\n c.call(f2mPrefix + \"_add\", Rz, t2, Rz),\n c.call(f2mPrefix + \"_square\", Rz, Rz),\n c.call(f2mPrefix + \"_sub\", Rz, zsquared, Rz),\n c.call(f2mPrefix + \"_sub\", Rz, t3, Rz),\n\n // t10 = q.y + r.z;\n c.call(f2mPrefix + \"_add\", Qy, Rz, t10),\n\n // t8 = (t7 - r.x) * t6;\n c.call(f2mPrefix + \"_sub\", t7, Rx, t8),\n c.call(f2mPrefix + \"_mul\", t8, t6, t8),\n\n // t0 = r.y * t5;\n c.call(f2mPrefix + \"_mul\", Ry, t5, t0),\n\n // t0 = t0 + t0;\n c.call(f2mPrefix + \"_add\", t0, t0, t0),\n\n // r.y = t8 - t0;\n c.call(f2mPrefix + \"_sub\", t8, t0, Ry),\n\n // t10 = t10.square() - ysquared;\n c.call(f2mPrefix + \"_square\", t10, t10),\n c.call(f2mPrefix + \"_sub\", t10, ysquared, t10),\n\n // ztsquared = r.z.square();\n c.call(f2mPrefix + \"_square\", Rz, ztsquared),\n\n // t10 = t10 - ztsquared;\n c.call(f2mPrefix + \"_sub\", t10, ztsquared, t10),\n\n // t9 = t9 + t9 - t10;\n c.call(f2mPrefix + \"_add\", t9, t9, t9),\n c.call(f2mPrefix + \"_sub\", t9, t10, t9),\n\n // t10 = r.z + r.z;\n c.call(f2mPrefix + \"_add\", Rz, Rz, t10),\n\n // t6 = -t6;\n c.call(f2mPrefix + \"_neg\", t6, t6),\n\n // t1 = t6 + t6;\n c.call(f2mPrefix + \"_add\", t6, t6, t1),\n );\n }\n\n\n function buildPrepareG2() {\n const f = module.addFunction(prefix+ \"_prepareG2\");\n f.addParam(\"pQ\", \"i32\");\n f.addParam(\"ppreQ\", \"i32\");\n f.addLocal(\"pCoef\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n\n const Q = c.getLocal(\"pQ\");\n\n const pR = module.alloc(f2size*3);\n const R = c.i32_const(pR);\n\n const base = c.getLocal(\"ppreQ\");\n\n f.addCode(\n c.call(g2mPrefix + \"_normalize\", Q, base),\n c.if(\n c.call(g2mPrefix + \"_isZero\", base),\n c.ret([])\n ),\n c.call(g2mPrefix + \"_copy\", base, R),\n c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"ppreQ\"), c.i32_const(f2size*3))),\n );\n\n f.addCode(\n c.setLocal(\"i\", c.i32_const(ateLoopBitBytes.length-2)),\n c.block(c.loop(\n\n c.call(prefix + \"_prepDblStep\", R, c.getLocal(\"pCoef\")),\n c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n\n c.if(\n c.i32_load8_s(c.getLocal(\"i\"), pAteLoopBitBytes),\n [\n ...c.call(prefix + \"_prepAddStep\", R, base, c.getLocal(\"pCoef\")),\n ...c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n ]\n ),\n c.br_if(1, c.i32_eqz ( c.getLocal(\"i\") )),\n c.setLocal(\"i\", c.i32_sub(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n }\n\n\n function buildF6Mul1() {\n const f = module.addFunction(f6mPrefix+ \"_mul1\");\n f.addParam(\"pA\", \"i32\"); // F6\n f.addParam(\"pC1\", \"i32\"); // F2\n f.addParam(\"pR\", \"i32\"); // F6\n\n const c = f.getCodeBuilder();\n\n const A_c0 = c.getLocal(\"pA\");\n const A_c1 = c.i32_add(c.getLocal(\"pA\"), c.i32_const(f1size*2));\n const A_c2 = c.i32_add(c.getLocal(\"pA\"), c.i32_const(f1size*4));\n\n const c1 = c.getLocal(\"pC1\");\n\n const t1 = c.getLocal(\"pR\");\n const t2 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(f1size*2));\n const b_b = c.i32_add(c.getLocal(\"pR\"), c.i32_const(f1size*4));\n\n const Ac0_Ac1 = c.i32_const(module.alloc(f1size*2));\n const Ac1_Ac2 = c.i32_const(module.alloc(f1size*2));\n\n f.addCode(\n\n c.call(f2mPrefix + \"_add\", A_c0, A_c1, Ac0_Ac1),\n c.call(f2mPrefix + \"_add\", A_c1, A_c2, Ac1_Ac2),\n\n // let b_b = self.c1 * c1;\n c.call(f2mPrefix + \"_mul\", A_c1, c1, b_b),\n\n // let t1 = (self.c1 + self.c2) * c1 - b_b;\n c.call(f2mPrefix + \"_mul\", Ac1_Ac2, c1, t1),\n c.call(f2mPrefix + \"_sub\", t1, b_b, t1),\n\n // let t1 = t1.mul_by_nonresidue();\n c.call(f2mPrefix + \"_mulNR\", t1, t1),\n\n // let t2 = (self.c0 + self.c1) * c1 - b_b;\n c.call(f2mPrefix + \"_mul\", Ac0_Ac1, c1, t2),\n c.call(f2mPrefix + \"_sub\", t2, b_b, t2),\n );\n }\n buildF6Mul1();\n\n function buildF6Mul01() {\n const f = module.addFunction(f6mPrefix+ \"_mul01\");\n f.addParam(\"pA\", \"i32\"); // F6\n f.addParam(\"pC0\", \"i32\"); // F2\n f.addParam(\"pC1\", \"i32\"); // F2\n f.addParam(\"pR\", \"i32\"); // F6\n\n const c = f.getCodeBuilder();\n\n const A_c0 = c.getLocal(\"pA\");\n const A_c1 = c.i32_add(c.getLocal(\"pA\"), c.i32_const(f1size*2));\n const A_c2 = c.i32_add(c.getLocal(\"pA\"), c.i32_const(f1size*4));\n\n const c0 = c.getLocal(\"pC0\");\n const c1 = c.getLocal(\"pC1\");\n\n const t1 = c.getLocal(\"pR\");\n const t2 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(f1size*2));\n const t3 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(f1size*4));\n\n const a_a = c.i32_const(module.alloc(f1size*2));\n const b_b = c.i32_const(module.alloc(f1size*2));\n const Ac0_Ac1 = c.i32_const(module.alloc(f1size*2));\n const Ac0_Ac2 = c.i32_const(module.alloc(f1size*2));\n\n f.addCode(\n // let a_a = self.c0 * c0;\n c.call(f2mPrefix + \"_mul\", A_c0, c0, a_a),\n\n // let b_b = self.c1 * c1;\n c.call(f2mPrefix + \"_mul\", A_c1, c1, b_b),\n\n\n c.call(f2mPrefix + \"_add\", A_c0, A_c1, Ac0_Ac1),\n c.call(f2mPrefix + \"_add\", A_c0, A_c2, Ac0_Ac2),\n\n // let t1 = (self.c1 + self.c2) * c1 - b_b;\n c.call(f2mPrefix + \"_add\", A_c1, A_c2, t1),\n c.call(f2mPrefix + \"_mul\", t1, c1, t1),\n c.call(f2mPrefix + \"_sub\", t1, b_b, t1),\n\n // let t1 = t1.mul_by_nonresidue() + a_a;\n c.call(f2mPrefix + \"_mulNR\", t1, t1),\n c.call(f2mPrefix + \"_add\", t1, a_a, t1),\n\n // let t2 = (c0 + c1) * (self.c0 + self.c1) - a_a - b_b;\n c.call(f2mPrefix + \"_add\", c0, c1, t2),\n c.call(f2mPrefix + \"_mul\", t2, Ac0_Ac1, t2),\n c.call(f2mPrefix + \"_sub\", t2, a_a, t2),\n c.call(f2mPrefix + \"_sub\", t2, b_b, t2),\n\n // let t3 = (self.c0 + self.c2) * c0 - a_a + b_b;\n c.call(f2mPrefix + \"_mul\", Ac0_Ac2, c0, t3),\n c.call(f2mPrefix + \"_sub\", t3, a_a, t3),\n c.call(f2mPrefix + \"_add\", t3, b_b, t3),\n\n\n );\n }\n buildF6Mul01();\n\n\n function buildF12Mul014() {\n\n const f = module.addFunction(ftmPrefix+ \"_mul014\");\n f.addParam(\"pA\", \"i32\"); // F12\n f.addParam(\"pC0\", \"i32\"); // F2\n f.addParam(\"pC1\", \"i32\"); // F2\n f.addParam(\"pC4\", \"i32\"); // F2\n f.addParam(\"pR\", \"i32\"); // F12\n\n const c = f.getCodeBuilder();\n\n\n const A_c0 = c.getLocal(\"pA\");\n const A_c1 = c.i32_add(c.getLocal(\"pA\"), c.i32_const(f1size*6));\n\n const c0 = c.getLocal(\"pC0\");\n const c1 = c.getLocal(\"pC1\");\n const c4 = c.getLocal(\"pC4\");\n\n const aa = c.i32_const(module.alloc(f1size*6));\n const bb = c.i32_const(module.alloc(f1size*6));\n const o = c.i32_const(module.alloc(f1size*2));\n\n const R_c0 = c.getLocal(\"pR\");\n const R_c1 = c.i32_add(c.getLocal(\"pR\"), c.i32_const(f1size*6));\n\n f.addCode(\n // let aa = self.c0.mul_by_01(c0, c1);\n c.call(f6mPrefix + \"_mul01\", A_c0, c0, c1, aa),\n\n // let bb = self.c1.mul_by_1(c4);\n c.call(f6mPrefix + \"_mul1\", A_c1, c4, bb),\n\n // let o = c1 + c4;\n c.call(f2mPrefix + \"_add\", c1, c4, o),\n\n // let c1 = self.c1 + self.c0;\n c.call(f6mPrefix + \"_add\", A_c1, A_c0, R_c1),\n\n // let c1 = c1.mul_by_01(c0, &o);\n c.call(f6mPrefix + \"_mul01\", R_c1, c0, o, R_c1),\n\n // let c1 = c1 - aa - bb;\n c.call(f6mPrefix + \"_sub\", R_c1, aa, R_c1),\n c.call(f6mPrefix + \"_sub\", R_c1, bb, R_c1),\n\n // let c0 = bb;\n c.call(f6mPrefix + \"_copy\", bb, R_c0),\n\n // let c0 = c0.mul_by_nonresidue();\n c.call(f6mPrefix + \"_mulNR\", R_c0, R_c0),\n\n // let c0 = c0 + aa;\n c.call(f6mPrefix + \"_add\", R_c0, aa, R_c0),\n );\n }\n buildF12Mul014();\n\n\n function buildELL() {\n const f = module.addFunction(prefix+ \"_ell\");\n f.addParam(\"pP\", \"i32\");\n f.addParam(\"pCoefs\", \"i32\");\n f.addParam(\"pF\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const Px = c.getLocal(\"pP\");\n const Py = c.i32_add(c.getLocal(\"pP\"), c.i32_const(n8q));\n\n const F = c.getLocal(\"pF\");\n\n const coef0_0 = c.getLocal(\"pCoefs\");\n const coef0_1 = c.i32_add(c.getLocal(\"pCoefs\"), c.i32_const(f1size));\n const coef1_0 = c.i32_add(c.getLocal(\"pCoefs\"), c.i32_const(f1size*2));\n const coef1_1 = c.i32_add(c.getLocal(\"pCoefs\"), c.i32_const(f1size*3));\n const coef2 = c.i32_add(c.getLocal(\"pCoefs\"), c.i32_const(f1size*4));\n\n const pc0 = module.alloc(f1size*2);\n const c0 = c.i32_const(pc0);\n const c0_c0 = c.i32_const(pc0);\n const c0_c1 = c.i32_const(pc0+f1size);\n\n const pc1 = module.alloc(f1size*2);\n const c1 = c.i32_const(pc1);\n const c1_c0 = c.i32_const(pc1);\n const c1_c1 = c.i32_const(pc1+f1size);\n f.addCode(\n // let mut c0 = coeffs.0;\n // let mut c1 = coeffs.1;\n //\n // c0.c0 *= p.y;\n // c0.c1 *= p.y;\n //\n // c1.c0 *= p.x;\n // c1.c1 *= p.x;\n //\n // f.mul_by_014(&coeffs.2, &c1, &c0)\n\n c.call(f1mPrefix + \"_mul\", coef0_0, Py, c0_c0),\n c.call(f1mPrefix + \"_mul\", coef0_1, Py, c0_c1),\n c.call(f1mPrefix + \"_mul\", coef1_0, Px, c1_c0),\n c.call(f1mPrefix + \"_mul\", coef1_1, Px, c1_c1),\n\n c.call(ftmPrefix + \"_mul014\", F, coef2, c1, c0, F),\n\n );\n\n }\n buildELL();\n\n function buildMillerLoop() {\n const f = module.addFunction(prefix+ \"_millerLoop\");\n f.addParam(\"ppreP\", \"i32\");\n f.addParam(\"ppreQ\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"pCoef\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const preP = c.getLocal(\"ppreP\");\n\n const coefs = c.getLocal(\"pCoef\");\n\n const F = c.getLocal(\"r\");\n\n\n f.addCode(\n c.call(ftmPrefix + \"_one\", F),\n\n c.if(\n c.call(g1mPrefix + \"_isZero\", preP),\n c.ret([])\n ),\n c.if(\n c.call(g1mPrefix + \"_isZero\", c.getLocal(\"ppreQ\")),\n c.ret([])\n ),\n c.setLocal(\"pCoef\", c.i32_add( c.getLocal(\"ppreQ\"), c.i32_const(f2size*3))),\n\n c.setLocal(\"i\", c.i32_const(ateLoopBitBytes.length-2)),\n c.block(c.loop(\n\n\n c.call(prefix + \"_ell\", preP, coefs, F),\n c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n\n c.if(\n c.i32_load8_s(c.getLocal(\"i\"), pAteLoopBitBytes),\n [\n ...c.call(prefix + \"_ell\", preP, coefs, F),\n ...c.setLocal(\"pCoef\", c.i32_add(c.getLocal(\"pCoef\"), c.i32_const(ateCoefSize))),\n ]\n ),\n c.call(ftmPrefix + \"_square\", F, F),\n\n c.br_if(1, c.i32_eq ( c.getLocal(\"i\"), c.i32_const(1) )),\n c.setLocal(\"i\", c.i32_sub(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n )),\n c.call(prefix + \"_ell\", preP, coefs, F),\n\n );\n\n\n if (isLoopNegative) {\n f.addCode(\n c.call(ftmPrefix + \"_conjugate\", F, F),\n );\n }\n }\n\n\n function buildFrobeniusMap(n) {\n const F12 = [\n [\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n ],\n [\n [1n, 0n],\n [3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n, 151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n],\n [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n, 0n],\n [2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n, 1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n],\n [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n],\n [3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n, 877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n],\n [4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n, 0n],\n [151655185184498381465642749684540099398075398968325446656007613510403227271200139370504932015952886146304766135027n, 3850754370037169011952147076051364057158807420970682438676050522613628423219637725072182697113062777891589506424760n],\n [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n],\n [1028732146235106349975324479215795277384839936929757896155643118032610843298655225875571310552543014690878354869257n, 2973677408986561043442465346520108879172042883009249989176415018091420807192182638567116318576472649347015917690530n],\n [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n, 0n],\n [877076961050607968509681729531255177986764537961432449499635504522207616027455086505066378536590128544573588734230n, 3125332594171059424908108096204648978570118281977575435832422631601824034463382777937621250592425535493320683825557n],\n ]\n ];\n\n const F6 = [\n [\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n [1n, 0n],\n ],\n [\n [1n, 0n],\n [0n, 4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n],\n [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n],\n [0n, 1n],\n [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n],\n [0n, 793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n],\n ],\n [\n [1n, 0n],\n [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939437n, 0n],\n [4002409555221667392624310435006688643935503118305586438271171395842971157480381377015405980053539358417135540939436n, 0n],\n [4002409555221667393417789825735904156556882819939007885332058136124031650490837864442687629129015664037894272559786n, 0n],\n [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620350n, 0n],\n [793479390729215512621379701633421447060886740281060493010456487427281649075476305620758731620351n, 0n],\n ]\n ];\n\n const f = module.addFunction(ftmPrefix + \"_frobeniusMap\"+n);\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n for (let i=0; i<6; i++) {\n const X = (i==0) ? c.getLocal(\"x\") : c.i32_add(c.getLocal(\"x\"), c.i32_const(i*f2size));\n const Xc0 = X;\n const Xc1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(i*f2size + f1size));\n const R = (i==0) ? c.getLocal(\"r\") : c.i32_add(c.getLocal(\"r\"), c.i32_const(i*f2size));\n const Rc0 = R;\n const Rc1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(i*f2size + f1size));\n const coef = mul2(F12[Math.floor(i/3)][n%12] , F6[i%3][n%6]);\n const pCoef = module.alloc([\n ...utils.bigInt2BytesLE(toMontgomery(coef[0]), n8q),\n ...utils.bigInt2BytesLE(toMontgomery(coef[1]), n8q),\n ]);\n if (n%2 == 1) {\n f.addCode(\n c.call(f1mPrefix + \"_copy\", Xc0, Rc0),\n c.call(f1mPrefix + \"_neg\", Xc1, Rc1),\n c.call(f2mPrefix + \"_mul\", R, c.i32_const(pCoef), R),\n );\n } else {\n f.addCode(c.call(f2mPrefix + \"_mul\", X, c.i32_const(pCoef), R));\n }\n }\n\n function mul2(a, b) {\n const ac0 = a[0];\n const ac1 = a[1];\n const bc0 = b[0];\n const bc1 = b[1];\n const res = [\n (ac0 * bc0 - (ac1 * bc1)) % q,\n (ac0 * bc1 + (ac1 * bc0)) % q,\n ];\n if (isNegative(res[0])) res[0] = res[0] + q;\n return res;\n }\n\n }\n\n\n function buildCyclotomicSquare() {\n const f = module.addFunction(prefix+ \"__cyclotomicSquare\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x0 = c.getLocal(\"x\");\n const x4 = c.i32_add(c.getLocal(\"x\"), c.i32_const(f2size));\n const x3 = c.i32_add(c.getLocal(\"x\"), c.i32_const(2*f2size));\n const x2 = c.i32_add(c.getLocal(\"x\"), c.i32_const(3*f2size));\n const x1 = c.i32_add(c.getLocal(\"x\"), c.i32_const(4*f2size));\n const x5 = c.i32_add(c.getLocal(\"x\"), c.i32_const(5*f2size));\n\n const r0 = c.getLocal(\"r\");\n const r4 = c.i32_add(c.getLocal(\"r\"), c.i32_const(f2size));\n const r3 = c.i32_add(c.getLocal(\"r\"), c.i32_const(2*f2size));\n const r2 = c.i32_add(c.getLocal(\"r\"), c.i32_const(3*f2size));\n const r1 = c.i32_add(c.getLocal(\"r\"), c.i32_const(4*f2size));\n const r5 = c.i32_add(c.getLocal(\"r\"), c.i32_const(5*f2size));\n\n const t0 = c.i32_const(module.alloc(f2size));\n const t1 = c.i32_const(module.alloc(f2size));\n const t2 = c.i32_const(module.alloc(f2size));\n const t3 = c.i32_const(module.alloc(f2size));\n const t4 = c.i32_const(module.alloc(f2size));\n const t5 = c.i32_const(module.alloc(f2size));\n const tmp = c.i32_const(module.alloc(f2size));\n const AUX = c.i32_const(module.alloc(f2size));\n\n\n f.addCode(\n // // t0 + t1*y = (z0 + z1*y)^2 = a^2\n // tmp = z0 * z1;\n // t0 = (z0 + z1) * (z0 + my_Fp6::non_residue * z1) - tmp - my_Fp6::non_residue * tmp;\n // t1 = tmp + tmp;\n c.call(f2mPrefix + \"_mul\", x0, x1, tmp),\n c.call(f2mPrefix + \"_mulNR\", x1, t0),\n c.call(f2mPrefix + \"_add\", x0, t0, t0),\n c.call(f2mPrefix + \"_add\", x0, x1, AUX),\n c.call(f2mPrefix + \"_mul\", AUX, t0, t0),\n c.call(f2mPrefix + \"_mulNR\", tmp, AUX),\n c.call(f2mPrefix + \"_add\", tmp, AUX, AUX),\n c.call(f2mPrefix + \"_sub\", t0, AUX, t0),\n c.call(f2mPrefix + \"_add\", tmp, tmp, t1),\n\n // // t2 + t3*y = (z2 + z3*y)^2 = b^2\n // tmp = z2 * z3;\n // t2 = (z2 + z3) * (z2 + my_Fp6::non_residue * z3) - tmp - my_Fp6::non_residue * tmp;\n // t3 = tmp + tmp;\n c.call(f2mPrefix + \"_mul\", x2, x3, tmp),\n c.call(f2mPrefix + \"_mulNR\", x3, t2),\n c.call(f2mPrefix + \"_add\", x2, t2, t2),\n c.call(f2mPrefix + \"_add\", x2, x3, AUX),\n c.call(f2mPrefix + \"_mul\", AUX, t2, t2),\n c.call(f2mPrefix + \"_mulNR\", tmp, AUX),\n c.call(f2mPrefix + \"_add\", tmp, AUX, AUX),\n c.call(f2mPrefix + \"_sub\", t2, AUX, t2),\n c.call(f2mPrefix + \"_add\", tmp, tmp, t3),\n\n // // t4 + t5*y = (z4 + z5*y)^2 = c^2\n // tmp = z4 * z5;\n // t4 = (z4 + z5) * (z4 + my_Fp6::non_residue * z5) - tmp - my_Fp6::non_residue * tmp;\n // t5 = tmp + tmp;\n c.call(f2mPrefix + \"_mul\", x4, x5, tmp),\n c.call(f2mPrefix + \"_mulNR\", x5, t4),\n c.call(f2mPrefix + \"_add\", x4, t4, t4),\n c.call(f2mPrefix + \"_add\", x4, x5, AUX),\n c.call(f2mPrefix + \"_mul\", AUX, t4, t4),\n c.call(f2mPrefix + \"_mulNR\", tmp, AUX),\n c.call(f2mPrefix + \"_add\", tmp, AUX, AUX),\n c.call(f2mPrefix + \"_sub\", t4, AUX, t4),\n c.call(f2mPrefix + \"_add\", tmp, tmp, t5),\n\n // For A\n // z0 = 3 * t0 - 2 * z0\n c.call(f2mPrefix + \"_sub\", t0, x0, r0),\n c.call(f2mPrefix + \"_add\", r0, r0, r0),\n c.call(f2mPrefix + \"_add\", t0, r0, r0),\n // z1 = 3 * t1 + 2 * z1\n c.call(f2mPrefix + \"_add\", t1, x1, r1),\n c.call(f2mPrefix + \"_add\", r1, r1, r1),\n c.call(f2mPrefix + \"_add\", t1, r1, r1),\n\n // For B\n // z2 = 3 * (xi * t5) + 2 * z2\n c.call(f2mPrefix + \"_mul\", t5, c.i32_const(pBls12381Twist), AUX),\n c.call(f2mPrefix + \"_add\", AUX, x2, r2),\n c.call(f2mPrefix + \"_add\", r2, r2, r2),\n c.call(f2mPrefix + \"_add\", AUX, r2, r2),\n // z3 = 3 * t4 - 2 * z3\n c.call(f2mPrefix + \"_sub\", t4, x3, r3),\n c.call(f2mPrefix + \"_add\", r3, r3, r3),\n c.call(f2mPrefix + \"_add\", t4, r3, r3),\n\n // For C\n // z4 = 3 * t2 - 2 * z4\n c.call(f2mPrefix + \"_sub\", t2, x4, r4),\n c.call(f2mPrefix + \"_add\", r4, r4, r4),\n c.call(f2mPrefix + \"_add\", t2, r4, r4),\n // z5 = 3 * t3 + 2 * z5\n c.call(f2mPrefix + \"_add\", t3, x5, r5),\n c.call(f2mPrefix + \"_add\", r5, r5, r5),\n c.call(f2mPrefix + \"_add\", t3, r5, r5),\n\n );\n }\n\n\n function buildCyclotomicExp(exponent, isExpNegative, fnName) {\n const exponentNafBytes = naf(exponent).map( (b) => (b==-1 ? 0xFF: b) );\n const pExponentNafBytes = module.alloc(exponentNafBytes);\n // const pExponent = module.alloc(utils.bigInt2BytesLE(exponent, n8));\n\n const f = module.addFunction(prefix+ \"__cyclotomicExp_\"+fnName);\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n f.addLocal(\"bit\", \"i32\");\n f.addLocal(\"i\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const x = c.getLocal(\"x\");\n\n const res = c.getLocal(\"r\");\n\n const inverse = c.i32_const(module.alloc(ftsize));\n\n\n f.addCode(\n c.call(ftmPrefix + \"_conjugate\", x, inverse),\n c.call(ftmPrefix + \"_one\", res),\n\n c.if(\n c.teeLocal(\"bit\", c.i32_load8_s(c.i32_const(exponentNafBytes.length-1), pExponentNafBytes)),\n c.if(\n c.i32_eq(\n c.getLocal(\"bit\"),\n c.i32_const(1)\n ),\n c.call(ftmPrefix + \"_mul\", res, x, res),\n c.call(ftmPrefix + \"_mul\", res, inverse, res),\n )\n ),\n\n c.setLocal(\"i\", c.i32_const(exponentNafBytes.length-2)),\n c.block(c.loop(\n c.call(prefix + \"__cyclotomicSquare\", res, res),\n c.if(\n c.teeLocal(\"bit\", c.i32_load8_s(c.getLocal(\"i\"), pExponentNafBytes)),\n c.if(\n c.i32_eq(\n c.getLocal(\"bit\"),\n c.i32_const(1)\n ),\n c.call(ftmPrefix + \"_mul\", res, x, res),\n c.call(ftmPrefix + \"_mul\", res, inverse, res),\n )\n ),\n c.br_if(1, c.i32_eqz ( c.getLocal(\"i\") )),\n c.setLocal(\"i\", c.i32_sub(c.getLocal(\"i\"), c.i32_const(1))),\n c.br(0)\n ))\n );\n\n if (isExpNegative) {\n f.addCode(\n c.call(ftmPrefix + \"_conjugate\", res, res),\n );\n }\n\n }\n\n function buildFinalExponentiation() {\n buildCyclotomicSquare();\n buildCyclotomicExp(finalExpZ, finalExpIsNegative, \"w0\");\n\n const f = module.addFunction(prefix+ \"_finalExponentiation\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const c = f.getCodeBuilder();\n\n const elt = c.getLocal(\"x\");\n const res = c.getLocal(\"r\");\n const t0 = c.i32_const(module.alloc(ftsize));\n const t1 = c.i32_const(module.alloc(ftsize));\n const t2 = c.i32_const(module.alloc(ftsize));\n const t3 = c.i32_const(module.alloc(ftsize));\n const t4 = c.i32_const(module.alloc(ftsize));\n const t5 = c.i32_const(module.alloc(ftsize));\n const t6 = c.i32_const(module.alloc(ftsize));\n\n f.addCode(\n\n // let mut t0 = f.frobenius_map(6)\n c.call(ftmPrefix + \"_frobeniusMap6\", elt, t0),\n\n // let t1 = f.invert()\n c.call(ftmPrefix + \"_inverse\", elt, t1),\n\n // let mut t2 = t0 * t1;\n c.call(ftmPrefix + \"_mul\", t0, t1, t2),\n\n // t1 = t2.clone();\n c.call(ftmPrefix + \"_copy\", t2, t1),\n\n // t2 = t2.frobenius_map().frobenius_map();\n c.call(ftmPrefix + \"_frobeniusMap2\", t2, t2),\n\n // t2 *= t1;\n c.call(ftmPrefix + \"_mul\", t2, t1, t2),\n\n\n // t1 = cyclotomic_square(t2).conjugate();\n c.call(prefix + \"__cyclotomicSquare\", t2, t1),\n c.call(ftmPrefix + \"_conjugate\", t1, t1),\n\n // let mut t3 = cycolotomic_exp(t2);\n c.call(prefix + \"__cyclotomicExp_w0\", t2, t3),\n\n // let mut t4 = cyclotomic_square(t3);\n c.call(prefix + \"__cyclotomicSquare\", t3, t4),\n\n // let mut t5 = t1 * t3;\n c.call(ftmPrefix + \"_mul\", t1, t3, t5),\n\n // t1 = cycolotomic_exp(t5);\n c.call(prefix + \"__cyclotomicExp_w0\", t5, t1),\n\n // t0 = cycolotomic_exp(t1);\n c.call(prefix + \"__cyclotomicExp_w0\", t1, t0),\n\n // let mut t6 = cycolotomic_exp(t0);\n c.call(prefix + \"__cyclotomicExp_w0\", t0, t6),\n\n // t6 *= t4;\n c.call(ftmPrefix + \"_mul\", t6, t4, t6),\n\n // t4 = cycolotomic_exp(t6);\n c.call(prefix + \"__cyclotomicExp_w0\", t6, t4),\n\n // t5 = t5.conjugate();\n c.call(ftmPrefix + \"_conjugate\", t5, t5),\n\n // t4 *= t5 * t2;\n c.call(ftmPrefix + \"_mul\", t4, t5, t4),\n c.call(ftmPrefix + \"_mul\", t4, t2, t4),\n\n // t5 = t2.conjugate();\n c.call(ftmPrefix + \"_conjugate\", t2, t5),\n\n // t1 *= t2;\n c.call(ftmPrefix + \"_mul\", t1, t2, t1),\n\n // t1 = t1.frobenius_map().frobenius_map().frobenius_map();\n c.call(ftmPrefix + \"_frobeniusMap3\", t1, t1),\n\n // t6 *= t5;\n c.call(ftmPrefix + \"_mul\", t6, t5, t6),\n\n // t6 = t6.frobenius_map();\n c.call(ftmPrefix + \"_frobeniusMap1\", t6, t6),\n\n // t3 *= t0;\n c.call(ftmPrefix + \"_mul\", t3, t0, t3),\n\n // t3 = t3.frobenius_map().frobenius_map();\n c.call(ftmPrefix + \"_frobeniusMap2\", t3, t3),\n\n // t3 *= t1;\n c.call(ftmPrefix + \"_mul\", t3, t1, t3),\n\n // t3 *= t6;\n c.call(ftmPrefix + \"_mul\", t3, t6, t3),\n\n // f = t3 * t4;\n c.call(ftmPrefix + \"_mul\", t3, t4, res),\n\n );\n }\n\n\n function buildFinalExponentiationOld() {\n const f = module.addFunction(prefix+ \"_finalExponentiationOld\");\n f.addParam(\"x\", \"i32\");\n f.addParam(\"r\", \"i32\");\n\n const exponent = 322277361516934140462891564586510139908379969514828494218366688025288661041104682794998680497580008899973249814104447692778988208376779573819485263026159588510513834876303014016798809919343532899164848730280942609956670917565618115867287399623286813270357901731510188149934363360381614501334086825442271920079363289954510565375378443704372994881406797882676971082200626541916413184642520269678897559532260949334760604962086348898118982248842634379637598665468817769075878555493752214492790122785850202957575200176084204422751485957336465472324810982833638490904279282696134323072515220044451592646885410572234451732790590013479358343841220074174848221722017083597872017638514103174122784843925578370430843522959600095676285723737049438346544753168912974976791528535276317256904336520179281145394686565050419250614107803233314658825463117900250701199181529205942363159325765991819433914303908860460720581408201373164047773794825411011922305820065611121544561808414055302212057471395719432072209245600258134364584636810093520285711072578721435517884103526483832733289802426157301542744476740008494780363354305116978805620671467071400711358839553375340724899735460480144599782014906586543813292157922220645089192130209334926661588737007768565838519456601560804957985667880395221049249803753582637708560n;\n\n const pExponent = module.alloc(utils.bigInt2BytesLE( exponent, 544 ));\n\n const c = f.getCodeBuilder();\n\n f.addCode(\n c.call(ftmPrefix + \"_exp\", c.getLocal(\"x\"), c.i32_const(pExponent), c.i32_const(544), c.getLocal(\"r\")),\n );\n }\n\n\n const pPreP = module.alloc(prePSize);\n const pPreQ = module.alloc(preQSize);\n\n function buildPairingEquation(nPairings) {\n\n const f = module.addFunction(prefix+ \"_pairingEq\"+nPairings);\n for (let i=0; i.\n*/\n\n\n// export * as bn128_wasm from \"./build/bn128_wasm.js\";\nexport * as bn128_wasm_gzip from \"./build/bn128_wasm_gzip.js\";\n// export * as bls12381_wasm from \"./build/bls12381_wasm.js\";\n// export * as mnt6753_wasm from \"./build/mnt6753_wasm.js\";\n\nexport { default as buildBn128 } from \"./src/bn128/build_bn128.js\";\nexport { default as buildBls12381 } from \"./src/bls12381/build_bls12381.js\";\n// export { default as buildMnt6753 } from \"./src/mnt6753/build_mnt6753.js\";\n\nexport { default as buildF1m } from \"./src/build_f1m.js\";\n","//import { bn128_wasm_gzip as bn128wasmPrebuilt } from \"wasmcurves\";\nimport buildEngine from \"./engine.js\";\nimport * as Scalar from \"./scalar.js\";\n\nglobalThis.curve_bn128 = null;\n\nexport default async function buildBn128(singleThread, plugins) {\n if ((!singleThread) && (globalThis.curve_bn128)) return globalThis.curve_bn128;\n\n let bn128wasm = {};\n\n if (!plugins) {\n\n console.log(\"Using prebuilt bn128 wasm\");\n\n //import { bn128_wasm_gzip as bn128wasmPrebuilt } from \"wasmcurves\";\n //const { bn128_wasm_gzip: bn128wasmPrebuilt } = await import(\"wasmcurves\");\n const bn128wasmPrebuilt = await import(\"wasmcurves/build/bn128_wasm_gzip.js\");\n\n //console.log(bn128wasmPrebuilt);\n bn128wasm.pq = bn128wasmPrebuilt.pq;\n bn128wasm.pr = bn128wasmPrebuilt.pq;\n bn128wasm.pG1gen = bn128wasmPrebuilt.pG1gen;\n bn128wasm.pG1zero = bn128wasmPrebuilt.pG1zero;\n bn128wasm.pG1b = bn128wasmPrebuilt.pG1b;\n bn128wasm.pG2gen = bn128wasmPrebuilt.pG2gen;\n bn128wasm.pG2zero = bn128wasmPrebuilt.pG2zero;\n bn128wasm.pG2b = bn128wasmPrebuilt.pG2b;\n bn128wasm.pOneT = bn128wasmPrebuilt.pOneT;\n bn128wasm.prePSize = bn128wasmPrebuilt.prePSize;\n bn128wasm.preQSize = bn128wasmPrebuilt.preQSize;\n bn128wasm.n8q = 32;\n bn128wasm.n8r = 32;\n bn128wasm.q = bn128wasmPrebuilt.q;\n bn128wasm.r = bn128wasmPrebuilt.r;\n\n const compressedCode = Uint8Array.from(atob(bn128wasmPrebuilt.gzipCode), c => c.charCodeAt(0));\n const blob = new Blob([compressedCode]);\n\n const ds = new DecompressionStream(\"gzip\");\n const decompressedStream = blob.stream().pipeThrough(ds);\n\n bn128wasm.code = await new Response(decompressedStream).bytes();\n } else {\n\n //import { ModuleBuilder } from \"wasmbuilder\";\n //import { buildBn128 as buildBn128wasm } from \"wasmcurves\";\n const { ModuleBuilder } = await import(\"wasmbuilder\");\n const { buildBn128: buildBn128wasm } = await import(\"wasmcurves\");\n\n const moduleBuilder = new ModuleBuilder();\n moduleBuilder.setMemory(25);\n buildBn128wasm(moduleBuilder);\n\n if (plugins) plugins(moduleBuilder);\n\n bn128wasm.code = moduleBuilder.build();\n bn128wasm.pq = moduleBuilder.modules.f1m.pq;\n bn128wasm.pr = moduleBuilder.modules.frm.pq;\n bn128wasm.pG1gen = moduleBuilder.modules.bn128.pG1gen;\n bn128wasm.pG1zero = moduleBuilder.modules.bn128.pG1zero;\n bn128wasm.pG1b = moduleBuilder.modules.bn128.pG1b;\n bn128wasm.pG2gen = moduleBuilder.modules.bn128.pG2gen;\n bn128wasm.pG2zero = moduleBuilder.modules.bn128.pG2zero;\n bn128wasm.pG2b = moduleBuilder.modules.bn128.pG2b;\n bn128wasm.pOneT = moduleBuilder.modules.bn128.pOneT;\n bn128wasm.prePSize = moduleBuilder.modules.bn128.prePSize;\n bn128wasm.preQSize = moduleBuilder.modules.bn128.preQSize;\n bn128wasm.n8q = 32;\n bn128wasm.n8r = 32;\n bn128wasm.q = moduleBuilder.modules.bn128.q;\n bn128wasm.r = moduleBuilder.modules.bn128.r;\n }\n\n //console.log(\"bn128wasm:\", bn128wasm);\n\n const params = {\n name: \"bn128\",\n wasm: bn128wasm,\n q: Scalar.e(\"21888242871839275222246405745257275088696311157297823662689037894645226208583\"),\n r: Scalar.e(\"21888242871839275222246405745257275088548364400416034343698204186575808495617\"),\n n8q: 32,\n n8r: 32,\n cofactorG2: Scalar.e(\"30644e72e131a029b85045b68181585e06ceecda572a2489345f2299c0f9fa8d\", 16),\n singleThread: singleThread ? true : false\n };\n\n const curve = await buildEngine(params);\n curve.terminate = async function () {\n if (!params.singleThread) {\n globalThis.curve_bn128 = null;\n await this.tm.terminate();\n }\n };\n\n if (!singleThread) {\n globalThis.curve_bn128 = curve;\n }\n\n return curve;\n}\n\n","import buildEngine from \"./engine.js\";\nimport * as Scalar from \"./scalar.js\";\n\nglobalThis.curve_bls12381 = null;\n\nexport default async function buildBls12381(singleThread, plugins) {\n if ((!singleThread) && (globalThis.curve_bls12381)) return globalThis.curve_bls12381;\n\n const { ModuleBuilder } = await import(\"wasmbuilder\");\n const { buildBls12381: buildBls12381wasm } = await import(\"wasmcurves\");\n\n const moduleBuilder = new ModuleBuilder();\n moduleBuilder.setMemory(25);\n buildBls12381wasm(moduleBuilder);\n\n if (plugins) plugins(moduleBuilder);\n\n const bls12381wasm = {};\n\n bls12381wasm.code = moduleBuilder.build();\n bls12381wasm.pq = moduleBuilder.modules.f1m.pq;\n bls12381wasm.pr = moduleBuilder.modules.frm.pq;\n bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen;\n bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero;\n bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b;\n bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen;\n bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero;\n bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b;\n bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT;\n bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize;\n bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize;\n bls12381wasm.n8q = 48;\n bls12381wasm.n8r = 32;\n bls12381wasm.q = moduleBuilder.modules.bls12381.q;\n bls12381wasm.r = moduleBuilder.modules.bls12381.r;\n\n\n const params = {\n name: \"bls12381\",\n wasm: bls12381wasm,\n q: Scalar.e(\"1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab\", 16),\n r: Scalar.e(\"73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001\", 16),\n n8q: 48,\n n8r: 32,\n cofactorG1: Scalar.e(\"0x396c8c005555e1568c00aaab0000aaab\", 16),\n cofactorG2: Scalar.e(\"0x5d543a95414e7f1091d50792876a202cd91de4547085abaa68a205b2e5a7ddfa628f1cb4d9e82ef21537e293a6691ae1616ec6e786f0c70cf1c38e31c7238e5\", 16),\n singleThread: singleThread ? true : false\n };\n\n const curve = await buildEngine(params);\n curve.terminate = async function () {\n if (!params.singleThread) {\n globalThis.curve_bls12381 = null;\n await this.tm.terminate();\n }\n };\n\n if (!singleThread) {\n globalThis.curve_bls12381 = curve;\n }\n\n return curve;\n}\n\n","import * as Scalar from \"./scalar.js\";\nimport {default as buildBn128} from \"./bn128.js\";\nimport {default as buildBls12381} from \"./bls12381.js\";\n\nconst bls12381r = Scalar.e(\"73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001\", 16);\nconst bn128r = Scalar.e(\"21888242871839275222246405745257275088548364400416034343698204186575808495617\");\n\nconst bls12381q = Scalar.e(\"1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab\", 16);\nconst bn128q = Scalar.e(\"21888242871839275222246405745257275088696311157297823662689037894645226208583\");\n\nexport async function getCurveFromR(r, singleThread, plugins) {\n let curve;\n if (Scalar.eq(r, bn128r)) {\n curve = await buildBn128(singleThread, plugins);\n } else if (Scalar.eq(r, bls12381r)) {\n curve = await buildBls12381(singleThread, plugins);\n } else {\n throw new Error(`Curve not supported: ${Scalar.toString(r)}`);\n }\n return curve;\n}\n\nexport async function getCurveFromQ(q, singleThread, plugins) {\n let curve;\n if (Scalar.eq(q, bn128q)) {\n curve = await buildBn128(singleThread, plugins);\n } else if (Scalar.eq(q, bls12381q)) {\n curve = await buildBls12381(singleThread, plugins);\n } else {\n throw new Error(`Curve not supported: ${Scalar.toString(q, 16)}`);\n }\n return curve;\n}\n\nexport async function getCurveFromName(name, singleThread, plugins) {\n let curve;\n const normName = normalizeName(name);\n if ([\"BN128\", \"BN254\", \"ALTBN128\"].indexOf(normName) >= 0) {\n curve = await buildBn128(singleThread, plugins);\n } else if ([\"BLS12381\"].indexOf(normName) >= 0) {\n curve = await buildBls12381(singleThread, plugins);\n } else {\n throw new Error(`Curve not supported: ${name}`);\n }\n return curve;\n\n function normalizeName(n) {\n return n.toUpperCase().match(/[A-Za-z0-9]+/g).join(\"\");\n }\n\n}\n","\nimport * as _Scalar from \"./src/scalar.js\";\nexport const Scalar=_Scalar;\n\nexport {default as PolField} from \"./src/polfield.js\";\nexport {default as F1Field} from \"./src/f1field.js\";\nexport {default as F2Field} from \"./src/f2field.js\";\nexport {default as F3Field} from \"./src/f3field.js\";\n\nexport {default as ZqField} from \"./src/f1field.js\";\n\nexport {default as EC} from \"./src/ec.js\";\n\nexport {default as buildBn128} from \"./src/bn128.js\";\nexport {default as buildBls12381} from \"./src/bls12381.js\";\n\nimport * as _utils from \"./src/utils.js\";\nexport const utils = _utils;\nexport {default as ChaCha} from \"./src/chacha.js\";\n\nexport {default as BigBuffer} from \"./src/bigbuffer.js\";\n\nexport {getCurveFromR, getCurveFromQ, getCurveFromName} from \"./src/curves.js\";\n\n"],"x_google_ignoreList":[20,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58],"mappings":"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"} \ No newline at end of file diff --git a/build/main.cjs b/build/main.cjs index 4448871..76e7cc3 100644 --- a/build/main.cjs +++ b/build/main.cjs @@ -1,6281 +1,4506 @@ -'use strict'; - -var crypto = require('crypto'); -var os = require('os'); -var Worker = require('web-worker'); - -/* global BigInt */ -const hexLen = [ 0, 1, 2, 2, 3, 3, 3, 3, 4 ,4 ,4 ,4 ,4 ,4 ,4 ,4]; - +console.log("node cjs"); +Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); +const require_threadman_thread = require("./threadman_thread.cjs"); +let workerpool = require("workerpool"); +workerpool = require_threadman_thread.__toESM(workerpool); +let os = require("os"); +os = require_threadman_thread.__toESM(os); +let url = require("url"); +let path = require("path"); +//#region src/scalar.js +var scalar_exports = /* @__PURE__ */ require_threadman_thread.__exportAll({ + abs: () => abs, + add: () => add, + band: () => band, + bitLength: () => bitLength, + bits: () => bits, + bor: () => bor, + bxor: () => bxor, + div: () => div, + e: () => e, + eq: () => eq, + exp: () => exp$1, + fromArray: () => fromArray, + fromRprBE: () => fromRprBE, + fromRprLE: () => fromRprLE, + fromString: () => fromString, + geq: () => geq, + gt: () => gt, + isNegative: () => isNegative, + isOdd: () => isOdd, + isZero: () => isZero, + land: () => land, + leq: () => leq, + lnot: () => lnot, + lor: () => lor, + lt: () => lt, + mod: () => mod, + mul: () => mul, + naf: () => naf, + neg: () => neg, + neq: () => neq, + one: () => one, + pow: () => pow, + shiftLeft: () => shiftLeft, + shiftRight: () => shiftRight, + shl: () => shl, + shr: () => shr, + square: () => square, + sub: () => sub, + toArray: () => toArray, + toLEBuff: () => toLEBuff, + toNumber: () => toNumber, + toRprBE: () => toRprBE, + toRprLE: () => toRprLE, + toString: () => toString, + zero: () => zero +}); +var hexLen = [ + 0, + 1, + 2, + 2, + 3, + 3, + 3, + 3, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4 +]; function fromString(s, radix) { - if ((!radix)||(radix==10)) { - return BigInt(s); - } else if (radix==16) { - if (s.slice(0,2) == "0x") { - return BigInt(s); - } else { - return BigInt("0x"+s); - } - } + if (!radix || radix == 10) return BigInt(s); + else if (radix == 16) if (s.slice(0, 2) == "0x") return BigInt(s); + else return BigInt("0x" + s); } - -const e = fromString; - +var e = fromString; function fromArray(a, radix) { - let acc =BigInt(0); - radix = BigInt(radix); - for (let i=0; i> BigInt(n); + return BigInt(a) >> BigInt(n); } - -const shl = shiftLeft; -const shr = shiftRight; - +var shl = shiftLeft; +var shr = shiftRight; function isOdd(a) { - return (BigInt(a) & BigInt(1)) == BigInt(1); + return (BigInt(a) & BigInt(1)) == BigInt(1); } - - function naf(n) { - let E = BigInt(n); - const res = []; - while (E) { - if (E & BigInt(1)) { - const z = 2 - Number(E % BigInt(4)); - res.push( z ); - E = E - BigInt(z); - } else { - res.push( 0 ); - } - E = E >> BigInt(1); - } - return res; + let E = BigInt(n); + const res = []; + while (E) { + if (E & BigInt(1)) { + const z = 2 - Number(E % BigInt(4)); + res.push(z); + E = E - BigInt(z); + } else res.push(0); + E = E >> BigInt(1); + } + return res; } - - function bits(n) { - let E = BigInt(n); - const res = []; - while (E) { - if (E & BigInt(1)) { - res.push(1); - } else { - res.push( 0 ); - } - E = E >> BigInt(1); - } - return res; + let E = BigInt(n); + const res = []; + while (E) { + if (E & BigInt(1)) res.push(1); + else res.push(0); + E = E >> BigInt(1); + } + return res; } - function toNumber(s) { - if (s>BigInt(Number.MAX_SAFE_INTEGER )) { - throw new Error("Number too big"); - } - return Number(s); + if (s > BigInt(Number.MAX_SAFE_INTEGER)) throw new Error("Number too big"); + return Number(s); } - function toArray(s, radix) { - const res = []; - let rem = BigInt(s); - radix = BigInt(radix); - while (rem) { - res.unshift( Number(rem % radix)); - rem = rem / radix; - } - return res; + const res = []; + let rem = BigInt(s); + radix = BigInt(radix); + while (rem) { + res.unshift(Number(rem % radix)); + rem = rem / radix; + } + return res; } - - function add(a, b) { - return BigInt(a) + BigInt(b); + return BigInt(a) + BigInt(b); } - function sub(a, b) { - return BigInt(a) - BigInt(b); + return BigInt(a) - BigInt(b); } - function neg(a) { - return -BigInt(a); + return -BigInt(a); } - function mul(a, b) { - return BigInt(a) * BigInt(b); + return BigInt(a) * BigInt(b); } - function square(a) { - return BigInt(a) * BigInt(a); + return BigInt(a) * BigInt(a); } - function pow(a, b) { - return BigInt(a) ** BigInt(b); + return BigInt(a) ** BigInt(b); } - function exp$1(a, b) { - return BigInt(a) ** BigInt(b); + return BigInt(a) ** BigInt(b); } - function abs(a) { - return BigInt(a) >= 0 ? BigInt(a) : -BigInt(a); + return BigInt(a) >= 0 ? BigInt(a) : -BigInt(a); } - function div(a, b) { - return BigInt(a) / BigInt(b); + return BigInt(a) / BigInt(b); } - function mod(a, b) { - return BigInt(a) % BigInt(b); + return BigInt(a) % BigInt(b); } - function eq(a, b) { - return BigInt(a) == BigInt(b); + return BigInt(a) == BigInt(b); } - function neq(a, b) { - return BigInt(a) != BigInt(b); + return BigInt(a) != BigInt(b); } - function lt(a, b) { - return BigInt(a) < BigInt(b); + return BigInt(a) < BigInt(b); } - function gt(a, b) { - return BigInt(a) > BigInt(b); + return BigInt(a) > BigInt(b); } - function leq(a, b) { - return BigInt(a) <= BigInt(b); + return BigInt(a) <= BigInt(b); } - function geq(a, b) { - return BigInt(a) >= BigInt(b); + return BigInt(a) >= BigInt(b); } - function band(a, b) { - return BigInt(a) & BigInt(b); + return BigInt(a) & BigInt(b); } - function bor(a, b) { - return BigInt(a) | BigInt(b); + return BigInt(a) | BigInt(b); } - function bxor(a, b) { - return BigInt(a) ^ BigInt(b); + return BigInt(a) ^ BigInt(b); } - function land(a, b) { - return BigInt(a) && BigInt(b); + return BigInt(a) && BigInt(b); } - function lor(a, b) { - return BigInt(a) || BigInt(b); + return BigInt(a) || BigInt(b); } - function lnot(a) { - return !BigInt(a); + return !BigInt(a); } - -// Returns a buffer with Little Endian Representation function toRprLE(buff, o, e, n8) { - const s = "0000000" + e.toString(16); - const v = new Uint32Array(buff.buffer, buff.byteOffset + o, n8/4); - const l = (((s.length-7)*4 - 1) >> 5)+1; // Number of 32bit words; - for (let i=0; i> 5) + 1; + for (let i = 0; i < l; i++) v[i] = parseInt(s.substring(s.length - 8 * i - 8, s.length - 8 * i), 16); + for (let i = l; i < v.length; i++) v[i] = 0; + for (let i = v.length * 4; i < n8; i++) buff[i] = toNumber(band(shiftRight(e, i * 8), 255)); } - -// Returns a buffer with Big Endian Representation function toRprBE(buff, o, e, n8) { - const s = "0000000" + e.toString(16); - const v = new DataView(buff.buffer, buff.byteOffset + o, n8); - const l = (((s.length-7)*4 - 1) >> 5)+1; // Number of 32bit words; - for (let i=0; i> 5) + 1; + for (let i = 0; i < l; i++) v.setUint32(n8 - i * 4 - 4, parseInt(s.substring(s.length - 8 * i - 8, s.length - 8 * i), 16), false); + for (let i = 0; i < n8 / 4 - l; i++) v[i] = 0; } - -// Pases a buffer with Little Endian Representation function fromRprLE(buff, o, n8) { - n8 = n8 || buff.byteLength; - o = o || 0; - const v = new Uint32Array(buff.buffer, buff.byteOffset + o, n8/4); - const a = new Array(n8/4); - v.forEach( (ch,i) => a[a.length-i-1] = ch.toString(16).padStart(8,"0") ); - return fromString(a.join(""), 16); + n8 = n8 || buff.byteLength; + o = o || 0; + const v = new Uint32Array(buff.buffer, buff.byteOffset + o, n8 / 4); + const a = new Array(n8 / 4); + v.forEach((ch, i) => a[a.length - i - 1] = ch.toString(16).padStart(8, "0")); + return fromString(a.join(""), 16); } - -// Pases a buffer with Big Endian Representation function fromRprBE(buff, o, n8) { - n8 = n8 || buff.byteLength; - o = o || 0; - const v = new DataView(buff.buffer, buff.byteOffset + o, n8); - const a = new Array(n8/4); - for (let i=0; i. -*/ - -/* - This library does operations on polynomials with coefficients in a field F. - - A polynomial P(x) = p0 + p1 * x + p2 * x^2 + ... + pn * x^n is represented - by the array [ p0, p1, p2, ... , pn ]. - */ - -class PolField { - constructor (F) { - this.F = F; - - let rem = F.sqrt_t; - let s = F.sqrt_s; - - const five = this.F.add(this.F.add(this.F.two, this.F.two), this.F.one); - - this.w = new Array(s+1); - this.wi = new Array(s+1); - this.w[s] = this.F.pow(five, rem); - this.wi[s] = this.F.inv(this.w[s]); - - let n=s-1; - while (n>=0) { - this.w[n] = this.F.square(this.w[n+1]); - this.wi[n] = this.F.square(this.wi[n+1]); - n--; - } - - - this.roots = []; -/* for (let i=0; i<16; i++) { - let r = this.F.one; - n = 1 << i; - const rootsi = new Array(n); - for (let j=0; j this.F.sqrt_s) n = this.s; - for (let i=n; (i>=0) && (!this.roots[i]); i--) { - let r = this.F.one; - const nroots = 1 << i; - const rootsi = new Array(nroots); - for (let j=0; j a.length) { - [b, a] = [a, b]; - } - - if ((b.length <= 2) || (b.length < log2$2(a.length))) { - return this.mulNormal(a,b); - } else { - return this.mulFFT(a,b); - } - } - - mulNormal(a, b) { - let res = []; - for (let i=0; i0) { - const z = new Array(n).fill(this.F.zero); - return z.concat(p); - } else { - if (-n >= p.length) return []; - return p.slice(-n); - } - } - - eval2(p, x) { - let v = this.F.zero; - let ix = this.F.one; - for (let i=0; i> 1), - F.mul( - x, - _eval(p, newX, offset+step , step << 1, n >> 1))); - return res; - } - } - - lagrange(points) { - let roots = [this.F.one]; - for (let i=0; i> 1; - const p1 = this._fft(pall, bits-1, offset, step*2); - const p2 = this._fft(pall, bits-1, offset+step, step*2); - - const out = new Array(n); - - let m= this.F.one; - for (let i=0; i0 && this.F.eq(p[i], this.F.zero) ) i--; - return p.slice(0, i+1); - } - - eq(a, b) { - const pa = this.reduce(a); - const pb = this.reduce(b); - - if (pa.length != pb.length) return false; - for (let i=0; i=0; i--) { - res[i] = this.F.add(this.F.mul(res[i+1], r), p[i+1]); - } - return res; - } - - _next2Power(v) { - v--; - v |= v >> 1; - v |= v >> 2; - v |= v >> 4; - v |= v >> 8; - v |= v >> 16; - v++; - return v; - } - - toString(p) { - const ap = this.normalize(p); - let S = ""; - for (let i=ap.length-1; i>=0; i--) { - if (!this.F.eq(p[i], this.F.zero)) { - if (S!="") S += " + "; - S = S + p[i].toString(10); - if (i>0) { - S = S + "x"; - if (i>1) { - S = S + "^" +i; - } - } - } - } - return S; - } - - normalize(p) { - const res = new Array(p.length); - for (let i=0; i - // rec = x^(k-2-scaleV)/ v - // - // res = x^m/v = x^(m + (2*k-2 - scaleV) - (2*k-2 - scaleV)) /v => - // res = rec * x^(m - (2*k-2 - scaleV)) => - // res = rec * x^(m - 2*k + 2 + scaleV) - - const rec = this._reciprocal(this.scaleX(v, scaleV), kbits); - const res = this.scaleX(rec, m - 2*k + 2 + scaleV); - - return res; - } - - div(_u, _v) { - if (_u.length < _v.length) return []; - const kbits = log2$2(_v.length-1)+1; - const k = 1 << kbits; - - const u = this.scaleX(_u, k-_v.length); - const v = this.scaleX(_v, k-_v.length); - - const n = v.length-1; - let m = u.length-1; - - const s = this._reciprocal(v, kbits); - let t; - if (m>2*n) { - t = this.sub(this.scaleX([this.F.one], 2*n), this.mul(s, v)); - } - - let q = []; - let rem = u; - let us, ut; - let finish = false; - - while (!finish) { - us = this.mul(rem, s); - q = this.add(q, this.scaleX(us, -2*n)); - - if ( m > 2*n ) { - ut = this.mul(rem, t); - rem = this.scaleX(ut, -2*n); - m = rem.length-1; - } else { - finish = true; - } - } - - return q; - } - - - // returns the ith nth-root of one - oneRoot(n, i) { - let nbits = log2$2(n-1)+1; - let res = this.F.one; - let r = i; - - if(i>=n) { - throw new Error("Given 'i' should be lower than 'n'"); - } - else if (1<0) { - if (r & 1 == 1) { - res = this.F.mul(res, this.w[nbits]); - } - r = r >> 1; - nbits --; - } - return res; - } - - computeVanishingPolinomial(bits, t) { - const m = 1 << bits; - return this.F.sub(this.F.pow(t, m), this.F.one); - } - - evaluateLagrangePolynomials(bits, t) { - const m= 1 << bits; - const tm = this.F.pow(t, m); - const u= new Array(m).fill(this.F.zero); - this._setRoots(bits); - const omega = this.w[bits]; - - if (this.F.eq(tm, this.F.one)) { - for (let i = 0; i < m; i++) { - if (this.F.eq(this.roots[bits][0],t)) { // i.e., t equals omega^i - u[i] = this.F.one; - return u; - } - } - } - - const z = this.F.sub(tm, this.F.one); - // let l = this.F.mul(z, this.F.pow(this.F.twoinv, m)); - let l = this.F.mul(z, this.F.inv(this.F.e(m))); - for (let i = 0; i < m; i++) { - u[i] = this.F.mul(l, this.F.inv(this.F.sub(t,this.roots[bits][i]))); - l = this.F.mul(l, omega); - } - - return u; - } - - log2(V) { - return log2$2(V); - } -} - -function log2$2( V ) -{ - return( ( ( V & 0xFFFF0000 ) !== 0 ? ( V &= 0xFFFF0000, 16 ) : 0 ) | ( ( V & 0xFF00FF00 ) !== 0 ? ( V &= 0xFF00FF00, 8 ) : 0 ) | ( ( V & 0xF0F0F0F0 ) !== 0 ? ( V &= 0xF0F0F0F0, 4 ) : 0 ) | ( ( V & 0xCCCCCCCC ) !== 0 ? ( V &= 0xCCCCCCCC, 2 ) : 0 ) | ( ( V & 0xAAAAAAAA ) !== 0 ) ); +var zero = e(0); +var one = e(1); +//#endregion +//#region src/polfield.js +var PolField = class { + constructor(F) { + this.F = F; + let rem = F.sqrt_t; + let s = F.sqrt_s; + const five = this.F.add(this.F.add(this.F.two, this.F.two), this.F.one); + this.w = new Array(s + 1); + this.wi = new Array(s + 1); + this.w[s] = this.F.pow(five, rem); + this.wi[s] = this.F.inv(this.w[s]); + let n = s - 1; + while (n >= 0) { + this.w[n] = this.F.square(this.w[n + 1]); + this.wi[n] = this.F.square(this.wi[n + 1]); + n--; + } + this.roots = []; + this._setRoots(15); + } + _setRoots(n) { + if (n > this.F.sqrt_s) n = this.s; + for (let i = n; i >= 0 && !this.roots[i]; i--) { + let r = this.F.one; + const nroots = 1 << i; + const rootsi = new Array(nroots); + for (let j = 0; j < nroots; j++) { + rootsi[j] = r; + r = this.F.mul(r, this.w[i]); + } + this.roots[i] = rootsi; + } + } + add(a, b) { + const m = Math.max(a.length, b.length); + const res = new Array(m); + for (let i = 0; i < m; i++) res[i] = this.F.add(a[i] || this.F.zero, b[i] || this.F.zero); + return this.reduce(res); + } + double(a) { + return this.add(a, a); + } + sub(a, b) { + const m = Math.max(a.length, b.length); + const res = new Array(m); + for (let i = 0; i < m; i++) res[i] = this.F.sub(a[i] || this.F.zero, b[i] || this.F.zero); + return this.reduce(res); + } + mulScalar(p, b) { + if (this.F.eq(b, this.F.zero)) return []; + if (this.F.eq(b, this.F.one)) return p; + const res = new Array(p.length); + for (let i = 0; i < p.length; i++) res[i] = this.F.mul(p[i], b); + return res; + } + mul(a, b) { + if (a.length == 0) return []; + if (b.length == 0) return []; + if (a.length == 1) return this.mulScalar(b, a[0]); + if (b.length == 1) return this.mulScalar(a, b[0]); + if (b.length > a.length) [b, a] = [a, b]; + if (b.length <= 2 || b.length < log2$2(a.length)) return this.mulNormal(a, b); + else return this.mulFFT(a, b); + } + mulNormal(a, b) { + let res = []; + for (let i = 0; i < b.length; i++) res = this.add(res, this.scaleX(this.mulScalar(a, b[i]), i)); + return res; + } + mulFFT(a, b) { + const bitsResult = log2$2(Math.max(a.length, b.length) - 1) + 2; + this._setRoots(bitsResult); + const m = 1 << bitsResult; + const ea = this.extend(a, m); + const eb = this.extend(b, m); + const ta = __fft$1(this, ea, bitsResult, 0, 1, false); + const tb = __fft$1(this, eb, bitsResult, 0, 1, false); + const tres = new Array(m); + for (let i = 0; i < m; i++) tres[i] = this.F.mul(ta[i], tb[i]); + const res = __fft$1(this, tres, bitsResult, 0, 1, true); + const twoinvm = this.F.inv(this.F.mulScalar(this.F.one, m)); + const resn = new Array(m); + for (let i = 0; i < m; i++) resn[i] = this.F.mul(res[(m - i) % m], twoinvm); + return this.reduce(resn); + } + square(a) { + return this.mul(a, a); + } + scaleX(p, n) { + if (n == 0) return p; + else if (n > 0) return new Array(n).fill(this.F.zero).concat(p); + else { + if (-n >= p.length) return []; + return p.slice(-n); + } + } + eval2(p, x) { + let v = this.F.zero; + let ix = this.F.one; + for (let i = 0; i < p.length; i++) { + v = this.F.add(v, this.F.mul(p[i], ix)); + ix = this.F.mul(ix, x); + } + return v; + } + evaluate(p, x) { + const F = this.F; + if (p.length == 0) return F.zero; + const m = this._next2Power(p.length); + return _eval(this.extend(p, m), x, 0, 1, m); + function _eval(p, x, offset, step, n) { + if (n == 1) return p[offset]; + const newX = F.square(x); + return F.add(_eval(p, newX, offset, step << 1, n >> 1), F.mul(x, _eval(p, newX, offset + step, step << 1, n >> 1))); + } + } + lagrange(points) { + let roots = [this.F.one]; + for (let i = 0; i < points.length; i++) roots = this.mul(roots, [this.F.neg(points[i][0]), this.F.one]); + let sum = []; + for (let i = 0; i < points.length; i++) { + let mpol = this.ruffini(roots, points[i][0]); + const factor = this.F.mul(this.F.inv(this.evaluate(mpol, points[i][0])), points[i][1]); + mpol = this.mulScalar(mpol, factor); + sum = this.add(sum, mpol); + } + return sum; + } + fft(p) { + if (p.length <= 1) return p; + const bits = log2$2(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + const ep = this.extend(p, m); + return __fft$1(this, ep, bits, 0, 1); + } + fft2(p) { + if (p.length <= 1) return p; + const bits = log2$2(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + const ep = this.extend(p, m); + __bitReverse(ep, bits); + return __fft2(this, ep, bits); + } + ifft(p) { + if (p.length <= 1) return p; + const bits = log2$2(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + const ep = this.extend(p, m); + const res = __fft$1(this, ep, bits, 0, 1); + const twoinvm = this.F.inv(this.F.mulScalar(this.F.one, m)); + const resn = new Array(m); + for (let i = 0; i < m; i++) resn[i] = this.F.mul(res[(m - i) % m], twoinvm); + return resn; + } + ifft2(p) { + if (p.length <= 1) return p; + const bits = log2$2(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + const ep = this.extend(p, m); + __bitReverse(ep, bits); + const res = __fft2(this, ep, bits, 0, 1); + const twoinvm = this.F.inv(this.F.mulScalar(this.F.one, m)); + const resn = new Array(m); + for (let i = 0; i < m; i++) resn[i] = this.F.mul(res[(m - i) % m], twoinvm); + return resn; + } + _fft(pall, bits, offset, step) { + const n = 1 << bits; + if (n == 1) return [pall[offset]]; + const ndiv2 = n >> 1; + const p1 = this._fft(pall, bits - 1, offset, step * 2); + const p2 = this._fft(pall, bits - 1, offset + step, step * 2); + const out = new Array(n); + let m = this.F.one; + for (let i = 0; i < ndiv2; i++) { + out[i] = this.F.add(p1[i], this.F.mul(m, p2[i])); + out[i + ndiv2] = this.F.sub(p1[i], this.F.mul(m, p2[i])); + m = this.F.mul(m, this.w[bits]); + } + return out; + } + extend(p, e) { + if (e == p.length) return p; + const z = new Array(e - p.length).fill(this.F.zero); + return p.concat(z); + } + reduce(p) { + if (p.length == 0) return p; + if (!this.F.eq(p[p.length - 1], this.F.zero)) return p; + let i = p.length - 1; + while (i > 0 && this.F.eq(p[i], this.F.zero)) i--; + return p.slice(0, i + 1); + } + eq(a, b) { + const pa = this.reduce(a); + const pb = this.reduce(b); + if (pa.length != pb.length) return false; + for (let i = 0; i < pb.length; i++) if (!this.F.eq(pa[i], pb[i])) return false; + return true; + } + ruffini(p, r) { + const res = new Array(p.length - 1); + res[res.length - 1] = p[p.length - 1]; + for (let i = res.length - 2; i >= 0; i--) res[i] = this.F.add(this.F.mul(res[i + 1], r), p[i + 1]); + return res; + } + _next2Power(v) { + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; + } + toString(p) { + const ap = this.normalize(p); + let S = ""; + for (let i = ap.length - 1; i >= 0; i--) if (!this.F.eq(p[i], this.F.zero)) { + if (S != "") S += " + "; + S = S + p[i].toString(10); + if (i > 0) { + S = S + "x"; + if (i > 1) S = S + "^" + i; + } + } + return S; + } + normalize(p) { + const res = new Array(p.length); + for (let i = 0; i < p.length; i++) res[i] = this.F.normalize(p[i]); + return res; + } + _reciprocal(p, bits) { + const k = 1 << bits; + if (k == 1) return [this.F.inv(p[0])]; + const np = this.scaleX(p, -k / 2); + const q = this._reciprocal(np, bits - 1); + const a = this.scaleX(this.double(q), 3 * k / 2 - 2); + const b = this.mul(this.square(q), p); + return this.scaleX(this.sub(a, b), -(k - 2)); + } + _div2(m, v) { + const kbits = log2$2(v.length - 1) + 1; + const k = 1 << kbits; + const scaleV = k - v.length; + const rec = this._reciprocal(this.scaleX(v, scaleV), kbits); + return this.scaleX(rec, m - 2 * k + 2 + scaleV); + } + div(_u, _v) { + if (_u.length < _v.length) return []; + const kbits = log2$2(_v.length - 1) + 1; + const k = 1 << kbits; + const u = this.scaleX(_u, k - _v.length); + const v = this.scaleX(_v, k - _v.length); + const n = v.length - 1; + let m = u.length - 1; + const s = this._reciprocal(v, kbits); + let t; + if (m > 2 * n) t = this.sub(this.scaleX([this.F.one], 2 * n), this.mul(s, v)); + let q = []; + let rem = u; + let us, ut; + let finish = false; + while (!finish) { + us = this.mul(rem, s); + q = this.add(q, this.scaleX(us, -2 * n)); + if (m > 2 * n) { + ut = this.mul(rem, t); + rem = this.scaleX(ut, -2 * n); + m = rem.length - 1; + } else finish = true; + } + return q; + } + oneRoot(n, i) { + let nbits = log2$2(n - 1) + 1; + let res = this.F.one; + let r = i; + if (i >= n) throw new Error("Given 'i' should be lower than 'n'"); + else if (1 << nbits !== n) throw new Error(`Internal errlr: ${n} should equal ${1 << nbits}`); + while (r > 0) { + if (r & true) res = this.F.mul(res, this.w[nbits]); + r = r >> 1; + nbits--; + } + return res; + } + computeVanishingPolinomial(bits, t) { + const m = 1 << bits; + return this.F.sub(this.F.pow(t, m), this.F.one); + } + evaluateLagrangePolynomials(bits, t) { + const m = 1 << bits; + const tm = this.F.pow(t, m); + const u = new Array(m).fill(this.F.zero); + this._setRoots(bits); + const omega = this.w[bits]; + if (this.F.eq(tm, this.F.one)) { + for (let i = 0; i < m; i++) if (this.F.eq(this.roots[bits][0], t)) { + u[i] = this.F.one; + return u; + } + } + const z = this.F.sub(tm, this.F.one); + let l = this.F.mul(z, this.F.inv(this.F.e(m))); + for (let i = 0; i < m; i++) { + u[i] = this.F.mul(l, this.F.inv(this.F.sub(t, this.roots[bits][i]))); + l = this.F.mul(l, omega); + } + return u; + } + log2(V) { + return log2$2(V); + } +}; +function log2$2(V) { + return ((V & 4294901760) !== 0 ? (V &= 4294901760, 16) : 0) | ((V & 4278255360) !== 0 ? (V &= 4278255360, 8) : 0) | ((V & 4042322160) !== 0 ? (V &= 4042322160, 4) : 0) | ((V & 3435973836) !== 0 ? (V &= 3435973836, 2) : 0) | (V & 2863311530) !== 0; } - - function __fft$1(PF, pall, bits, offset, step) { - - const n = 1 << bits; - if (n==1) { - return [ pall[offset] ]; - } else if (n==2) { - return [ - PF.F.add(pall[offset], pall[offset + step]), - PF.F.sub(pall[offset], pall[offset + step])]; - } - - const ndiv2 = n >> 1; - const p1 = __fft$1(PF, pall, bits-1, offset, step*2); - const p2 = __fft$1(PF, pall, bits-1, offset+step, step*2); - - const out = new Array(n); - - for (let i=0; i> 1; + const p1 = __fft$1(PF, pall, bits - 1, offset, step * 2); + const p2 = __fft$1(PF, pall, bits - 1, offset + step, step * 2); + const out = new Array(n); + for (let i = 0; i < ndiv2; i++) { + out[i] = PF.F.add(p1[i], PF.F.mul(PF.roots[bits][i], p2[i])); + out[i + ndiv2] = PF.F.sub(p1[i], PF.F.mul(PF.roots[bits][i], p2[i])); + } + return out; } - - function __fft2(PF, pall, bits) { - - const n = 1 << bits; - if (n==1) { - return [ pall[0] ]; - } - - const ndiv2 = n >> 1; - const p1 = __fft2(PF, pall.slice(0, ndiv2), bits-1); - const p2 = __fft2(PF, pall.slice(ndiv2), bits-1); - - const out = new Array(n); - - for (let i=0; i> 1; + const p1 = __fft2(PF, pall.slice(0, ndiv2), bits - 1); + const p2 = __fft2(PF, pall.slice(ndiv2), bits - 1); + const out = new Array(n); + for (let i = 0; i < ndiv2; i++) { + out[i] = PF.F.add(p1[i], PF.F.mul(PF.roots[bits][i], p2[i])); + out[i + ndiv2] = PF.F.sub(p1[i], PF.F.mul(PF.roots[bits][i], p2[i])); + } + return out; } - -const _revTable$1 = []; -for (let i=0; i<256; i++) { - _revTable$1[i] = _revSlow$1(i, 8); -} - +var _revTable$1 = []; +for (let i = 0; i < 256; i++) _revTable$1[i] = _revSlow$1(i, 8); function _revSlow$1(idx, bits) { - let res =0; - let a = idx; - for (let i=0; i>=1; - } - return res; + let res = 0; + let a = idx; + for (let i = 0; i < bits; i++) { + res <<= 1; + res = res | a & 1; + a >>= 1; + } + return res; } - function rev(idx, bits) { - return ( - _revTable$1[idx >>> 24] | - (_revTable$1[(idx >>> 16) & 0xFF] << 8) | - (_revTable$1[(idx >>> 8) & 0xFF] << 16) | - (_revTable$1[idx & 0xFF] << 24) - ) >>> (32-bits); + return (_revTable$1[idx >>> 24] | _revTable$1[idx >>> 16 & 255] << 8 | _revTable$1[idx >>> 8 & 255] << 16 | _revTable$1[idx & 255] << 24) >>> 32 - bits; } - function __bitReverse(p, bits) { - for (let k=0; kk) { - const tmp= p[k]; - p[k] = p[r]; - p[r] = tmp; - } - } - + for (let k = 0; k < p.length; k++) { + const r = rev(k, bits); + if (r > k) { + const tmp = p[k]; + p[k] = p[r]; + p[r] = tmp; + } + } } - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - - - +//#endregion +//#region src/futils.js function mulScalar(F, base, e) { - let res; - - if (isZero(e)) return F.zero; - - const n = naf(e); - - if (n[n.length-1] == 1) { - res = base; - } else if (n[n.length-1] == -1) { - res = F.neg(base); - } else { - throw new Error("invlaud NAF"); - } - - for (let i=n.length-2; i>=0; i--) { - - res = F.double(res); - - if (n[i] == 1) { - res = F.add(res, base); - } else if (n[i] == -1) { - res = F.sub(res, base); - } - } - - return res; + let res; + if (isZero(e)) return F.zero; + const n = naf(e); + if (n[n.length - 1] == 1) res = base; + else if (n[n.length - 1] == -1) res = F.neg(base); + else throw new Error("invlaud NAF"); + for (let i = n.length - 2; i >= 0; i--) { + res = F.double(res); + if (n[i] == 1) res = F.add(res, base); + else if (n[i] == -1) res = F.sub(res, base); + } + return res; } - - -/* -exports.mulScalar = (F, base, e) =>{ - let res = F.zero; - let rem = bigInt(e); - let exp = base; - - while (! rem.eq(bigInt.zero)) { - if (rem.and(bigInt.one).eq(bigInt.one)) { - res = F.add(res, exp); - } - exp = F.double(exp); - rem = rem.shiftRight(1); - } - - return res; -}; -*/ - - function exp(F, base, e) { - - if (isZero(e)) return F.one; - - const n = bits(e); - - if (n.length==0) return F.one; - - let res = base; - - for (let i=n.length-2; i>=0; i--) { - - res = F.square(res); - - if (n[i]) { - res = F.mul(res, base); - } - } - - return res; + if (isZero(e)) return F.one; + const n = bits(e); + if (n.length == 0) return F.one; + let res = base; + for (let i = n.length - 2; i >= 0; i--) { + res = F.square(res); + if (n[i]) res = F.mul(res, base); + } + return res; } - -// Check here: https://eprint.iacr.org/2012/685.pdf - -function buildSqrt (F) { - if ((F.m % 2) == 1) { - if (eq(mod(F.p, 4), 1 )) { - if (eq(mod(F.p, 8), 1 )) { - if (eq(mod(F.p, 16), 1 )) { - // alg7_muller(F); - alg5_tonelliShanks(F); - } else if (eq(mod(F.p, 16), 9 )) { - alg4_kong(F); - } else { - throw new Error("Field withot sqrt"); - } - } else if (eq(mod(F.p, 8), 5 )) { - alg3_atkin(F); - } else { - throw new Error("Field withot sqrt"); - } - } else if (eq(mod(F.p, 4), 3 )) { - alg2_shanks(F); - } - } else { - const pm2mod4 = mod(pow(F.p, F.m/2), 4); - if (pm2mod4 == 1) { - alg10_adj(F); - } else if (pm2mod4 == 3) { - alg9_adj(F); - } else { - alg8_complex(F); - } - - } +//#endregion +//#region src/fsqrt.js +function buildSqrt(F) { + if (F.m % 2 == 1) { + if (eq(mod(F.p, 4), 1)) if (eq(mod(F.p, 8), 1)) if (eq(mod(F.p, 16), 1)) alg5_tonelliShanks(F); + else if (eq(mod(F.p, 16), 9)) alg4_kong(F); + else throw new Error("Field withot sqrt"); + else if (eq(mod(F.p, 8), 5)) alg3_atkin(F); + else throw new Error("Field withot sqrt"); + else if (eq(mod(F.p, 4), 3)) alg2_shanks(F); + } else { + const pm2mod4 = mod(pow(F.p, F.m / 2), 4); + if (pm2mod4 == 1) alg10_adj(F); + else if (pm2mod4 == 3) alg9_adj(F); + else alg8_complex(F); + } } - - function alg5_tonelliShanks(F) { - F.sqrt_q = pow(F.p, F.m); - - F.sqrt_s = 0; - F.sqrt_t = sub(F.sqrt_q, 1); - - while (!isOdd(F.sqrt_t)) { - F.sqrt_s = F.sqrt_s + 1; - F.sqrt_t = div(F.sqrt_t, 2); - } - - let c0 = F.one; - - while (F.eq(c0, F.one)) { - const c = F.random(); - F.sqrt_z = F.pow(c, F.sqrt_t); - c0 = F.pow(F.sqrt_z, 2 ** (F.sqrt_s-1) ); - } - - F.sqrt_tm1d2 = div(sub(F.sqrt_t, 1),2); - - F.sqrt = function(a) { - const F=this; - if (F.isZero(a)) return F.zero; - let w = F.pow(a, F.sqrt_tm1d2); - const a0 = F.pow( F.mul(F.square(w), a), 2 ** (F.sqrt_s-1) ); - if (F.eq(a0, F.negone)) return null; - - let v = F.sqrt_s; - let x = F.mul(a, w); - let b = F.mul(x, w); - let z = F.sqrt_z; - while (!F.eq(b, F.one)) { - let b2k = F.square(b); - let k=1; - while (!F.eq(b2k, F.one)) { - b2k = F.square(b2k); - k++; - } - - w = z; - for (let i=0; i>> 0; - st[d] = (st[d] ^ st[a]) >>> 0; - st[d] = ((st[d] << 16) | ((st[d]>>>16) & 0xFFFF)) >>> 0; - - st[c] = (st[c] + st[d]) >>> 0; - st[b] = (st[b] ^ st[c]) >>> 0; - st[b] = ((st[b] << 12) | ((st[b]>>>20) & 0xFFF)) >>> 0; - - st[a] = (st[a] + st[b]) >>> 0; - st[d] = (st[d] ^ st[a]) >>> 0; - st[d] = ((st[d] << 8) | ((st[d]>>>24) & 0xFF)) >>> 0; - - st[c] = (st[c] + st[d]) >>> 0; - st[b] = (st[b] ^ st[c]) >>> 0; - st[b] = ((st[b] << 7) | ((st[b]>>>25) & 0x7F)) >>> 0; + st[a] = st[a] + st[b] >>> 0; + st[d] = (st[d] ^ st[a]) >>> 0; + st[d] = (st[d] << 16 | st[d] >>> 16 & 65535) >>> 0; + st[c] = st[c] + st[d] >>> 0; + st[b] = (st[b] ^ st[c]) >>> 0; + st[b] = (st[b] << 12 | st[b] >>> 20 & 4095) >>> 0; + st[a] = st[a] + st[b] >>> 0; + st[d] = (st[d] ^ st[a]) >>> 0; + st[d] = (st[d] << 8 | st[d] >>> 24 & 255) >>> 0; + st[c] = st[c] + st[d] >>> 0; + st[b] = (st[b] ^ st[c]) >>> 0; + st[b] = (st[b] << 7 | st[b] >>> 25 & 127) >>> 0; } - function doubleRound(st) { - quarterRound(st, 0, 4, 8,12); - quarterRound(st, 1, 5, 9,13); - quarterRound(st, 2, 6,10,14); - quarterRound(st, 3, 7,11,15); - - quarterRound(st, 0, 5,10,15); - quarterRound(st, 1, 6,11,12); - quarterRound(st, 2, 7, 8,13); - quarterRound(st, 3, 4, 9,14); + quarterRound(st, 0, 4, 8, 12); + quarterRound(st, 1, 5, 9, 13); + quarterRound(st, 2, 6, 10, 14); + quarterRound(st, 3, 7, 11, 15); + quarterRound(st, 0, 5, 10, 15); + quarterRound(st, 1, 6, 11, 12); + quarterRound(st, 2, 7, 8, 13); + quarterRound(st, 3, 4, 9, 14); } - -class ChaCha { - - constructor(seed) { - seed = seed || [0,0,0,0,0,0,0,0]; - this.state = [ - 0x61707865, - 0x3320646E, - 0x79622D32, - 0x6B206574, - seed[0], - seed[1], - seed[2], - seed[3], - seed[4], - seed[5], - seed[6], - seed[7], - 0, - 0, - 0, - 0 - ]; - this.idx = 16; - this.buff = new Array(16); - } - - nextU32() { - if (this.idx == 16) this.update(); - return this.buff[this.idx++]; - } - - nextU64() { - return add(mul(this.nextU32(), 0x100000000), this.nextU32()); - } - - nextBool() { - return (this.nextU32() & 1) == 1; - } - - update() { - // Copy the state - for (let i=0; i<16; i++) this.buff[i] = this.state[i]; - - // Apply the rounds - for (let i=0; i<10; i++) doubleRound(this.buff); - - // Add to the initial - for (let i=0; i<16; i++) this.buff[i] = (this.buff[i] + this.state[i]) >>> 0; - - this.idx = 0; - - this.state[12] = (this.state[12] + 1) >>> 0; - if (this.state[12] != 0) return; - this.state[13] = (this.state[13] + 1) >>> 0; - if (this.state[13] != 0) return; - this.state[14] = (this.state[14] + 1) >>> 0; - if (this.state[14] != 0) return; - this.state[15] = (this.state[15] + 1) >>> 0; - } -} - +var ChaCha = class { + constructor(seed) { + seed = seed || [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + this.state = [ + 1634760805, + 857760878, + 2036477234, + 1797285236, + seed[0], + seed[1], + seed[2], + seed[3], + seed[4], + seed[5], + seed[6], + seed[7], + 0, + 0, + 0, + 0 + ]; + this.idx = 16; + this.buff = new Array(16); + } + nextU32() { + if (this.idx == 16) this.update(); + return this.buff[this.idx++]; + } + nextU64() { + return add(mul(this.nextU32(), 4294967296), this.nextU32()); + } + nextBool() { + return (this.nextU32() & 1) == 1; + } + update() { + for (let i = 0; i < 16; i++) this.buff[i] = this.state[i]; + for (let i = 0; i < 10; i++) doubleRound(this.buff); + for (let i = 0; i < 16; i++) this.buff[i] = this.buff[i] + this.state[i] >>> 0; + this.idx = 0; + this.state[12] = this.state[12] + 1 >>> 0; + if (this.state[12] != 0) return; + this.state[13] = this.state[13] + 1 >>> 0; + if (this.state[13] != 0) return; + this.state[14] = this.state[14] + 1 >>> 0; + if (this.state[14] != 0) return; + this.state[15] = this.state[15] + 1 >>> 0; + } +}; +//#endregion +//#region src/random.js function getRandomBytes(n) { - let array = new Uint8Array(n); - if (process.browser) { // Browser - if (typeof globalThis.crypto !== "undefined") { // Supported - globalThis.crypto.getRandomValues(array); - } else { // fallback - for (let i=0; i>>0; - } - } - } - else { // NodeJS - crypto.randomFillSync(array); - } - return array; + let array = new Uint8Array(n); + if (typeof globalThis.crypto !== "undefined") globalThis.crypto.getRandomValues(array); + else if (typeof require === "function") require("crypto").randomFillSync(array); + else throw new Error("No cryptographically secure random source available."); + return array; } - function getRandomSeed() { - const arr = getRandomBytes(32); - const arrV = new Uint32Array(arr.buffer); - const seed = []; - for (let i=0; i<8; i++) { - seed.push(arrV[i]); - } - return seed; + const arr = getRandomBytes(32); + const arrV = new Uint32Array(arr.buffer); + const seed = []; + for (let i = 0; i < 8; i++) seed.push(arrV[i]); + return seed; } - -let threadRng = null; - +var threadRng = null; function getThreadRng() { - if (threadRng) return threadRng; - threadRng = new ChaCha(getRandomSeed()); - return threadRng; + if (threadRng) return threadRng; + threadRng = new ChaCha(getRandomSeed()); + return threadRng; } - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - -/* - This library does operations on polynomials with coefficients in a field F. - - A polynomial P(x) = p0 + p1 * x + p2 * x^2 + ... + pn * x^n is represented - by the array [ p0, p1, p2, ... , pn ]. - */ - -class FFT { - constructor (G, F, opMulGF) { - this.F = F; - this.G = G; - this.opMulGF = opMulGF; - - let rem = F.sqrt_t || F.t; - let s = F.sqrt_s || F.s; - - let nqr = F.one; - while (F.eq(F.pow(nqr, F.half), F.one)) nqr = F.add(nqr, F.one); - - this.w = new Array(s+1); - this.wi = new Array(s+1); - this.w[s] = this.F.pow(nqr, rem); - this.wi[s] = this.F.inv(this.w[s]); - - let n=s-1; - while (n>=0) { - this.w[n] = this.F.square(this.w[n+1]); - this.wi[n] = this.F.square(this.wi[n+1]); - n--; - } - - - this.roots = []; - /* - for (let i=0; i<16; i++) { - let r = this.F.one; - n = 1 << i; - const rootsi = new Array(n); - for (let j=0; j=0) && (!this.roots[i]); i--) { - let r = this.F.one; - const nroots = 1 << i; - const rootsi = new Array(nroots); - for (let j=0; j= 0) { + this.w[n] = this.F.square(this.w[n + 1]); + this.wi[n] = this.F.square(this.wi[n + 1]); + n--; + } + this.roots = []; + this._setRoots(Math.min(s, 15)); + } + _setRoots(n) { + for (let i = n; i >= 0 && !this.roots[i]; i--) { + let r = this.F.one; + const nroots = 1 << i; + const rootsi = new Array(nroots); + for (let j = 0; j < nroots; j++) { + rootsi[j] = r; + r = this.F.mul(r, this.w[i]); + } + this.roots[i] = rootsi; + } + } + fft(p) { + if (p.length <= 1) return p; + const bits = log2$1(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + if (p.length != m) throw new Error("Size must be multiple of 2"); + return __fft(this, p, bits, 0, 1); + } + ifft(p) { + if (p.length <= 1) return p; + const bits = log2$1(p.length - 1) + 1; + this._setRoots(bits); + const m = 1 << bits; + if (p.length != m) throw new Error("Size must be multiple of 2"); + const res = __fft(this, p, bits, 0, 1); + const twoinvm = this.F.inv(this.F.mulScalar(this.F.one, m)); + const resn = new Array(m); + for (let i = 0; i < m; i++) resn[i] = this.opMulGF(res[(m - i) % m], twoinvm); + return resn; + } +}; +function log2$1(V) { + return ((V & 4294901760) !== 0 ? (V &= 4294901760, 16) : 0) | ((V & 4278255360) !== 0 ? (V &= 4278255360, 8) : 0) | ((V & 4042322160) !== 0 ? (V &= 4042322160, 4) : 0) | ((V & 3435973836) !== 0 ? (V &= 3435973836, 2) : 0) | (V & 2863311530) !== 0; } - - function __fft(PF, pall, bits, offset, step) { - - const n = 1 << bits; - if (n==1) { - return [ pall[offset] ]; - } else if (n==2) { - return [ - PF.G.add(pall[offset], pall[offset + step]), - PF.G.sub(pall[offset], pall[offset + step])]; - } - - const ndiv2 = n >> 1; - const p1 = __fft(PF, pall, bits-1, offset, step*2); - const p2 = __fft(PF, pall, bits-1, offset+step, step*2); - - const out = new Array(n); - - for (let i=0; i> this.one; - this.bitLength = bitLength(this.p); - this.mask = (this.one << BigInt(this.bitLength)) - this.one; - - this.n64 = Math.floor((this.bitLength - 1) / 64)+1; - this.n32 = this.n64*2; - this.n8 = this.n64*8; - this.R = this.e(this.one << BigInt(this.n64*64)); - this.Ri = this.inv(this.R); - - const e = this.negone >> this.one; - this.nqr = this.two; - let r = this.pow(this.nqr, e); - while (!this.eq(r, this.negone)) { - this.nqr = this.nqr + this.one; - r = this.pow(this.nqr, e); - } - - - this.s = 0; - this.t = this.negone; - - while ((this.t & this.one) == this.zero) { - this.s = this.s + 1; - this.t = this.t >> this.one; - } - - this.nqr_to_t = this.pow(this.nqr, this.t); - - buildSqrt(this); - - this.FFT = new FFT(this, this, this.mul.bind(this)); - - this.fft = this.FFT.fft.bind(this.FFT); - this.ifft = this.FFT.ifft.bind(this.FFT); - this.w = this.FFT.w; - this.wi = this.FFT.wi; - - this.shift = this.square(this.nqr); - this.k = this.exp(this.nqr, 2**this.s); - } - - e(a,b) { - let res; - if (!b) { - res = BigInt(a); - } else if (b==16) { - res = BigInt("0x"+a); - } - if (res < 0) { - let nres = -res; - if (nres >= this.p) nres = nres % this.p; - return this.p - nres; - } else { - return (res>= this.p) ? res%this.p : res; - } - - } - - add(a, b) { - const res = a + b; - return res >= this.p ? res-this.p : res; - } - - sub(a, b) { - return (a >= b) ? a-b : this.p-b+a; - } - - neg(a) { - return a ? this.p-a : a; - } - - mul(a, b) { - return (a*b)%this.p; - } - - mulScalar(base, s) { - return (base * this.e(s)) % this.p; - } - - square(a) { - return (a*a) % this.p; - } - - eq(a, b) { - return a==b; - } - - neq(a, b) { - return a!=b; - } - - lt(a, b) { - const aa = (a > this.half) ? a - this.p : a; - const bb = (b > this.half) ? b - this.p : b; - return aa < bb; - } - - gt(a, b) { - const aa = (a > this.half) ? a - this.p : a; - const bb = (b > this.half) ? b - this.p : b; - return aa > bb; - } - - leq(a, b) { - const aa = (a > this.half) ? a - this.p : a; - const bb = (b > this.half) ? b - this.p : b; - return aa <= bb; - } - - geq(a, b) { - const aa = (a > this.half) ? a - this.p : a; - const bb = (b > this.half) ? b - this.p : b; - return aa >= bb; - } - - div(a, b) { - return this.mul(a, this.inv(b)); - } - - idiv(a, b) { - if (!b) throw new Error("Division by zero"); - return a / b; - } - - inv(a) { - if (!a) throw new Error("Division by zero"); - - let t = this.zero; - let r = this.p; - let newt = this.one; - let newr = a % this.p; - while (newr) { - let q = r/newr; - [t, newt] = [newt, t-q*newt]; - [r, newr] = [newr, r-q*newr]; - } - if (t= this.p ? res-this.p : res; - } - - bor(a, b) { - const res = ((a | b) & this.mask); - return res >= this.p ? res-this.p : res; - } - - bxor(a, b) { - const res = ((a ^ b) & this.mask); - return res >= this.p ? res-this.p : res; - } - - bnot(a) { - const res = a ^ this.mask; - return res >= this.p ? res-this.p : res; - } - - shl(a, b) { - if (Number(b) < this.bitLength) { - const res = (a << b) & this.mask; - return res >= this.p ? res-this.p : res; - } else { - const nb = this.p - b; - if (Number(nb) < this.bitLength) { - return a >> nb; - } else { - return this.zero; - } - } - } - - shr(a, b) { - if (Number(b) < this.bitLength) { - return a >> b; - } else { - const nb = this.p - b; - if (Number(nb) < this.bitLength) { - const res = (a << nb) & this.mask; - return res >= this.p ? res-this.p : res; - } else { - return 0; - } - } - } - - land(a, b) { - return (a && b) ? this.one : this.zero; - } - - lor(a, b) { - return (a || b) ? this.one : this.zero; - } - - lnot(a) { - return (a) ? this.zero : this.one; - } - - sqrt_old(n) { - - if (n == this.zero) return this.zero; - - // Test that have solution - const res = this.pow(n, this.negone >> this.one); - if ( res != this.one ) return null; - - let m = this.s; - let c = this.nqr_to_t; - let t = this.pow(n, this.t); - let r = this.pow(n, this.add(this.t, this.one) >> this.one ); - - while ( t != this.one ) { - let sq = this.square(t); - let i = 1; - while (sq != this.one ) { - i++; - sq = this.square(sq); - } - - // b = c ^ m-i-1 - let b = c; - for (let j=0; j< m-i-1; j ++) b = this.square(b); - - m = i; - c = this.square(b); - t = this.mul(t, c); - r = this.mul(r, b); - } - - if (r > (this.p >> this.one)) { - r = this.neg(r); - } - - return r; - } - - normalize(a, b) { - a = BigInt(a,b); - if (a < 0) { - let na = -a; - if (na >= this.p) na = na % this.p; - return this.p - na; - } else { - return (a>= this.p) ? a%this.p : a; - } - } - - random() { - const nBytes = (this.bitLength*2 / 8); - let res =this.zero; - for (let i=0; i this.half)&&(base == 10)) { - const v = this.p-a; - vs = "-"+v.toString(base); - } else { - vs = a.toString(base); - } - return vs; - } - - isZero(a) { - return a == this.zero; - } - - fromRng(rng) { - let v; - do { - v=this.zero; - for (let i=0; i= this.p); - v = (v * this.Ri) % this.p; // Convert from montgomery - return v; - } - - fft(a) { - return this.FFT.fft(a); - } - - ifft(a) { - return this.FFT.ifft(a); - } - - // Returns a buffer with Little Endian Representation - toRprLE(buff, o, e) { - toRprLE(buff, o, e, this.n64*8); - } - - // Returns a buffer with Big Endian Representation - toRprBE(buff, o, e) { - toRprBE(buff, o, e, this.n64*8); - } - - // Returns a buffer with Big Endian Montgomery Representation - toRprBEM(buff, o, e) { - return this.toRprBE(buff, o, this.mul(this.R, e)); - } - - toRprLEM(buff, o, e) { - return this.toRprLE(buff, o, this.mul(this.R, e)); - } - - - // Pases a buffer with Little Endian Representation - fromRprLE(buff, o) { - return fromRprLE(buff, o, this.n8); - } - - // Pases a buffer with Big Endian Representation - fromRprBE(buff, o) { - return fromRprBE(buff, o, this.n8); - } - - fromRprLEM(buff, o) { - return this.mul(this.fromRprLE(buff, o), this.Ri); - } - - fromRprBEM(buff, o) { - return this.mul(this.fromRprBE(buff, o), this.Ri); - } - - toObject(a) { - return a; - } -} - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - - -class F2Field { - constructor(F, nonResidue) { - this.type="F2"; - this.F = F; - this.zero = [this.F.zero, this.F.zero]; - this.one = [this.F.one, this.F.zero]; - this.negone = this.neg(this.one); - this.nonResidue = nonResidue; - this.m = F.m*2; - this.p = F.p; - this.n64 = F.n64*2; - this.n32 = this.n64*2; - this.n8 = this.n64*8; - - buildSqrt(this); - } - - _mulByNonResidue(a) { - return this.F.mul(this.nonResidue, a); - } - - copy(a) { - return [this.F.copy(a[0]), this.F.copy(a[1])]; - } - - add(a, b) { - return [ - this.F.add(a[0], b[0]), - this.F.add(a[1], b[1]) - ]; - } - - double(a) { - return this.add(a,a); - } - - sub(a, b) { - return [ - this.F.sub(a[0], b[0]), - this.F.sub(a[1], b[1]) - ]; - } - - neg(a) { - return this.sub(this.zero, a); - } - - conjugate(a) { - return [ - a[0], - this.F.neg(a[1]) - ]; - } - - mul(a, b) { - const aA = this.F.mul(a[0] , b[0]); - const bB = this.F.mul(a[1] , b[1]); - - return [ - this.F.add( aA , this._mulByNonResidue(bB)), - this.F.sub( - this.F.mul( - this.F.add(a[0], a[1]), - this.F.add(b[0], b[1])), - this.F.add(aA, bB))]; - } - - inv(a) { - const t0 = this.F.square(a[0]); - const t1 = this.F.square(a[1]); - const t2 = this.F.sub(t0, this._mulByNonResidue(t1)); - const t3 = this.F.inv(t2); - return [ - this.F.mul(a[0], t3), - this.F.neg(this.F.mul( a[1], t3)) ]; - } - - div(a, b) { - return this.mul(a, this.inv(b)); - } - - square(a) { - const ab = this.F.mul(a[0] , a[1]); - - /* - [ - (a + b) * (a + non_residue * b) - ab - non_residue * ab, - ab + ab - ]; - */ - - return [ - this.F.sub( - this.F.mul( - this.F.add(a[0], a[1]) , - this.F.add( - a[0] , - this._mulByNonResidue(a[1]))), - this.F.add( - ab, - this._mulByNonResidue(ab))), - this.F.add(ab, ab) - ]; - } - - isZero(a) { - return this.F.isZero(a[0]) && this.F.isZero(a[1]); - } - - eq(a, b) { - return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]); - } - - mulScalar(base, e) { - return mulScalar(this, base, e); - } - - pow(base, e) { - return exp(this, base, e); - } - - exp(base, e) { - return exp(this, base, e); - } - - toString(a) { - return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])} ]`; - } - - fromRng(rng) { - const c0 = this.F.fromRng(rng); - const c1 = this.F.fromRng(rng); - return [c0, c1]; - } - - gt(a, b) { - if (this.F.gt(a[0], b[0])) return true; - if (this.F.gt(b[0], a[0])) return false; - if (this.F.gt(a[1], b[1])) return true; - return false; - } - - geq(a, b) { - return this.gt(a, b) || this.eq(a, b); - } - - lt(a, b) { - return !this.geq(a,b); - } - - leq(a, b) { - return !this.gt(a,b); - } - - neq(a, b) { - return !this.eq(a,b); - } - - random() { - return [this.F.random(), this.F.random()]; - } - - - toRprLE(buff, o, e) { - this.F.toRprLE(buff, o, e[0]); - this.F.toRprLE(buff, o+this.F.n8, e[1]); - } - - toRprBE(buff, o, e) { - this.F.toRprBE(buff, o, e[1]); - this.F.toRprBE(buff, o+this.F.n8, e[0]); - } - - toRprLEM(buff, o, e) { - this.F.toRprLEM(buff, o, e[0]); - this.F.toRprLEM(buff, o+this.F.n8, e[1]); - } - - - toRprBEM(buff, o, e) { - this.F.toRprBEM(buff, o, e[1]); - this.F.toRprBEM(buff, o+this.F.n8, e[0]); - } - - fromRprLE(buff, o) { - o = o || 0; - const c0 = this.F.fromRprLE(buff, o); - const c1 = this.F.fromRprLE(buff, o+this.F.n8); - return [c0, c1]; - } - - fromRprBE(buff, o) { - o = o || 0; - const c1 = this.F.fromRprBE(buff, o); - const c0 = this.F.fromRprBE(buff, o+this.F.n8); - return [c0, c1]; - } - - fromRprLEM(buff, o) { - o = o || 0; - const c0 = this.F.fromRprLEM(buff, o); - const c1 = this.F.fromRprLEM(buff, o+this.F.n8); - return [c0, c1]; - } - - fromRprBEM(buff, o) { - o = o || 0; - const c1 = this.F.fromRprBEM(buff, o); - const c0 = this.F.fromRprBEM(buff, o+this.F.n8); - return [c0, c1]; - } - - toObject(a) { - return a; - } - + const n = 1 << bits; + if (n == 1) return [pall[offset]]; + else if (n == 2) return [PF.G.add(pall[offset], pall[offset + step]), PF.G.sub(pall[offset], pall[offset + step])]; + const ndiv2 = n >> 1; + const p1 = __fft(PF, pall, bits - 1, offset, step * 2); + const p2 = __fft(PF, pall, bits - 1, offset + step, step * 2); + const out = new Array(n); + for (let i = 0; i < ndiv2; i++) { + out[i] = PF.G.add(p1[i], PF.opMulGF(p2[i], PF.roots[bits][i])); + out[i + ndiv2] = PF.G.sub(p1[i], PF.opMulGF(p2[i], PF.roots[bits][i])); + } + return out; } - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - - -class F3Field { - constructor(F, nonResidue) { - this.type="F3"; - this.F = F; - this.zero = [this.F.zero, this.F.zero, this.F.zero]; - this.one = [this.F.one, this.F.zero, this.F.zero]; - this.negone = this.neg(this.one); - this.nonResidue = nonResidue; - this.m = F.m*3; - this.p = F.p; - this.n64 = F.n64*3; - this.n32 = this.n64*2; - this.n8 = this.n64*8; - } - - _mulByNonResidue(a) { - return this.F.mul(this.nonResidue, a); - } - - copy(a) { - return [this.F.copy(a[0]), this.F.copy(a[1]), this.F.copy(a[2])]; - } - - add(a, b) { - return [ - this.F.add(a[0], b[0]), - this.F.add(a[1], b[1]), - this.F.add(a[2], b[2]) - ]; - } - - double(a) { - return this.add(a,a); - } - - sub(a, b) { - return [ - this.F.sub(a[0], b[0]), - this.F.sub(a[1], b[1]), - this.F.sub(a[2], b[2]) - ]; - } - - neg(a) { - return this.sub(this.zero, a); - } - - mul(a, b) { - - const aA = this.F.mul(a[0] , b[0]); - const bB = this.F.mul(a[1] , b[1]); - const cC = this.F.mul(a[2] , b[2]); - - return [ - this.F.add( - aA, - this._mulByNonResidue( - this.F.sub( - this.F.mul( - this.F.add(a[1], a[2]), - this.F.add(b[1], b[2])), - this.F.add(bB, cC)))), // aA + non_residue*((b+c)*(B+C)-bB-cC), - - this.F.add( - this.F.sub( - this.F.mul( - this.F.add(a[0], a[1]), - this.F.add(b[0], b[1])), - this.F.add(aA, bB)), - this._mulByNonResidue( cC)), // (a+b)*(A+B)-aA-bB+non_residue*cC - - this.F.add( - this.F.sub( - this.F.mul( - this.F.add(a[0], a[2]), - this.F.add(b[0], b[2])), - this.F.add(aA, cC)), - bB)]; // (a+c)*(A+C)-aA+bB-cC) - } - - inv(a) { - const t0 = this.F.square(a[0]); // t0 = a^2 ; - const t1 = this.F.square(a[1]); // t1 = b^2 ; - const t2 = this.F.square(a[2]); // t2 = c^2; - const t3 = this.F.mul(a[0],a[1]); // t3 = ab - const t4 = this.F.mul(a[0],a[2]); // t4 = ac - const t5 = this.F.mul(a[1],a[2]); // t5 = bc; - // c0 = t0 - non_residue * t5; - const c0 = this.F.sub(t0, this._mulByNonResidue(t5)); - // c1 = non_residue * t2 - t3; - const c1 = this.F.sub(this._mulByNonResidue(t2), t3); - const c2 = this.F.sub(t1, t4); // c2 = t1-t4 - - // t6 = (a * c0 + non_residue * (c * c1 + b * c2)).inv(); - const t6 = - this.F.inv( - this.F.add( - this.F.mul(a[0], c0), - this._mulByNonResidue( - this.F.add( - this.F.mul(a[2], c1), - this.F.mul(a[1], c2))))); - - return [ - this.F.mul(t6, c0), // t6*c0 - this.F.mul(t6, c1), // t6*c1 - this.F.mul(t6, c2)]; // t6*c2 - } - - div(a, b) { - return this.mul(a, this.inv(b)); - } - - square(a) { - const s0 = this.F.square(a[0]); // s0 = a^2 - const ab = this.F.mul(a[0], a[1]); // ab = a*b - const s1 = this.F.add(ab, ab); // s1 = 2ab; - const s2 = this.F.square( - this.F.add(this.F.sub(a[0],a[1]), a[2])); // s2 = (a - b + c)^2; - const bc = this.F.mul(a[1],a[2]); // bc = b*c - const s3 = this.F.add(bc, bc); // s3 = 2*bc - const s4 = this.F.square(a[2]); // s4 = c^2 - - - return [ - this.F.add( - s0, - this._mulByNonResidue(s3)), // s0 + non_residue * s3, - this.F.add( - s1, - this._mulByNonResidue(s4)), // s1 + non_residue * s4, - this.F.sub( - this.F.add( this.F.add(s1, s2) , s3 ), - this.F.add(s0, s4))]; // s1 + s2 + s3 - s0 - s4 - } - - isZero(a) { - return this.F.isZero(a[0]) && this.F.isZero(a[1]) && this.F.isZero(a[2]); - } - - eq(a, b) { - return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]) && this.F.eq(a[2], b[2]); - } - - affine(a) { - return [this.F.affine(a[0]), this.F.affine(a[1]), this.F.affine(a[2])]; - } - - mulScalar(base, e) { - return mulScalar(this, base, e); - } - - pow(base, e) { - return exp(this, base, e); - } - - exp(base, e) { - return exp(this, base, e); - } - - toString(a) { - return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])}, ${this.F.toString(a[2])} ]`; - } - - fromRng(rng) { - const c0 = this.F.fromRng(rng); - const c1 = this.F.fromRng(rng); - const c2 = this.F.fromRng(rng); - return [c0, c1, c2]; - } - - gt(a, b) { - if (this.F.gt(a[0], b[0])) return true; - if (this.F.gt(b[0], a[0])) return false; - if (this.F.gt(a[1], b[1])) return true; - if (this.F.gt(b[1], a[1])) return false; - if (this.F.gt(a[2], b[2])) return true; - return false; - } - - - geq(a, b) { - return this.gt(a, b) || this.eq(a, b); - } - - lt(a, b) { - return !this.geq(a,b); - } - - leq(a, b) { - return !this.gt(a,b); - } - - neq(a, b) { - return !this.eq(a,b); - } - - random() { - return [this.F.random(), this.F.random(), this.F.random()]; - } - - - toRprLE(buff, o, e) { - this.F.toRprLE(buff, o, e[0]); - this.F.toRprLE(buff, o+this.F.n8, e[1]); - this.F.toRprLE(buff, o+this.F.n8*2, e[2]); - } - - toRprBE(buff, o, e) { - this.F.toRprBE(buff, o, e[2]); - this.F.toRprBE(buff, o+this.F.n8, e[1]); - this.F.toRprBE(buff, o+this.F.n8*2, e[0]); - } - - toRprLEM(buff, o, e) { - this.F.toRprLEM(buff, o, e[0]); - this.F.toRprLEM(buff, o+this.F.n8, e[1]); - this.F.toRprLEM(buff, o+this.F.n8*2, e[2]); - } - - - toRprBEM(buff, o, e) { - this.F.toRprBEM(buff, o, e[2]); - this.F.toRprBEM(buff, o+this.F.n8, e[1]); - this.F.toRprBEM(buff, o+this.F.n8*2, e[0]); - } - - fromRprLE(buff, o) { - o = o || 0; - const c0 = this.F.fromRprLE(buff, o); - const c1 = this.F.fromRprLE(buff, o+this.n8); - const c2 = this.F.fromRprLE(buff, o+this.n8*2); - return [c0, c1, c2]; - } - - fromRprBE(buff, o) { - o = o || 0; - const c2 = this.F.fromRprBE(buff, o); - const c1 = this.F.fromRprBE(buff, o+this.n8); - const c0 = this.F.fromRprBE(buff, o+this.n8*2); - return [c0, c1, c2]; - } - - fromRprLEM(buff, o) { - o = o || 0; - const c0 = this.F.fromRprLEM(buff, o); - const c1 = this.F.fromRprLEM(buff, o+this.n8); - const c2 = this.F.fromRprLEM(buff, o+this.n8*2); - return [c0, c1, c2]; - } - - fromRprBEM(buff, o) { - o = o || 0; - const c2 = this.F.fromRprBEM(buff, o); - const c1 = this.F.fromRprBEM(buff, o+this.n8); - const c0 = this.F.fromRprBEM(buff, o+this.n8*2); - return [c0, c1, c2]; - } - - toObject(a) { - return a; - } -} - -/* - Copyright 2018 0kims association. - - This file is part of snarkjs. - - snarkjs is a free software: you can redistribute it and/or - modify it under the terms of the GNU General Public License as published by the - Free Software Foundation, either version 3 of the License, or (at your option) - any later version. - - snarkjs is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. - - You should have received a copy of the GNU General Public License along with - snarkjs. If not, see . -*/ - - - +//#endregion +//#region src/f1field.js +var ZqField = class { + constructor(p) { + this.type = "F1"; + this.one = BigInt(1); + this.zero = BigInt(0); + this.p = BigInt(p); + this.m = 1; + this.negone = this.p - this.one; + this.two = BigInt(2); + this.half = this.p >> this.one; + this.bitLength = bitLength(this.p); + this.mask = (this.one << BigInt(this.bitLength)) - this.one; + this.n64 = Math.floor((this.bitLength - 1) / 64) + 1; + this.n32 = this.n64 * 2; + this.n8 = this.n64 * 8; + this.R = this.e(this.one << BigInt(this.n64 * 64)); + this.Ri = this.inv(this.R); + const e = this.negone >> this.one; + this.nqr = this.two; + let r = this.pow(this.nqr, e); + while (!this.eq(r, this.negone)) { + this.nqr = this.nqr + this.one; + r = this.pow(this.nqr, e); + } + this.s = 0; + this.t = this.negone; + while ((this.t & this.one) == this.zero) { + this.s = this.s + 1; + this.t = this.t >> this.one; + } + this.nqr_to_t = this.pow(this.nqr, this.t); + buildSqrt(this); + this.FFT = new FFT(this, this, this.mul.bind(this)); + this.fft = this.FFT.fft.bind(this.FFT); + this.ifft = this.FFT.ifft.bind(this.FFT); + this.w = this.FFT.w; + this.wi = this.FFT.wi; + this.shift = this.square(this.nqr); + this.k = this.exp(this.nqr, 2 ** this.s); + } + e(a, b) { + let res; + if (!b) res = BigInt(a); + else if (b == 16) res = BigInt("0x" + a); + if (res < 0) { + let nres = -res; + if (nres >= this.p) nres = nres % this.p; + return this.p - nres; + } else return res >= this.p ? res % this.p : res; + } + add(a, b) { + const res = a + b; + return res >= this.p ? res - this.p : res; + } + sub(a, b) { + return a >= b ? a - b : this.p - b + a; + } + neg(a) { + return a ? this.p - a : a; + } + mul(a, b) { + return a * b % this.p; + } + mulScalar(base, s) { + return base * this.e(s) % this.p; + } + square(a) { + return a * a % this.p; + } + eq(a, b) { + return a == b; + } + neq(a, b) { + return a != b; + } + lt(a, b) { + return (a > this.half ? a - this.p : a) < (b > this.half ? b - this.p : b); + } + gt(a, b) { + return (a > this.half ? a - this.p : a) > (b > this.half ? b - this.p : b); + } + leq(a, b) { + return (a > this.half ? a - this.p : a) <= (b > this.half ? b - this.p : b); + } + geq(a, b) { + return (a > this.half ? a - this.p : a) >= (b > this.half ? b - this.p : b); + } + div(a, b) { + return this.mul(a, this.inv(b)); + } + idiv(a, b) { + if (!b) throw new Error("Division by zero"); + return a / b; + } + inv(a) { + if (!a) throw new Error("Division by zero"); + let t = this.zero; + let r = this.p; + let newt = this.one; + let newr = a % this.p; + while (newr) { + let q = r / newr; + [t, newt] = [newt, t - q * newt]; + [r, newr] = [newr, r - q * newr]; + } + if (t < this.zero) t += this.p; + return t; + } + mod(a, b) { + return a % b; + } + pow(b, e) { + return exp(this, b, e); + } + exp(b, e) { + return exp(this, b, e); + } + band(a, b) { + const res = a & b & this.mask; + return res >= this.p ? res - this.p : res; + } + bor(a, b) { + const res = (a | b) & this.mask; + return res >= this.p ? res - this.p : res; + } + bxor(a, b) { + const res = (a ^ b) & this.mask; + return res >= this.p ? res - this.p : res; + } + bnot(a) { + const res = a ^ this.mask; + return res >= this.p ? res - this.p : res; + } + shl(a, b) { + if (Number(b) < this.bitLength) { + const res = a << b & this.mask; + return res >= this.p ? res - this.p : res; + } else { + const nb = this.p - b; + if (Number(nb) < this.bitLength) return a >> nb; + else return this.zero; + } + } + shr(a, b) { + if (Number(b) < this.bitLength) return a >> b; + else { + const nb = this.p - b; + if (Number(nb) < this.bitLength) { + const res = a << nb & this.mask; + return res >= this.p ? res - this.p : res; + } else return 0; + } + } + land(a, b) { + return a && b ? this.one : this.zero; + } + lor(a, b) { + return a || b ? this.one : this.zero; + } + lnot(a) { + return a ? this.zero : this.one; + } + sqrt_old(n) { + if (n == this.zero) return this.zero; + if (this.pow(n, this.negone >> this.one) != this.one) return null; + let m = this.s; + let c = this.nqr_to_t; + let t = this.pow(n, this.t); + let r = this.pow(n, this.add(this.t, this.one) >> this.one); + while (t != this.one) { + let sq = this.square(t); + let i = 1; + while (sq != this.one) { + i++; + sq = this.square(sq); + } + let b = c; + for (let j = 0; j < m - i - 1; j++) b = this.square(b); + m = i; + c = this.square(b); + t = this.mul(t, c); + r = this.mul(r, b); + } + if (r > this.p >> this.one) r = this.neg(r); + return r; + } + normalize(a, b) { + a = BigInt(a, b); + if (a < 0) { + let na = -a; + if (na >= this.p) na = na % this.p; + return this.p - na; + } else return a >= this.p ? a % this.p : a; + } + random() { + const nBytes = this.bitLength * 2 / 8; + let res = this.zero; + for (let i = 0; i < nBytes; i++) res = (res << BigInt(8)) + BigInt(getRandomBytes(1)[0]); + return res % this.p; + } + toString(a, base) { + base = base || 10; + let vs; + if (a > this.half && base == 10) vs = "-" + (this.p - a).toString(base); + else vs = a.toString(base); + return vs; + } + isZero(a) { + return a == this.zero; + } + fromRng(rng) { + let v; + do { + v = this.zero; + for (let i = 0; i < this.n64; i++) v += rng.nextU64() << BigInt(64 * i); + v &= this.mask; + } while (v >= this.p); + v = v * this.Ri % this.p; + return v; + } + fft(a) { + return this.FFT.fft(a); + } + ifft(a) { + return this.FFT.ifft(a); + } + toRprLE(buff, o, e) { + toRprLE(buff, o, e, this.n64 * 8); + } + toRprBE(buff, o, e) { + toRprBE(buff, o, e, this.n64 * 8); + } + toRprBEM(buff, o, e) { + return this.toRprBE(buff, o, this.mul(this.R, e)); + } + toRprLEM(buff, o, e) { + return this.toRprLE(buff, o, this.mul(this.R, e)); + } + fromRprLE(buff, o) { + return fromRprLE(buff, o, this.n8); + } + fromRprBE(buff, o) { + return fromRprBE(buff, o, this.n8); + } + fromRprLEM(buff, o) { + return this.mul(this.fromRprLE(buff, o), this.Ri); + } + fromRprBEM(buff, o) { + return this.mul(this.fromRprBE(buff, o), this.Ri); + } + toObject(a) { + return a; + } +}; +//#endregion +//#region src/f2field.js +var F2Field = class { + constructor(F, nonResidue) { + this.type = "F2"; + this.F = F; + this.zero = [this.F.zero, this.F.zero]; + this.one = [this.F.one, this.F.zero]; + this.negone = this.neg(this.one); + this.nonResidue = nonResidue; + this.m = F.m * 2; + this.p = F.p; + this.n64 = F.n64 * 2; + this.n32 = this.n64 * 2; + this.n8 = this.n64 * 8; + buildSqrt(this); + } + _mulByNonResidue(a) { + return this.F.mul(this.nonResidue, a); + } + copy(a) { + return [this.F.copy(a[0]), this.F.copy(a[1])]; + } + add(a, b) { + return [this.F.add(a[0], b[0]), this.F.add(a[1], b[1])]; + } + double(a) { + return this.add(a, a); + } + sub(a, b) { + return [this.F.sub(a[0], b[0]), this.F.sub(a[1], b[1])]; + } + neg(a) { + return this.sub(this.zero, a); + } + conjugate(a) { + return [a[0], this.F.neg(a[1])]; + } + mul(a, b) { + const aA = this.F.mul(a[0], b[0]); + const bB = this.F.mul(a[1], b[1]); + return [this.F.add(aA, this._mulByNonResidue(bB)), this.F.sub(this.F.mul(this.F.add(a[0], a[1]), this.F.add(b[0], b[1])), this.F.add(aA, bB))]; + } + inv(a) { + const t0 = this.F.square(a[0]); + const t1 = this.F.square(a[1]); + const t2 = this.F.sub(t0, this._mulByNonResidue(t1)); + const t3 = this.F.inv(t2); + return [this.F.mul(a[0], t3), this.F.neg(this.F.mul(a[1], t3))]; + } + div(a, b) { + return this.mul(a, this.inv(b)); + } + square(a) { + const ab = this.F.mul(a[0], a[1]); + return [this.F.sub(this.F.mul(this.F.add(a[0], a[1]), this.F.add(a[0], this._mulByNonResidue(a[1]))), this.F.add(ab, this._mulByNonResidue(ab))), this.F.add(ab, ab)]; + } + isZero(a) { + return this.F.isZero(a[0]) && this.F.isZero(a[1]); + } + eq(a, b) { + return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]); + } + mulScalar(base, e) { + return mulScalar(this, base, e); + } + pow(base, e) { + return exp(this, base, e); + } + exp(base, e) { + return exp(this, base, e); + } + toString(a) { + return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])} ]`; + } + fromRng(rng) { + return [this.F.fromRng(rng), this.F.fromRng(rng)]; + } + gt(a, b) { + if (this.F.gt(a[0], b[0])) return true; + if (this.F.gt(b[0], a[0])) return false; + if (this.F.gt(a[1], b[1])) return true; + return false; + } + geq(a, b) { + return this.gt(a, b) || this.eq(a, b); + } + lt(a, b) { + return !this.geq(a, b); + } + leq(a, b) { + return !this.gt(a, b); + } + neq(a, b) { + return !this.eq(a, b); + } + random() { + return [this.F.random(), this.F.random()]; + } + toRprLE(buff, o, e) { + this.F.toRprLE(buff, o, e[0]); + this.F.toRprLE(buff, o + this.F.n8, e[1]); + } + toRprBE(buff, o, e) { + this.F.toRprBE(buff, o, e[1]); + this.F.toRprBE(buff, o + this.F.n8, e[0]); + } + toRprLEM(buff, o, e) { + this.F.toRprLEM(buff, o, e[0]); + this.F.toRprLEM(buff, o + this.F.n8, e[1]); + } + toRprBEM(buff, o, e) { + this.F.toRprBEM(buff, o, e[1]); + this.F.toRprBEM(buff, o + this.F.n8, e[0]); + } + fromRprLE(buff, o) { + o = o || 0; + return [this.F.fromRprLE(buff, o), this.F.fromRprLE(buff, o + this.F.n8)]; + } + fromRprBE(buff, o) { + o = o || 0; + const c1 = this.F.fromRprBE(buff, o); + return [this.F.fromRprBE(buff, o + this.F.n8), c1]; + } + fromRprLEM(buff, o) { + o = o || 0; + return [this.F.fromRprLEM(buff, o), this.F.fromRprLEM(buff, o + this.F.n8)]; + } + fromRprBEM(buff, o) { + o = o || 0; + const c1 = this.F.fromRprBEM(buff, o); + return [this.F.fromRprBEM(buff, o + this.F.n8), c1]; + } + toObject(a) { + return a; + } +}; +//#endregion +//#region src/f3field.js +var F3Field = class { + constructor(F, nonResidue) { + this.type = "F3"; + this.F = F; + this.zero = [ + this.F.zero, + this.F.zero, + this.F.zero + ]; + this.one = [ + this.F.one, + this.F.zero, + this.F.zero + ]; + this.negone = this.neg(this.one); + this.nonResidue = nonResidue; + this.m = F.m * 3; + this.p = F.p; + this.n64 = F.n64 * 3; + this.n32 = this.n64 * 2; + this.n8 = this.n64 * 8; + } + _mulByNonResidue(a) { + return this.F.mul(this.nonResidue, a); + } + copy(a) { + return [ + this.F.copy(a[0]), + this.F.copy(a[1]), + this.F.copy(a[2]) + ]; + } + add(a, b) { + return [ + this.F.add(a[0], b[0]), + this.F.add(a[1], b[1]), + this.F.add(a[2], b[2]) + ]; + } + double(a) { + return this.add(a, a); + } + sub(a, b) { + return [ + this.F.sub(a[0], b[0]), + this.F.sub(a[1], b[1]), + this.F.sub(a[2], b[2]) + ]; + } + neg(a) { + return this.sub(this.zero, a); + } + mul(a, b) { + const aA = this.F.mul(a[0], b[0]); + const bB = this.F.mul(a[1], b[1]); + const cC = this.F.mul(a[2], b[2]); + return [ + this.F.add(aA, this._mulByNonResidue(this.F.sub(this.F.mul(this.F.add(a[1], a[2]), this.F.add(b[1], b[2])), this.F.add(bB, cC)))), + this.F.add(this.F.sub(this.F.mul(this.F.add(a[0], a[1]), this.F.add(b[0], b[1])), this.F.add(aA, bB)), this._mulByNonResidue(cC)), + this.F.add(this.F.sub(this.F.mul(this.F.add(a[0], a[2]), this.F.add(b[0], b[2])), this.F.add(aA, cC)), bB) + ]; + } + inv(a) { + const t0 = this.F.square(a[0]); + const t1 = this.F.square(a[1]); + const t2 = this.F.square(a[2]); + const t3 = this.F.mul(a[0], a[1]); + const t4 = this.F.mul(a[0], a[2]); + const t5 = this.F.mul(a[1], a[2]); + const c0 = this.F.sub(t0, this._mulByNonResidue(t5)); + const c1 = this.F.sub(this._mulByNonResidue(t2), t3); + const c2 = this.F.sub(t1, t4); + const t6 = this.F.inv(this.F.add(this.F.mul(a[0], c0), this._mulByNonResidue(this.F.add(this.F.mul(a[2], c1), this.F.mul(a[1], c2))))); + return [ + this.F.mul(t6, c0), + this.F.mul(t6, c1), + this.F.mul(t6, c2) + ]; + } + div(a, b) { + return this.mul(a, this.inv(b)); + } + square(a) { + const s0 = this.F.square(a[0]); + const ab = this.F.mul(a[0], a[1]); + const s1 = this.F.add(ab, ab); + const s2 = this.F.square(this.F.add(this.F.sub(a[0], a[1]), a[2])); + const bc = this.F.mul(a[1], a[2]); + const s3 = this.F.add(bc, bc); + const s4 = this.F.square(a[2]); + return [ + this.F.add(s0, this._mulByNonResidue(s3)), + this.F.add(s1, this._mulByNonResidue(s4)), + this.F.sub(this.F.add(this.F.add(s1, s2), s3), this.F.add(s0, s4)) + ]; + } + isZero(a) { + return this.F.isZero(a[0]) && this.F.isZero(a[1]) && this.F.isZero(a[2]); + } + eq(a, b) { + return this.F.eq(a[0], b[0]) && this.F.eq(a[1], b[1]) && this.F.eq(a[2], b[2]); + } + affine(a) { + return [ + this.F.affine(a[0]), + this.F.affine(a[1]), + this.F.affine(a[2]) + ]; + } + mulScalar(base, e) { + return mulScalar(this, base, e); + } + pow(base, e) { + return exp(this, base, e); + } + exp(base, e) { + return exp(this, base, e); + } + toString(a) { + return `[ ${this.F.toString(a[0])} , ${this.F.toString(a[1])}, ${this.F.toString(a[2])} ]`; + } + fromRng(rng) { + return [ + this.F.fromRng(rng), + this.F.fromRng(rng), + this.F.fromRng(rng) + ]; + } + gt(a, b) { + if (this.F.gt(a[0], b[0])) return true; + if (this.F.gt(b[0], a[0])) return false; + if (this.F.gt(a[1], b[1])) return true; + if (this.F.gt(b[1], a[1])) return false; + if (this.F.gt(a[2], b[2])) return true; + return false; + } + geq(a, b) { + return this.gt(a, b) || this.eq(a, b); + } + lt(a, b) { + return !this.geq(a, b); + } + leq(a, b) { + return !this.gt(a, b); + } + neq(a, b) { + return !this.eq(a, b); + } + random() { + return [ + this.F.random(), + this.F.random(), + this.F.random() + ]; + } + toRprLE(buff, o, e) { + this.F.toRprLE(buff, o, e[0]); + this.F.toRprLE(buff, o + this.F.n8, e[1]); + this.F.toRprLE(buff, o + this.F.n8 * 2, e[2]); + } + toRprBE(buff, o, e) { + this.F.toRprBE(buff, o, e[2]); + this.F.toRprBE(buff, o + this.F.n8, e[1]); + this.F.toRprBE(buff, o + this.F.n8 * 2, e[0]); + } + toRprLEM(buff, o, e) { + this.F.toRprLEM(buff, o, e[0]); + this.F.toRprLEM(buff, o + this.F.n8, e[1]); + this.F.toRprLEM(buff, o + this.F.n8 * 2, e[2]); + } + toRprBEM(buff, o, e) { + this.F.toRprBEM(buff, o, e[2]); + this.F.toRprBEM(buff, o + this.F.n8, e[1]); + this.F.toRprBEM(buff, o + this.F.n8 * 2, e[0]); + } + fromRprLE(buff, o) { + o = o || 0; + return [ + this.F.fromRprLE(buff, o), + this.F.fromRprLE(buff, o + this.n8), + this.F.fromRprLE(buff, o + this.n8 * 2) + ]; + } + fromRprBE(buff, o) { + o = o || 0; + const c2 = this.F.fromRprBE(buff, o); + const c1 = this.F.fromRprBE(buff, o + this.n8); + return [ + this.F.fromRprBE(buff, o + this.n8 * 2), + c1, + c2 + ]; + } + fromRprLEM(buff, o) { + o = o || 0; + return [ + this.F.fromRprLEM(buff, o), + this.F.fromRprLEM(buff, o + this.n8), + this.F.fromRprLEM(buff, o + this.n8 * 2) + ]; + } + fromRprBEM(buff, o) { + o = o || 0; + const c2 = this.F.fromRprBEM(buff, o); + const c1 = this.F.fromRprBEM(buff, o + this.n8); + return [ + this.F.fromRprBEM(buff, o + this.n8 * 2), + c1, + c2 + ]; + } + toObject(a) { + return a; + } +}; +//#endregion +//#region src/ec.js function isGreatest(F, a) { - if (Array.isArray(a)) { - for (let i=a.length-1; i>=0; i--) { - if (!F.F.isZero(a[i])) { - return isGreatest(F.F, a[i]); - } - } - return 0; - } else { - const na = F.neg(a); - return gt(a, na); - } + if (Array.isArray(a)) { + for (let i = a.length - 1; i >= 0; i--) if (!F.F.isZero(a[i])) return isGreatest(F.F, a[i]); + return 0; + } else return gt(a, F.neg(a)); } - - -class EC { - - constructor(F, g) { - this.F = F; - this.g = g; - if (this.g.length == 2) this.g[2] = this.F.one; - this.zero = [this.F.zero, this.F.one, this.F.zero]; - } - - add(p1, p2) { - - const F = this.F; - - if (this.eq(p1, this.zero)) return p2; - if (this.eq(p2, this.zero)) return p1; - - const res = new Array(3); - - const Z1Z1 = F.square( p1[2] ); - const Z2Z2 = F.square( p2[2] ); - - const U1 = F.mul( p1[0] , Z2Z2 ); // U1 = X1 * Z2Z2 - const U2 = F.mul( p2[0] , Z1Z1 ); // U2 = X2 * Z1Z1 - - const Z1_cubed = F.mul( p1[2] , Z1Z1); - const Z2_cubed = F.mul( p2[2] , Z2Z2); - - const S1 = F.mul( p1[1] , Z2_cubed); // S1 = Y1 * Z2 * Z2Z2 - const S2 = F.mul( p2[1] , Z1_cubed); // S2 = Y2 * Z1 * Z1Z1 - - if (F.eq(U1,U2) && F.eq(S1,S2)) { - return this.double(p1); - } - - const H = F.sub( U2 , U1 ); // H = U2-U1 - - const S2_minus_S1 = F.sub( S2 , S1 ); - - const I = F.square( F.add(H,H) ); // I = (2 * H)^2 - const J = F.mul( H , I ); // J = H * I - - const r = F.add( S2_minus_S1 , S2_minus_S1 ); // r = 2 * (S2-S1) - const V = F.mul( U1 , I ); // V = U1 * I - - res[0] = - F.sub( - F.sub( F.square(r) , J ), - F.add( V , V )); // X3 = r^2 - J - 2 * V - - const S1_J = F.mul( S1 , J ); - - res[1] = - F.sub( - F.mul( r , F.sub(V,res[0])), - F.add( S1_J,S1_J )); // Y3 = r * (V-X3)-2 S1 J - - res[2] = - F.mul( - H, - F.sub( - F.square( F.add(p1[2],p2[2]) ), - F.add( Z1Z1 , Z2Z2 ))); // Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2) * H - - return res; - } - - neg(p) { - return [p[0], this.F.neg(p[1]), p[2]]; - } - - sub(a, b) { - return this.add(a, this.neg(b)); - } - - double(p) { - const F = this.F; - - const res = new Array(3); - - if (this.eq(p, this.zero)) return p; - - const A = F.square( p[0] ); // A = X1^2 - const B = F.square( p[1] ); // B = Y1^2 - const C = F.square( B ); // C = B^2 - - let D = - F.sub( - F.square( F.add(p[0] , B )), - F.add( A , C)); - D = F.add(D,D); // D = 2 * ((X1 + B)^2 - A - C) - - const E = F.add( F.add(A,A), A); // E = 3 * A - const FF =F.square( E ); // F = E^2 - - res[0] = F.sub( FF , F.add(D,D) ); // X3 = F - 2 D - - let eightC = F.add( C , C ); - eightC = F.add( eightC , eightC ); - eightC = F.add( eightC , eightC ); - - res[1] = - F.sub( - F.mul( - E, - F.sub( D, res[0] )), - eightC); // Y3 = E * (D - X3) - 8 * C - - const Y1Z1 = F.mul( p[1] , p[2] ); - res[2] = F.add( Y1Z1 , Y1Z1 ); // Z3 = 2 * Y1 * Z1 - - return res; - } - - timesScalar(base, e) { - return mulScalar(this, base, e); - } - - mulScalar(base, e) { - return mulScalar(this, base, e); - } - - affine(p) { - const F = this.F; - if (this.isZero(p)) { - return this.zero; - } else if (F.eq(p[2], F.one)) { - return p; - } else { - const Z_inv = F.inv(p[2]); - const Z2_inv = F.square(Z_inv); - const Z3_inv = F.mul(Z2_inv, Z_inv); - - const res = new Array(3); - res[0] = F.mul(p[0],Z2_inv); - res[1] = F.mul(p[1],Z3_inv); - res[2] = F.one; - - return res; - } - } - - multiAffine(arr) { - const keys = Object.keys(arr); - const F = this.F; - const accMul = new Array(keys.length+1); - accMul[0] = F.one; - for (let i = 0; i< keys.length; i++) { - if (F.eq(arr[keys[i]][2], F.zero)) { - accMul[i+1] = accMul[i]; - } else { - accMul[i+1] = F.mul(accMul[i], arr[keys[i]][2]); - } - } - - accMul[keys.length] = F.inv(accMul[keys.length]); - - for (let i = keys.length-1; i>=0; i--) { - if (F.eq(arr[keys[i]][2], F.zero)) { - accMul[i] = accMul[i+1]; - arr[keys[i]] = this.zero; - } else { - const Z_inv = F.mul(accMul[i], accMul[i+1]); - accMul[i] = F.mul(arr[keys[i]][2], accMul[i+1]); - - const Z2_inv = F.square(Z_inv); - const Z3_inv = F.mul(Z2_inv, Z_inv); - - arr[keys[i]][0] = F.mul(arr[keys[i]][0],Z2_inv); - arr[keys[i]][1] = F.mul(arr[keys[i]][1],Z3_inv); - arr[keys[i]][2] = F.one; - } - } - - } - - eq(p1, p2) { - const F = this.F; - - if (this.F.eq(p1[2], this.F.zero)) return this.F.eq(p2[2], this.F.zero); - if (this.F.eq(p2[2], this.F.zero)) return false; - - const Z1Z1 = F.square( p1[2] ); - const Z2Z2 = F.square( p2[2] ); - - const U1 = F.mul( p1[0] , Z2Z2 ); - const U2 = F.mul( p2[0] , Z1Z1 ); - - const Z1_cubed = F.mul( p1[2] , Z1Z1); - const Z2_cubed = F.mul( p2[2] , Z2Z2); - - const S1 = F.mul( p1[1] , Z2_cubed); - const S2 = F.mul( p2[1] , Z1_cubed); - - return (F.eq(U1,U2) && F.eq(S1,S2)); - } - - isZero(p) { - return this.F.isZero(p[2]); - } - - toString(p) { - const cp = this.affine(p); - return `[ ${this.F.toString(cp[0])} , ${this.F.toString(cp[1])} ]`; - } - - fromRng(rng) { - const F = this.F; - let P = []; - let greatest; - do { - P[0] = F.fromRng(rng); - greatest = rng.nextBool(); - const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); - P[1] = F.sqrt(x3b); - } while ((P[1] == null)||(F.isZero[P])); - - const s = isGreatest(F, P[1]); - if (greatest ^ s) P[1] = F.neg(P[1]); - P[2] = F.one; - - if (this.cofactor) { - P = this.mulScalar(P, this.cofactor); - } - - P = this.affine(P); - - return P; - - } - - toRprLE(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprLE(buff, o, p[0]); - this.F.toRprLE(buff, o+this.F.n8, p[1]); - } - - toRprBE(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprBE(buff, o, p[0]); - this.F.toRprBE(buff, o+this.F.n8, p[1]); - } - - toRprLEM(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprLEM(buff, o, p[0]); - this.F.toRprLEM(buff, o+this.F.n8, p[1]); - } - - toRprLEJM(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprLEM(buff, o, p[0]); - this.F.toRprLEM(buff, o+this.F.n8, p[1]); - this.F.toRprLEM(buff, o+2*this.F.n8, p[2]); - } - - - toRprBEM(buff, o, p) { - p = this.affine(p); - if (this.isZero(p)) { - const BuffV = new Uint8Array(buff, o, this.F.n8*2); - BuffV.fill(0); - return; - } - this.F.toRprBEM(buff, o, p[0]); - this.F.toRprBEM(buff, o+this.F.n8, p[1]); - } - - fromRprLE(buff, o) { - o = o || 0; - const x = this.F.fromRprLE(buff, o); - const y = this.F.fromRprLE(buff, o+this.F.n8); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, this.F.one]; - } - - fromRprBE(buff, o) { - o = o || 0; - const x = this.F.fromRprBE(buff, o); - const y = this.F.fromRprBE(buff, o+this.F.n8); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, this.F.one]; - } - - fromRprLEM(buff, o) { - o = o || 0; - const x = this.F.fromRprLEM(buff, o); - const y = this.F.fromRprLEM(buff, o+this.F.n8); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, this.F.one]; - } - - fromRprLEJM(buff, o) { - o = o || 0; - const x = this.F.fromRprLEM(buff, o); - const y = this.F.fromRprLEM(buff, o+this.F.n8); - const z = this.F.fromRprLEM(buff, o+this.F.n8*2); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, z]; - } - - fromRprBEM(buff, o) { - o = o || 0; - const x = this.F.fromRprBEM(buff, o); - const y = this.F.fromRprBEM(buff, o+this.F.n8); - if (this.F.isZero(x) && this.F.isZero(y)) { - return this.zero; - } - return [x, y, this.F.one]; - } - - fromRprCompressed(buff, o) { - const F = this.F; - const v = new Uint8Array(buff.buffer, o, F.n8); - if (v[0] & 0x40) return this.zero; - const P = new Array(3); - - const greatest = ((v[0] & 0x80) != 0); - v[0] = v[0] & 0x7F; - P[0] = F.fromRprBE(buff, o); - if (greatest) v[0] = v[0] | 0x80; // set back again the old value - - const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); - P[1] = F.sqrt(x3b); - - if (P[1] === null) { - throw new Error("Invalid Point!"); - } - - const s = isGreatest(F, P[1]); - if (greatest ^ s) P[1] = F.neg(P[1]); - P[2] = F.one; - - return P; - } - - toRprCompressed(buff, o, p) { - p = this.affine(p); - const v = new Uint8Array(buff.buffer, o, this.F.n8); - if (this.isZero(p)) { - v.fill(0); - v[0] = 0x40; - return; - } - this.F.toRprBE(buff, o, p[0]); - - if (isGreatest(this.F, p[1])) { - v[0] = v[0] | 0x80; - } - } - - - fromRprUncompressed(buff, o) { - if (buff[0] & 0x40) return this.zero; - - return this.fromRprBE(buff, o); - } - - toRprUncompressed(buff, o, p) { - this.toRprBE(buff, o, p); - - if (this.isZero(p)) { - buff[o] = buff[o] | 0x40; - } - } - - -} - -/* global BigInt */ - +var EC = class { + constructor(F, g) { + this.F = F; + this.g = g; + if (this.g.length == 2) this.g[2] = this.F.one; + this.zero = [ + this.F.zero, + this.F.one, + this.F.zero + ]; + } + add(p1, p2) { + const F = this.F; + if (this.eq(p1, this.zero)) return p2; + if (this.eq(p2, this.zero)) return p1; + const res = new Array(3); + const Z1Z1 = F.square(p1[2]); + const Z2Z2 = F.square(p2[2]); + const U1 = F.mul(p1[0], Z2Z2); + const U2 = F.mul(p2[0], Z1Z1); + const Z1_cubed = F.mul(p1[2], Z1Z1); + const Z2_cubed = F.mul(p2[2], Z2Z2); + const S1 = F.mul(p1[1], Z2_cubed); + const S2 = F.mul(p2[1], Z1_cubed); + if (F.eq(U1, U2) && F.eq(S1, S2)) return this.double(p1); + const H = F.sub(U2, U1); + const S2_minus_S1 = F.sub(S2, S1); + const I = F.square(F.add(H, H)); + const J = F.mul(H, I); + const r = F.add(S2_minus_S1, S2_minus_S1); + const V = F.mul(U1, I); + res[0] = F.sub(F.sub(F.square(r), J), F.add(V, V)); + const S1_J = F.mul(S1, J); + res[1] = F.sub(F.mul(r, F.sub(V, res[0])), F.add(S1_J, S1_J)); + res[2] = F.mul(H, F.sub(F.square(F.add(p1[2], p2[2])), F.add(Z1Z1, Z2Z2))); + return res; + } + neg(p) { + return [ + p[0], + this.F.neg(p[1]), + p[2] + ]; + } + sub(a, b) { + return this.add(a, this.neg(b)); + } + double(p) { + const F = this.F; + const res = new Array(3); + if (this.eq(p, this.zero)) return p; + const A = F.square(p[0]); + const B = F.square(p[1]); + const C = F.square(B); + let D = F.sub(F.square(F.add(p[0], B)), F.add(A, C)); + D = F.add(D, D); + const E = F.add(F.add(A, A), A); + const FF = F.square(E); + res[0] = F.sub(FF, F.add(D, D)); + let eightC = F.add(C, C); + eightC = F.add(eightC, eightC); + eightC = F.add(eightC, eightC); + res[1] = F.sub(F.mul(E, F.sub(D, res[0])), eightC); + const Y1Z1 = F.mul(p[1], p[2]); + res[2] = F.add(Y1Z1, Y1Z1); + return res; + } + timesScalar(base, e) { + return mulScalar(this, base, e); + } + mulScalar(base, e) { + return mulScalar(this, base, e); + } + affine(p) { + const F = this.F; + if (this.isZero(p)) return this.zero; + else if (F.eq(p[2], F.one)) return p; + else { + const Z_inv = F.inv(p[2]); + const Z2_inv = F.square(Z_inv); + const Z3_inv = F.mul(Z2_inv, Z_inv); + const res = new Array(3); + res[0] = F.mul(p[0], Z2_inv); + res[1] = F.mul(p[1], Z3_inv); + res[2] = F.one; + return res; + } + } + multiAffine(arr) { + const keys = Object.keys(arr); + const F = this.F; + const accMul = new Array(keys.length + 1); + accMul[0] = F.one; + for (let i = 0; i < keys.length; i++) if (F.eq(arr[keys[i]][2], F.zero)) accMul[i + 1] = accMul[i]; + else accMul[i + 1] = F.mul(accMul[i], arr[keys[i]][2]); + accMul[keys.length] = F.inv(accMul[keys.length]); + for (let i = keys.length - 1; i >= 0; i--) if (F.eq(arr[keys[i]][2], F.zero)) { + accMul[i] = accMul[i + 1]; + arr[keys[i]] = this.zero; + } else { + const Z_inv = F.mul(accMul[i], accMul[i + 1]); + accMul[i] = F.mul(arr[keys[i]][2], accMul[i + 1]); + const Z2_inv = F.square(Z_inv); + const Z3_inv = F.mul(Z2_inv, Z_inv); + arr[keys[i]][0] = F.mul(arr[keys[i]][0], Z2_inv); + arr[keys[i]][1] = F.mul(arr[keys[i]][1], Z3_inv); + arr[keys[i]][2] = F.one; + } + } + eq(p1, p2) { + const F = this.F; + if (this.F.eq(p1[2], this.F.zero)) return this.F.eq(p2[2], this.F.zero); + if (this.F.eq(p2[2], this.F.zero)) return false; + const Z1Z1 = F.square(p1[2]); + const Z2Z2 = F.square(p2[2]); + const U1 = F.mul(p1[0], Z2Z2); + const U2 = F.mul(p2[0], Z1Z1); + const Z1_cubed = F.mul(p1[2], Z1Z1); + const Z2_cubed = F.mul(p2[2], Z2Z2); + const S1 = F.mul(p1[1], Z2_cubed); + const S2 = F.mul(p2[1], Z1_cubed); + return F.eq(U1, U2) && F.eq(S1, S2); + } + isZero(p) { + return this.F.isZero(p[2]); + } + toString(p) { + const cp = this.affine(p); + return `[ ${this.F.toString(cp[0])} , ${this.F.toString(cp[1])} ]`; + } + fromRng(rng) { + const F = this.F; + let P = []; + let greatest; + do { + P[0] = F.fromRng(rng); + greatest = rng.nextBool(); + const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); + P[1] = F.sqrt(x3b); + } while (P[1] == null || F.isZero[P]); + const s = isGreatest(F, P[1]); + if (greatest ^ s) P[1] = F.neg(P[1]); + P[2] = F.one; + if (this.cofactor) P = this.mulScalar(P, this.cofactor); + P = this.affine(P); + return P; + } + toRprLE(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprLE(buff, o, p[0]); + this.F.toRprLE(buff, o + this.F.n8, p[1]); + } + toRprBE(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprBE(buff, o, p[0]); + this.F.toRprBE(buff, o + this.F.n8, p[1]); + } + toRprLEM(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprLEM(buff, o, p[0]); + this.F.toRprLEM(buff, o + this.F.n8, p[1]); + } + toRprLEJM(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprLEM(buff, o, p[0]); + this.F.toRprLEM(buff, o + this.F.n8, p[1]); + this.F.toRprLEM(buff, o + 2 * this.F.n8, p[2]); + } + toRprBEM(buff, o, p) { + p = this.affine(p); + if (this.isZero(p)) { + new Uint8Array(buff, o, this.F.n8 * 2).fill(0); + return; + } + this.F.toRprBEM(buff, o, p[0]); + this.F.toRprBEM(buff, o + this.F.n8, p[1]); + } + fromRprLE(buff, o) { + o = o || 0; + const x = this.F.fromRprLE(buff, o); + const y = this.F.fromRprLE(buff, o + this.F.n8); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + this.F.one + ]; + } + fromRprBE(buff, o) { + o = o || 0; + const x = this.F.fromRprBE(buff, o); + const y = this.F.fromRprBE(buff, o + this.F.n8); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + this.F.one + ]; + } + fromRprLEM(buff, o) { + o = o || 0; + const x = this.F.fromRprLEM(buff, o); + const y = this.F.fromRprLEM(buff, o + this.F.n8); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + this.F.one + ]; + } + fromRprLEJM(buff, o) { + o = o || 0; + const x = this.F.fromRprLEM(buff, o); + const y = this.F.fromRprLEM(buff, o + this.F.n8); + const z = this.F.fromRprLEM(buff, o + this.F.n8 * 2); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + z + ]; + } + fromRprBEM(buff, o) { + o = o || 0; + const x = this.F.fromRprBEM(buff, o); + const y = this.F.fromRprBEM(buff, o + this.F.n8); + if (this.F.isZero(x) && this.F.isZero(y)) return this.zero; + return [ + x, + y, + this.F.one + ]; + } + fromRprCompressed(buff, o) { + const F = this.F; + const v = new Uint8Array(buff.buffer, o, F.n8); + if (v[0] & 64) return this.zero; + const P = new Array(3); + const greatest = (v[0] & 128) != 0; + v[0] = v[0] & 127; + P[0] = F.fromRprBE(buff, o); + if (greatest) v[0] = v[0] | 128; + const x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); + P[1] = F.sqrt(x3b); + if (P[1] === null) throw new Error("Invalid Point!"); + if (greatest ^ isGreatest(F, P[1])) P[1] = F.neg(P[1]); + P[2] = F.one; + return P; + } + toRprCompressed(buff, o, p) { + p = this.affine(p); + const v = new Uint8Array(buff.buffer, o, this.F.n8); + if (this.isZero(p)) { + v.fill(0); + v[0] = 64; + return; + } + this.F.toRprBE(buff, o, p[0]); + if (isGreatest(this.F, p[1])) v[0] = v[0] | 128; + } + fromRprUncompressed(buff, o) { + if (buff[0] & 64) return this.zero; + return this.fromRprBE(buff, o); + } + toRprUncompressed(buff, o, p) { + this.toRprBE(buff, o, p); + if (this.isZero(p)) buff[o] = buff[o] | 64; + } +}; +//#endregion +//#region src/utils.js +var utils_exports = /* @__PURE__ */ require_threadman_thread.__exportAll({ + array2buffer: () => array2buffer, + beBuff2int: () => beBuff2int, + beInt2Buff: () => beInt2Buff, + bitReverse: () => bitReverse, + buffReverseBits: () => buffReverseBits, + buffer2array: () => buffer2array, + leBuff2int: () => leBuff2int, + leInt2Buff: () => leInt2Buff, + log2: () => log2, + stringifyBigInts: () => stringifyBigInts, + stringifyFElements: () => stringifyFElements, + unstringifyBigInts: () => unstringifyBigInts, + unstringifyFElements: () => unstringifyFElements +}); function stringifyBigInts(o) { - if (typeof o == "bigint" || o.eq !== undefined) { - return o.toString(10); - } else if (o instanceof Uint8Array) { - return fromRprLE(o, 0); - } else if (Array.isArray(o)) { - return o.map(stringifyBigInts); - } else if (typeof o == "object") { - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = stringifyBigInts(o[k]); - }); - return res; - } else { - return o; - } + if (typeof o == "bigint" || o.eq !== void 0) return o.toString(10); + else if (o instanceof Uint8Array) return fromRprLE(o, 0); + else if (Array.isArray(o)) return o.map(stringifyBigInts); + else if (typeof o == "object") { + const res = {}; + Object.keys(o).forEach((k) => { + res[k] = stringifyBigInts(o[k]); + }); + return res; + } else return o; } - function unstringifyBigInts(o) { - if (typeof o == "string" && /^[0-9]+$/.test(o)) { - return BigInt(o); - } else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) { - return BigInt(o); - } else if (Array.isArray(o)) { - return o.map(unstringifyBigInts); - } else if (typeof o == "object") { - if (o === null) return null; - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = unstringifyBigInts(o[k]); - }); - return res; - } else { - return o; - } + if (typeof o == "string" && /^[0-9]+$/.test(o)) return BigInt(o); + else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) return BigInt(o); + else if (Array.isArray(o)) return o.map(unstringifyBigInts); + else if (typeof o == "object") { + if (o === null) return null; + const res = {}; + Object.keys(o).forEach((k) => { + res[k] = unstringifyBigInts(o[k]); + }); + return res; + } else return o; } - function beBuff2int(buff) { - let res = BigInt(0); - let i = buff.length; - let offset = 0; - const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); - while (i > 0) { - if (i >= 4) { - i -= 4; - res += BigInt(buffV.getUint32(i)) << BigInt(offset * 8); - offset += 4; - } else if (i >= 2) { - i -= 2; - res += BigInt(buffV.getUint16(i)) << BigInt(offset * 8); - offset += 2; - } else { - i -= 1; - res += BigInt(buffV.getUint8(i)) << BigInt(offset * 8); - offset += 1; - } - } - return res; + let res = BigInt(0); + let i = buff.length; + let offset = 0; + const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); + while (i > 0) if (i >= 4) { + i -= 4; + res += BigInt(buffV.getUint32(i)) << BigInt(offset * 8); + offset += 4; + } else if (i >= 2) { + i -= 2; + res += BigInt(buffV.getUint16(i)) << BigInt(offset * 8); + offset += 2; + } else { + i -= 1; + res += BigInt(buffV.getUint8(i)) << BigInt(offset * 8); + offset += 1; + } + return res; } - function beInt2Buff(n, len) { - let r = n; - const buff = new Uint8Array(len); - const buffV = new DataView(buff.buffer); - let o = len; - while (o > 0) { - if (o - 4 >= 0) { - o -= 4; - buffV.setUint32(o, Number(r & BigInt(0xffffffff))); - r = r >> BigInt(32); - } else if (o - 2 >= 0) { - o -= 2; - buffV.setUint16(o, Number(r & BigInt(0xffff))); - r = r >> BigInt(16); - } else { - o -= 1; - buffV.setUint8(o, Number(r & BigInt(0xff))); - r = r >> BigInt(8); - } - } - if (r) { - throw new Error("Number does not fit in this length"); - } - return buff; + let r = n; + const buff = new Uint8Array(len); + const buffV = new DataView(buff.buffer); + let o = len; + while (o > 0) if (o - 4 >= 0) { + o -= 4; + buffV.setUint32(o, Number(r & BigInt(4294967295))); + r = r >> BigInt(32); + } else if (o - 2 >= 0) { + o -= 2; + buffV.setUint16(o, Number(r & BigInt(65535))); + r = r >> BigInt(16); + } else { + o -= 1; + buffV.setUint8(o, Number(r & BigInt(255))); + r = r >> BigInt(8); + } + if (r) throw new Error("Number does not fit in this length"); + return buff; } - function leBuff2int(buff) { - let res = BigInt(0); - let i = 0; - const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); - while (i < buff.length) { - if (i + 4 <= buff.length) { - res += BigInt(buffV.getUint32(i, true)) << BigInt(i * 8); - i += 4; - } else if (i + 2 <= buff.length) { - res += BigInt(buffV.getUint16(i, true)) << BigInt(i * 8); - i += 2; - } else { - res += BigInt(buffV.getUint8(i, true)) << BigInt(i * 8); - i += 1; - } - } - return res; + let res = BigInt(0); + let i = 0; + const buffV = new DataView(buff.buffer, buff.byteOffset, buff.byteLength); + while (i < buff.length) if (i + 4 <= buff.length) { + res += BigInt(buffV.getUint32(i, true)) << BigInt(i * 8); + i += 4; + } else if (i + 2 <= buff.length) { + res += BigInt(buffV.getUint16(i, true)) << BigInt(i * 8); + i += 2; + } else { + res += BigInt(buffV.getUint8(i, true)) << BigInt(i * 8); + i += 1; + } + return res; } - function leInt2Buff(n, len) { - let r = n; - if (typeof len === "undefined") { - len = Math.floor((bitLength(n) - 1) / 8) + 1; - if (len == 0) len = 1; - } - const buff = new Uint8Array(len); - const buffV = new DataView(buff.buffer); - let o = 0; - while (o < len) { - if (o + 4 <= len) { - buffV.setUint32(o, Number(r & BigInt(0xffffffff)), true); - o += 4; - r = r >> BigInt(32); - } else if (o + 2 <= len) { - buffV.setUint16(o, Number(r & BigInt(0xffff)), true); - o += 2; - r = r >> BigInt(16); - } else { - buffV.setUint8(o, Number(r & BigInt(0xff)), true); - o += 1; - r = r >> BigInt(8); - } - } - if (r) { - throw new Error("Number does not fit in this length"); - } - return buff; + let r = n; + if (typeof len === "undefined") { + len = Math.floor((bitLength(n) - 1) / 8) + 1; + if (len == 0) len = 1; + } + const buff = new Uint8Array(len); + const buffV = new DataView(buff.buffer); + let o = 0; + while (o < len) if (o + 4 <= len) { + buffV.setUint32(o, Number(r & BigInt(4294967295)), true); + o += 4; + r = r >> BigInt(32); + } else if (o + 2 <= len) { + buffV.setUint16(o, Number(r & BigInt(65535)), true); + o += 2; + r = r >> BigInt(16); + } else { + buffV.setUint8(o, Number(r & BigInt(255)), true); + o += 1; + r = r >> BigInt(8); + } + if (r) throw new Error("Number does not fit in this length"); + return buff; } - function stringifyFElements(F, o) { - if (typeof o == "bigint" || o.eq !== undefined) { - return o.toString(10); - } else if (o instanceof Uint8Array) { - return F.toString(F.e(o)); - } else if (Array.isArray(o)) { - return o.map(stringifyFElements.bind(this, F)); - } else if (typeof o == "object") { - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = stringifyFElements(F, o[k]); - }); - return res; - } else { - return o; - } + if (typeof o == "bigint" || o.eq !== void 0) return o.toString(10); + else if (o instanceof Uint8Array) return F.toString(F.e(o)); + else if (Array.isArray(o)) return o.map(stringifyFElements.bind(this, F)); + else if (typeof o == "object") { + const res = {}; + Object.keys(o).forEach((k) => { + res[k] = stringifyFElements(F, o[k]); + }); + return res; + } else return o; } - function unstringifyFElements(F, o) { - if (typeof o == "string" && /^[0-9]+$/.test(o)) { - return F.e(o); - } else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) { - return F.e(o); - } else if (Array.isArray(o)) { - return o.map(unstringifyFElements.bind(this, F)); - } else if (typeof o == "object") { - if (o === null) return null; - const res = {}; - const keys = Object.keys(o); - keys.forEach((k) => { - res[k] = unstringifyFElements(F, o[k]); - }); - return res; - } else { - return o; - } -} - -const _revTable = []; -for (let i = 0; i < 256; i++) { - _revTable[i] = _revSlow(i, 8); + if (typeof o == "string" && /^[0-9]+$/.test(o)) return F.e(o); + else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) return F.e(o); + else if (Array.isArray(o)) return o.map(unstringifyFElements.bind(this, F)); + else if (typeof o == "object") { + if (o === null) return null; + const res = {}; + Object.keys(o).forEach((k) => { + res[k] = unstringifyFElements(F, o[k]); + }); + return res; + } else return o; } - +var _revTable = []; +for (let i = 0; i < 256; i++) _revTable[i] = _revSlow(i, 8); function _revSlow(idx, bits) { - let res = 0; - let a = idx; - for (let i = 0; i < bits; i++) { - res <<= 1; - res = res | (a & 1); - a >>= 1; - } - return res; + let res = 0; + let a = idx; + for (let i = 0; i < bits; i++) { + res <<= 1; + res = res | a & 1; + a >>= 1; + } + return res; } - function bitReverse(idx, bits) { - return ( - (_revTable[idx >>> 24] | - (_revTable[(idx >>> 16) & 0xff] << 8) | - (_revTable[(idx >>> 8) & 0xff] << 16) | - (_revTable[idx & 0xff] << 24)) >>> - (32 - bits) - ); + return (_revTable[idx >>> 24] | _revTable[idx >>> 16 & 255] << 8 | _revTable[idx >>> 8 & 255] << 16 | _revTable[idx & 255] << 24) >>> 32 - bits; } - function log2(V) { - return ( - ((V & 0xffff0000) !== 0 ? ((V &= 0xffff0000), 16) : 0) | - ((V & 0xff00ff00) !== 0 ? ((V &= 0xff00ff00), 8) : 0) | - ((V & 0xf0f0f0f0) !== 0 ? ((V &= 0xf0f0f0f0), 4) : 0) | - ((V & 0xcccccccc) !== 0 ? ((V &= 0xcccccccc), 2) : 0) | - ((V & 0xaaaaaaaa) !== 0) - ); + return ((V & 4294901760) !== 0 ? (V &= 4294901760, 16) : 0) | ((V & 4278255360) !== 0 ? (V &= 4278255360, 8) : 0) | ((V & 4042322160) !== 0 ? (V &= 4042322160, 4) : 0) | ((V & 3435973836) !== 0 ? (V &= 3435973836, 2) : 0) | (V & 2863311530) !== 0; } - function buffReverseBits(buff, eSize) { - const n = buff.byteLength / eSize; - const bits = log2(n); - if (n != 1 << bits) { - throw new Error("Invalid number of pointers"); - } - for (let i = 0; i < n; i++) { - const r = bitReverse(i, bits); - if (i > r) { - const tmp = buff.slice(i * eSize, (i + 1) * eSize); - buff.set(buff.slice(r * eSize, (r + 1) * eSize), i * eSize); - buff.set(tmp, r * eSize); - } - } + const n = buff.byteLength / eSize; + const bits = log2(n); + if (n != 1 << bits) throw new Error("Invalid number of pointers"); + for (let i = 0; i < n; i++) { + const r = bitReverse(i, bits); + if (i > r) { + const tmp = buff.slice(i * eSize, (i + 1) * eSize); + buff.set(buff.slice(r * eSize, (r + 1) * eSize), i * eSize); + buff.set(tmp, r * eSize); + } + } } - function array2buffer(arr, sG) { - const buff = new Uint8Array(sG * arr.length); - - for (let i = 0; i < arr.length; i++) { - buff.set(arr[i], i * sG); - } - - return buff; + const buff = new Uint8Array(sG * arr.length); + for (let i = 0; i < arr.length; i++) buff.set(arr[i], i * sG); + return buff; } - function buffer2array(buff, sG) { - const n = buff.byteLength / sG; - const arr = new Array(n); - for (let i = 0; i < n; i++) { - arr[i] = buff.slice(i * sG, i * sG + sG); - } - return arr; + const n = buff.byteLength / sG; + const arr = new Array(n); + for (let i = 0; i < n; i++) arr[i] = buff.slice(i * sG, i * sG + sG); + return arr; } - -var _utils = /*#__PURE__*/Object.freeze({ - __proto__: null, - array2buffer: array2buffer, - beBuff2int: beBuff2int, - beInt2Buff: beInt2Buff, - bitReverse: bitReverse, - buffReverseBits: buffReverseBits, - buffer2array: buffer2array, - leBuff2int: leBuff2int, - leInt2Buff: leInt2Buff, - log2: log2, - stringifyBigInts: stringifyBigInts, - stringifyFElements: stringifyFElements, - unstringifyBigInts: unstringifyBigInts, - unstringifyFElements: unstringifyFElements -}); - -const PAGE_SIZE = ( typeof Buffer !== "undefined" && Buffer.constants && Buffer.constants.MAX_LENGTH ) ? Buffer.constants.MAX_LENGTH : (1 << 30); - -class BigBuffer { - - constructor(size) { - this.buffers = []; - this.byteLength = size; - for (let i=0; i0) { - // bytes to copy from this page - const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r; - const srcView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset+o, l); - if (l == len) return srcView.slice(); - if (!buff) { - if (len <= PAGE_SIZE) { - buff = new Uint8Array(len); - } else { - buff = new BigBuffer(len); - } - } - buff.set(srcView, len-r); - r = r-l; - p ++; - o = 0; - } - - return buff; - } - - set(buff, offset) { - if (offset === undefined) offset = 0; - - const len = buff.byteLength; - - if (len==0) return; - - const firstPage = Math.floor(offset / PAGE_SIZE); - const lastPage = Math.floor((offset+len-1) / PAGE_SIZE); - - if (firstPage == lastPage) { - if ((buff instanceof BigBuffer)&&(buff.buffers.length==1)) { - return this.buffers[firstPage].set(buff.buffers[0], offset % PAGE_SIZE); - } else { - return this.buffers[firstPage].set(buff, offset % PAGE_SIZE); - } - - } - - - let p = firstPage; - let o = offset % PAGE_SIZE; - let r = len; - while (r>0) { - const l = (o+r > PAGE_SIZE) ? (PAGE_SIZE -o) : r; - const srcView = buff.slice( len -r, len -r+l); - const dstView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset + o, l); - dstView.set(srcView); - r = r-l; - p ++; - o = 0; - } - - } -} - +//#endregion +//#region src/bigbuffer.js +var PAGE_SIZE = typeof Buffer !== "undefined" && Buffer.constants && Buffer.constants.MAX_LENGTH ? Buffer.constants.MAX_LENGTH : 1 << 30; +var BigBuffer = class BigBuffer { + constructor(size) { + this.buffers = []; + this.byteLength = size; + for (let i = 0; i < size; i += PAGE_SIZE) { + const n = Math.min(size - i, PAGE_SIZE); + this.buffers.push(new Uint8Array(n)); + } + } + slice(fr, to) { + if (to === void 0) to = this.byteLength; + if (fr === void 0) fr = 0; + const len = to - fr; + const firstPage = Math.floor(fr / PAGE_SIZE); + if (firstPage == Math.floor((fr + len - 1) / PAGE_SIZE) || len == 0) return this.buffers[firstPage].slice(fr % PAGE_SIZE, fr % PAGE_SIZE + len); + let buff; + let p = firstPage; + let o = fr % PAGE_SIZE; + let r = len; + while (r > 0) { + const l = o + r > PAGE_SIZE ? PAGE_SIZE - o : r; + const srcView = new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset + o, l); + if (l == len) return srcView.slice(); + if (!buff) if (len <= PAGE_SIZE) buff = new Uint8Array(len); + else buff = new BigBuffer(len); + buff.set(srcView, len - r); + r = r - l; + p++; + o = 0; + } + return buff; + } + set(buff, offset) { + if (offset === void 0) offset = 0; + const len = buff.byteLength; + if (len == 0) return; + const firstPage = Math.floor(offset / PAGE_SIZE); + if (firstPage == Math.floor((offset + len - 1) / PAGE_SIZE)) if (buff instanceof BigBuffer && buff.buffers.length == 1) return this.buffers[firstPage].set(buff.buffers[0], offset % PAGE_SIZE); + else return this.buffers[firstPage].set(buff, offset % PAGE_SIZE); + let p = firstPage; + let o = offset % PAGE_SIZE; + let r = len; + while (r > 0) { + const l = o + r > PAGE_SIZE ? PAGE_SIZE - o : r; + const srcView = buff.slice(len - r, len - r + l); + new Uint8Array(this.buffers[p].buffer, this.buffers[p].byteOffset + o, l).set(srcView); + r = r - l; + p++; + o = 0; + } + } +}; +//#endregion +//#region src/engine_batchconvert.js function buildBatchConvert(tm, fnName, sIn, sOut) { - return async function batchConvert(buffIn) { - const nPoints = Math.floor(buffIn.byteLength / sIn); - if ( nPoints * sIn !== buffIn.byteLength) { - throw new Error("Invalid buffer size"); - } - const pointsPerChunk = Math.floor(nPoints/tm.concurrency); - const opPromises = []; - for (let i=0; i=0; i--) { - this.w[i] = this.square(this.w[i+1]); - } - - if (!this.eq(this.w[0], this.one)) { - throw new Error("Error calculating roots of unity"); - } - - this.batchToMontgomery = buildBatchConvert(tm, prefix + "_batchToMontgomery", this.n8, this.n8); - this.batchFromMontgomery = buildBatchConvert(tm, prefix + "_batchFromMontgomery", this.n8, this.n8); - } - - - op2(opName, a, b) { - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - op2Bool(opName, a, b) { - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); - } - - op1(opName, a) { - this.tm.setBuff(this.pOp1, a); - this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - op1Bool(opName, a) { - this.tm.setBuff(this.pOp1, a); - return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); - } - - add(a,b) { - return this.op2("_add", a, b); - } - - - eq(a,b) { - return this.op2Bool("_eq", a, b); - } - - isZero(a) { - return this.op1Bool("_isZero", a); - } - - sub(a,b) { - return this.op2("_sub", a, b); - } - - neg(a) { - return this.op1("_neg", a); - } - - inv(a) { - return this.op1("_inverse", a); - } - - toMontgomery(a) { - return this.op1("_toMontgomery", a); - } - - fromMontgomery(a) { - return this.op1("_fromMontgomery", a); - } - - mul(a,b) { - return this.op2("_mul", a, b); - } - - div(a, b) { - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); - this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - square(a) { - return this.op1("_square", a); - } - - isSquare(a) { - return this.op1Bool("_isSquare", a); - } - - sqrt(a) { - return this.op1("_sqrt", a); - } - - exp(a, b) { - if (!(b instanceof Uint8Array)) { - b = toLEBuff(e(b)); - } - this.tm.setBuff(this.pOp1, a); - this.tm.setBuff(this.pOp2, b); - this.tm.instance.exports[this.prefix + "_exp"](this.pOp1, this.pOp2, b.byteLength, this.pOp3); - return this.tm.getBuff(this.pOp3, this.n8); - } - - isNegative(a) { - return this.op1Bool("_isNegative", a); - } - - e(a, b) { - if (a instanceof Uint8Array) return a; - let ra = e(a, b); - if (isNegative(ra)) { - ra = neg(ra); - if (gt(ra, this.p)) { - ra = mod(ra, this.p); - } - ra = sub(this.p, ra); - } else { - if (gt(ra, this.p)) { - ra = mod(ra, this.p); - } - } - const buff = leInt2Buff(ra, this.n8); - return this.toMontgomery(buff); - } - - toString(a, radix) { - const an = this.fromMontgomery(a); - const s = fromRprLE(an, 0); - return toString(s, radix); - } - - fromRng(rng) { - let v; - const buff = new Uint8Array(this.n8); - do { - v = zero; - for (let i=0; i= 0; i--) this.w[i] = this.square(this.w[i + 1]); + if (!this.eq(this.w[0], this.one)) throw new Error("Error calculating roots of unity"); + this.batchToMontgomery = buildBatchConvert(tm, prefix + "_batchToMontgomery", this.n8, this.n8); + this.batchFromMontgomery = buildBatchConvert(tm, prefix + "_batchFromMontgomery", this.n8, this.n8); + } + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op2Bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); + } + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } + add(a, b) { + return this.op2("_add", a, b); + } + eq(a, b) { + return this.op2Bool("_eq", a, b); + } + isZero(a) { + return this.op1Bool("_isZero", a); + } + sub(a, b) { + return this.op2("_sub", a, b); + } + neg(a) { + return this.op1("_neg", a); + } + inv(a) { + return this.op1("_inverse", a); + } + toMontgomery(a) { + return this.op1("_toMontgomery", a); + } + fromMontgomery(a) { + return this.op1("_fromMontgomery", a); + } + mul(a, b) { + return this.op2("_mul", a, b); + } + div(a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); + this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + square(a) { + return this.op1("_square", a); + } + isSquare(a) { + return this.op1Bool("_isSquare", a); + } + sqrt(a) { + return this.op1("_sqrt", a); + } + exp(a, b) { + if (!(b instanceof Uint8Array)) b = toLEBuff(e(b)); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_exp"](this.pOp1, this.pOp2, b.byteLength, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + isNegative(a) { + return this.op1Bool("_isNegative", a); + } + e(a, b) { + if (a instanceof Uint8Array) return a; + let ra = e(a, b); + if (isNegative(ra)) { + ra = neg(ra); + if (gt(ra, this.p)) ra = mod(ra, this.p); + ra = sub(this.p, ra); + } else if (gt(ra, this.p)) ra = mod(ra, this.p); + const buff = leInt2Buff(ra, this.n8); + return this.toMontgomery(buff); + } + toString(a, radix) { + return toString(fromRprLE(this.fromMontgomery(a), 0), radix); + } + fromRng(rng) { + let v; + const buff = new Uint8Array(this.n8); + do { + v = zero; + for (let i = 0; i < this.n64; i++) v = add(v, shiftLeft(rng.nextU64(), 64 * i)); + v = band(v, this.mask); + } while (geq(v, this.p)); + toRprLE(buff, 0, v, this.n8); + return buff; + } + random() { + return this.fromRng(getThreadRng()); + } + toObject(a) { + return fromRprLE(this.fromMontgomery(a), 0); + } + fromObject(a) { + const buff = new Uint8Array(this.n8); + toRprLE(buff, 0, a, this.n8); + return this.toMontgomery(buff); + } + toRprLE(buff, offset, a) { + buff.set(this.fromMontgomery(a), offset); + } + toRprBE(buff, offset, a) { + const buff2 = this.fromMontgomery(a); + for (let i = 0; i < this.n8 / 2; i++) { + const aux = buff2[i]; + buff2[i] = buff2[this.n8 - 1 - i]; + buff2[this.n8 - 1 - i] = aux; + } + buff.set(buff2, offset); + } + fromRprLE(buff, offset) { + offset = offset || 0; + const res = buff.slice(offset, offset + this.n8); + return this.toMontgomery(res); + } + async batchInverse(buffIn) { + let returnArray = false; + const sIn = this.n8; + const sOut = this.n8; + if (Array.isArray(buffIn)) { + buffIn = array2buffer(buffIn, sIn); + returnArray = true; + } else buffIn = buffIn.slice(0, buffIn.byteLength); + const nPoints = Math.floor(buffIn.byteLength / sIn); + if (nPoints * sIn !== buffIn.byteLength) throw new Error("Invalid buffer size"); + const pointsPerChunk = Math.floor(nPoints / this.tm.concurrency); + const opPromises = []; + for (let i = 0; i < this.tm.concurrency; i++) { + let n; + if (i < this.tm.concurrency - 1) n = pointsPerChunk; + else n = nPoints - i * pointsPerChunk; + if (n == 0) continue; + const buffChunk = buffIn.slice(i * pointsPerChunk * sIn, i * pointsPerChunk * sIn + n * sIn); + const task = [ + { + cmd: "ALLOCSET", + var: 0, + buff: buffChunk + }, + { + cmd: "ALLOC", + var: 1, + len: sOut * n + }, + { + cmd: "CALL", + fnName: this.prefix + "_batchInverse", + params: [ + { var: 0 }, + { val: sIn }, + { val: n }, + { var: 1 }, + { val: sOut } + ] + }, + { + cmd: "GET", + out: 0, + var: 1, + len: sOut * n + } + ]; + opPromises.push(this.tm.queueAction(task, [buffChunk.buffer])); + } + const result = await Promise.all(opPromises); + let fullBuffOut; + if (buffIn instanceof BigBuffer) fullBuffOut = new BigBuffer(nPoints * sOut); + else fullBuffOut = new Uint8Array(nPoints * sOut); + let p = 0; + for (let i = 0; i < result.length; i++) { + fullBuffOut.set(result[i][0], p); + p += result[i][0].byteLength; + } + if (returnArray) return buffer2array(fullBuffOut, sOut); + else return fullBuffOut; + } +}; +//#endregion +//#region src/wasm_field2.js +var WasmField2 = class { + constructor(tm, prefix, F) { + this.tm = tm; + this.prefix = prefix; + this.F = F; + this.type = "F2"; + this.m = F.m * 2; + this.n8 = this.F.n8 * 2; + this.n32 = this.F.n32 * 2; + this.n64 = this.F.n64 * 2; + this.pOp1 = tm.alloc(F.n8 * 2); + this.pOp2 = tm.alloc(F.n8 * 2); + this.pOp3 = tm.alloc(F.n8 * 2); + this.tm.instance.exports[prefix + "_zero"](this.pOp1); + this.zero = tm.getBuff(this.pOp1, this.n8); + this.tm.instance.exports[prefix + "_one"](this.pOp1); + this.one = tm.getBuff(this.pOp1, this.n8); + this.negone = this.neg(this.one); + this.two = this.add(this.one, this.one); + } + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op2Bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); + } + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } + add(a, b) { + return this.op2("_add", a, b); + } + eq(a, b) { + return this.op2Bool("_eq", a, b); + } + isZero(a) { + return this.op1Bool("_isZero", a); + } + sub(a, b) { + return this.op2("_sub", a, b); + } + neg(a) { + return this.op1("_neg", a); + } + inv(a) { + return this.op1("_inverse", a); + } + isNegative(a) { + return this.op1Bool("_isNegative", a); + } + toMontgomery(a) { + return this.op1("_toMontgomery", a); + } + fromMontgomery(a) { + return this.op1("_fromMontgomery", a); + } + mul(a, b) { + return this.op2("_mul", a, b); + } + mul1(a, b) { + return this.op2("_mul1", a, b); + } + div(a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); + this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + square(a) { + return this.op1("_square", a); + } + isSquare(a) { + return this.op1Bool("_isSquare", a); + } + sqrt(a) { + return this.op1("_sqrt", a); + } + exp(a, b) { + if (!(b instanceof Uint8Array)) b = toLEBuff(e(b)); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_exp"](this.pOp1, this.pOp2, b.byteLength, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + e(a, b) { + if (a instanceof Uint8Array) return a; + if (Array.isArray(a) && a.length == 2) { + const c1 = this.F.e(a[0], b); + const c2 = this.F.e(a[1], b); + const res = new Uint8Array(this.F.n8 * 2); + res.set(c1); + res.set(c2, this.F.n8 * 2); + return res; + } else throw new Error("invalid F2"); + } + toString(a, radix) { + return `[${this.F.toString(a.slice(0, this.F.n8), radix)}, ${this.F.toString(a.slice(this.F.n8), radix)}]`; + } + fromRng(rng) { + const c1 = this.F.fromRng(rng); + const c2 = this.F.fromRng(rng); + const res = new Uint8Array(this.F.n8 * 2); + res.set(c1); + res.set(c2, this.F.n8); + return res; + } + random() { + return this.fromRng(getThreadRng()); + } + toObject(a) { + return [this.F.toObject(a.slice(0, this.F.n8)), this.F.toObject(a.slice(this.F.n8, this.F.n8 * 2))]; + } + fromObject(a) { + const buff = new Uint8Array(this.F.n8 * 2); + const b1 = this.F.fromObject(a[0]); + const b2 = this.F.fromObject(a[1]); + buff.set(b1); + buff.set(b2, this.F.n8); + return buff; + } + c1(a) { + return a.slice(0, this.F.n8); + } + c2(a) { + return a.slice(this.F.n8); + } +}; +//#endregion +//#region src/wasm_field3.js +var WasmField3 = class { + constructor(tm, prefix, F) { + this.tm = tm; + this.prefix = prefix; + this.F = F; + this.type = "F3"; + this.m = F.m * 3; + this.n8 = this.F.n8 * 3; + this.n32 = this.F.n32 * 3; + this.n64 = this.F.n64 * 3; + this.pOp1 = tm.alloc(F.n8 * 3); + this.pOp2 = tm.alloc(F.n8 * 3); + this.pOp3 = tm.alloc(F.n8 * 3); + this.tm.instance.exports[prefix + "_zero"](this.pOp1); + this.zero = tm.getBuff(this.pOp1, this.n8); + this.tm.instance.exports[prefix + "_one"](this.pOp1); + this.one = tm.getBuff(this.pOp1, this.n8); + this.negone = this.neg(this.one); + this.two = this.add(this.one, this.one); + } + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op2Bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2); + } + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } + eq(a, b) { + return this.op2Bool("_eq", a, b); + } + isZero(a) { + return this.op1Bool("_isZero", a); + } + add(a, b) { + return this.op2("_add", a, b); + } + sub(a, b) { + return this.op2("_sub", a, b); + } + neg(a) { + return this.op1("_neg", a); + } + inv(a) { + return this.op1("_inverse", a); + } + isNegative(a) { + return this.op1Bool("_isNegative", a); + } + toMontgomery(a) { + return this.op1("_toMontgomery", a); + } + fromMontgomery(a) { + return this.op1("_fromMontgomery", a); + } + mul(a, b) { + return this.op2("_mul", a, b); + } + div(a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_inverse"](this.pOp2, this.pOp2); + this.tm.instance.exports[this.prefix + "_mul"](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.n8); + } + square(a) { + return this.op1("_square", a); + } + isSquare(a) { + return this.op1Bool("_isSquare", a); + } + sqrt(a) { + return this.op1("_sqrt", a); + } + exp(a, b) { + if (!(b instanceof Uint8Array)) b = toLEBuff(e(b)); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + "_exp"](this.pOp1, this.pOp2, b.byteLength, this.pOp3); + return this.getBuff(this.pOp3, this.n8); + } + e(a, b) { + if (a instanceof Uint8Array) return a; + if (Array.isArray(a) && a.length == 3) { + const c1 = this.F.e(a[0], b); + const c2 = this.F.e(a[1], b); + const c3 = this.F.e(a[2], b); + const res = new Uint8Array(this.F.n8 * 3); + res.set(c1); + res.set(c2, this.F.n8); + res.set(c3, this.F.n8 * 2); + return res; + } else throw new Error("invalid F3"); + } + toString(a, radix) { + return `[${this.F.toString(a.slice(0, this.F.n8), radix)}, ${this.F.toString(a.slice(this.F.n8, this.F.n8 * 2), radix)}, ${this.F.toString(a.slice(this.F.n8 * 2), radix)}]`; + } + fromRng(rng) { + const c1 = this.F.fromRng(rng); + const c2 = this.F.fromRng(rng); + const c3 = this.F.fromRng(rng); + const res = new Uint8Array(this.F.n8 * 3); + res.set(c1); + res.set(c2, this.F.n8); + res.set(c3, this.F.n8 * 2); + return res; + } + random() { + return this.fromRng(getThreadRng()); + } + toObject(a) { + return [ + this.F.toObject(a.slice(0, this.F.n8)), + this.F.toObject(a.slice(this.F.n8, this.F.n8 * 2)), + this.F.toObject(a.slice(this.F.n8 * 2, this.F.n8 * 3)) + ]; + } + fromObject(a) { + const buff = new Uint8Array(this.F.n8 * 3); + const b1 = this.F.fromObject(a[0]); + const b2 = this.F.fromObject(a[1]); + const b3 = this.F.fromObject(a[2]); + buff.set(b1); + buff.set(b2, this.F.n8); + buff.set(b3, this.F.n8 * 2); + return buff; + } + c1(a) { + return a.slice(0, this.F.n8); + } + c2(a) { + return a.slice(this.F.n8, this.F.n8 * 2); + } + c3(a) { + return a.slice(this.F.n8 * 2); + } +}; +//#endregion +//#region src/wasm_curve.js +var WasmCurve = class { + constructor(tm, prefix, F, pGen, pGb, cofactor) { + this.tm = tm; + this.prefix = prefix; + this.F = F; + this.pOp1 = tm.alloc(F.n8 * 3); + this.pOp2 = tm.alloc(F.n8 * 3); + this.pOp3 = tm.alloc(F.n8 * 3); + this.tm.instance.exports[prefix + "_zero"](this.pOp1); + this.zero = this.tm.getBuff(this.pOp1, F.n8 * 3); + this.tm.instance.exports[prefix + "_zeroAffine"](this.pOp1); + this.zeroAffine = this.tm.getBuff(this.pOp1, F.n8 * 2); + this.one = this.tm.getBuff(pGen, F.n8 * 3); + this.g = this.one; + this.oneAffine = this.tm.getBuff(pGen, F.n8 * 2); + this.gAffine = this.oneAffine; + this.b = this.tm.getBuff(pGb, F.n8); + if (cofactor) this.cofactor = toLEBuff(cofactor); + this.negone = this.neg(this.one); + this.two = this.add(this.one, this.one); + this.batchLEMtoC = buildBatchConvert(tm, prefix + "_batchLEMtoC", F.n8 * 2, F.n8); + this.batchLEMtoU = buildBatchConvert(tm, prefix + "_batchLEMtoU", F.n8 * 2, F.n8 * 2); + this.batchCtoLEM = buildBatchConvert(tm, prefix + "_batchCtoLEM", F.n8, F.n8 * 2); + this.batchUtoLEM = buildBatchConvert(tm, prefix + "_batchUtoLEM", F.n8 * 2, F.n8 * 2); + this.batchToJacobian = buildBatchConvert(tm, prefix + "_batchToJacobian", F.n8 * 2, F.n8 * 3); + this.batchToAffine = buildBatchConvert(tm, prefix + "_batchToAffine", F.n8 * 3, F.n8 * 2); + } + op2(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 3); + } + op2bool(opName, a, b) { + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, b); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp2, this.pOp3); + } + op1(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 3); + } + op1Affine(opName, a) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 2); + } + op1Bool(opName, a) { + this.tm.setBuff(this.pOp1, a); + return !!this.tm.instance.exports[this.prefix + opName](this.pOp1, this.pOp3); + } + add(a, b) { + if (a.byteLength == this.F.n8 * 3) if (b.byteLength == this.F.n8 * 3) return this.op2("_add", a, b); + else if (b.byteLength == this.F.n8 * 2) return this.op2("_addMixed", a, b); + else throw new Error("invalid point size"); + else if (a.byteLength == this.F.n8 * 2) if (b.byteLength == this.F.n8 * 3) return this.op2("_addMixed", b, a); + else if (b.byteLength == this.F.n8 * 2) return this.op2("_addAffine", a, b); + else throw new Error("invalid point size"); + else throw new Error("invalid point size"); + } + sub(a, b) { + if (a.byteLength == this.F.n8 * 3) if (b.byteLength == this.F.n8 * 3) return this.op2("_sub", a, b); + else if (b.byteLength == this.F.n8 * 2) return this.op2("_subMixed", a, b); + else throw new Error("invalid point size"); + else if (a.byteLength == this.F.n8 * 2) if (b.byteLength == this.F.n8 * 3) return this.op2("_subMixed", b, a); + else if (b.byteLength == this.F.n8 * 2) return this.op2("_subAffine", a, b); + else throw new Error("invalid point size"); + else throw new Error("invalid point size"); + } + neg(a) { + if (a.byteLength == this.F.n8 * 3) return this.op1("_neg", a); + else if (a.byteLength == this.F.n8 * 2) return this.op1Affine("_negAffine", a); + else throw new Error("invalid point size"); + } + double(a) { + if (a.byteLength == this.F.n8 * 3) return this.op1("_double", a); + else if (a.byteLength == this.F.n8 * 2) return this.op1("_doubleAffine", a); + else throw new Error("invalid point size"); + } + isZero(a) { + if (a.byteLength == this.F.n8 * 3) return this.op1Bool("_isZero", a); + else if (a.byteLength == this.F.n8 * 2) return this.op1Bool("_isZeroAffine", a); + else throw new Error("invalid point size"); + } + timesScalar(a, s) { + if (!(s instanceof Uint8Array)) s = toLEBuff(e(s)); + let fnName; + if (a.byteLength == this.F.n8 * 3) fnName = this.prefix + "_timesScalar"; + else if (a.byteLength == this.F.n8 * 2) fnName = this.prefix + "_timesScalarAffine"; + else throw new Error("invalid point size"); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, s); + this.tm.instance.exports[fnName](this.pOp1, this.pOp2, s.byteLength, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 3); + } + timesFr(a, s) { + let fnName; + if (a.byteLength == this.F.n8 * 3) fnName = this.prefix + "_timesFr"; + else if (a.byteLength == this.F.n8 * 2) fnName = this.prefix + "_timesFrAffine"; + else throw new Error("invalid point size"); + this.tm.setBuff(this.pOp1, a); + this.tm.setBuff(this.pOp2, s); + this.tm.instance.exports[fnName](this.pOp1, this.pOp2, this.pOp3); + return this.tm.getBuff(this.pOp3, this.F.n8 * 3); + } + eq(a, b) { + if (a.byteLength == this.F.n8 * 3) if (b.byteLength == this.F.n8 * 3) return this.op2bool("_eq", a, b); + else if (b.byteLength == this.F.n8 * 2) return this.op2bool("_eqMixed", a, b); + else throw new Error("invalid point size"); + else if (a.byteLength == this.F.n8 * 2) if (b.byteLength == this.F.n8 * 3) return this.op2bool("_eqMixed", b, a); + else if (b.byteLength == this.F.n8 * 2) return this.op2bool("_eqAffine", a, b); + else throw new Error("invalid point size"); + else throw new Error("invalid point size"); + } + toAffine(a) { + if (a.byteLength == this.F.n8 * 3) return this.op1Affine("_toAffine", a); + else if (a.byteLength == this.F.n8 * 2) return a; + else throw new Error("invalid point size"); + } + toJacobian(a) { + if (a.byteLength == this.F.n8 * 3) return a; + else if (a.byteLength == this.F.n8 * 2) return this.op1("_toJacobian", a); + else throw new Error("invalid point size"); + } + toRprUncompressed(arr, offset, a) { + this.tm.setBuff(this.pOp1, a); + if (a.byteLength == this.F.n8 * 3) this.tm.instance.exports[this.prefix + "_toAffine"](this.pOp1, this.pOp1); + else if (a.byteLength != this.F.n8 * 2) throw new Error("invalid point size"); + this.tm.instance.exports[this.prefix + "_LEMtoU"](this.pOp1, this.pOp1); + const res = this.tm.getBuff(this.pOp1, this.F.n8 * 2); + arr.set(res, offset); + } + fromRprUncompressed(arr, offset) { + const buff = arr.slice(offset, offset + this.F.n8 * 2); + this.tm.setBuff(this.pOp1, buff); + this.tm.instance.exports[this.prefix + "_UtoLEM"](this.pOp1, this.pOp1); + return this.tm.getBuff(this.pOp1, this.F.n8 * 2); + } + toRprCompressed(arr, offset, a) { + this.tm.setBuff(this.pOp1, a); + if (a.byteLength == this.F.n8 * 3) this.tm.instance.exports[this.prefix + "_toAffine"](this.pOp1, this.pOp1); + else if (a.byteLength != this.F.n8 * 2) throw new Error("invalid point size"); + this.tm.instance.exports[this.prefix + "_LEMtoC"](this.pOp1, this.pOp1); + const res = this.tm.getBuff(this.pOp1, this.F.n8); + arr.set(res, offset); + } + fromRprCompressed(arr, offset) { + const buff = arr.slice(offset, offset + this.F.n8); + this.tm.setBuff(this.pOp1, buff); + this.tm.instance.exports[this.prefix + "_CtoLEM"](this.pOp1, this.pOp2); + return this.tm.getBuff(this.pOp2, this.F.n8 * 2); + } + toUncompressed(a) { + const buff = new Uint8Array(this.F.n8 * 2); + this.toRprUncompressed(buff, 0, a); + return buff; + } + toRprLEM(arr, offset, a) { + if (a.byteLength == this.F.n8 * 2) { + arr.set(a, offset); + return; + } else if (a.byteLength == this.F.n8 * 3) { + this.tm.setBuff(this.pOp1, a); + this.tm.instance.exports[this.prefix + "_toAffine"](this.pOp1, this.pOp1); + const res = this.tm.getBuff(this.pOp1, this.F.n8 * 2); + arr.set(res, offset); + } else throw new Error("invalid point size"); + } + fromRprLEM(arr, offset) { + offset = offset || 0; + return arr.slice(offset, offset + this.F.n8 * 2); + } + toString(a, radix) { + if (a.byteLength == this.F.n8 * 3) return `[ ${this.F.toString(a.slice(0, this.F.n8), radix)}, ${this.F.toString(a.slice(this.F.n8, this.F.n8 * 2), radix)}, ${this.F.toString(a.slice(this.F.n8 * 2), radix)} ]`; + else if (a.byteLength == this.F.n8 * 2) return `[ ${this.F.toString(a.slice(0, this.F.n8), radix)}, ${this.F.toString(a.slice(this.F.n8), radix)} ]`; + else throw new Error("invalid point size"); + } + isValid(a) { + if (this.isZero(a)) return true; + const F = this.F; + const aa = this.toAffine(a); + const x = aa.slice(0, this.F.n8); + const y = aa.slice(this.F.n8, this.F.n8 * 2); + const x3b = F.add(F.mul(F.square(x), x), this.b); + const y2 = F.square(y); + return F.eq(x3b, y2); + } + fromRng(rng) { + const F = this.F; + let P = []; + let greatest; + let x3b; + do { + P[0] = F.fromRng(rng); + greatest = rng.nextBool(); + x3b = F.add(F.mul(F.square(P[0]), P[0]), this.b); + } while (!F.isSquare(x3b)); + P[1] = F.sqrt(x3b); + const s = F.isNegative(P[1]); + if (greatest ^ s) P[1] = F.neg(P[1]); + let Pbuff = new Uint8Array(this.F.n8 * 2); + Pbuff.set(P[0]); + Pbuff.set(P[1], this.F.n8); + if (this.cofactor) Pbuff = this.timesScalar(Pbuff, this.cofactor); + return Pbuff; + } + toObject(a) { + if (this.isZero(a)) return [ + this.F.toObject(this.F.zero), + this.F.toObject(this.F.one), + this.F.toObject(this.F.zero) + ]; + const x = this.F.toObject(a.slice(0, this.F.n8)); + const y = this.F.toObject(a.slice(this.F.n8, this.F.n8 * 2)); + let z; + if (a.byteLength == this.F.n8 * 3) z = this.F.toObject(a.slice(this.F.n8 * 2, this.F.n8 * 3)); + else z = this.F.toObject(this.F.one); + return [ + x, + y, + z + ]; + } + fromObject(a) { + const x = this.F.fromObject(a[0]); + const y = this.F.fromObject(a[1]); + let z; + if (a.length == 3) z = this.F.fromObject(a[2]); + else z = this.F.one; + if (this.F.isZero(z, this.F.one)) return this.zeroAffine; + else if (this.F.eq(z, this.F.one)) { + const buff = new Uint8Array(this.F.n8 * 2); + buff.set(x); + buff.set(y, this.F.n8); + return buff; + } else { + const buff = new Uint8Array(this.F.n8 * 3); + buff.set(x); + buff.set(y, this.F.n8); + buff.set(z, this.F.n8 * 2); + return buff; + } + } + e(a) { + if (a instanceof Uint8Array) return a; + return this.fromObject(a); + } + x(a) { + return this.toAffine(a).slice(0, this.F.n8); + } + y(a) { + return this.toAffine(a).slice(this.F.n8); + } +}; +//#endregion +//#region src/threadman.node.js +function getConcurrency() { + return os.default.cpus().length || 2; } - -/* global WebAssembly */ - -function thread(self) { - const MAXMEM = 32767; - let instance; - let memory; - let terminationTimeout = 500; // milliseconds - let terminationTimer; - - if (self) { - self.onmessage = function(e) { - let data; - if (e.data) { - data = e.data; - } else { - data = e; - } - - try { - if (data[0].cmd === "INIT") { - init(data[0]).then(function() { - console.log("INIT DONE"); - self.postMessage({status: "initialized"}); - }); - } else if (data[0].cmd === "TERMINATE") { - terminate(); - } else { - let terminateAfterTask = false; - if (data[data.length-1].cmd === "TERMINATE") { - terminateAfterTask = true; - data.pop(); - //terminationTimeout = 1; - } - const res = runTask(data); - //self.postMessage(res); - let transfers = []; - for (let i=0; i memory.buffer.byteLength) { - const currentPages = memory.buffer.byteLength / 0x10000; - let requiredPages = Math.floor((u32[0] + length) / 0x10000)+1; - if (requiredPages>MAXMEM) requiredPages=MAXMEM; - memory.grow(requiredPages-currentPages); - console.log("Growing memory to", memory.buffer.byteLength / 1024 / 1024, "MB"); - } - return res; - } - - function allocBuffer(buffer) { - const p = alloc(buffer.byteLength); - setBuffer(p, buffer); - return p; - } - - function getBuffer(pointer, length) { - // const u8 = new Uint8Array(memory.buffer); - // return new Uint8Array(u8.buffer, u8.byteOffset + pointer, length); - return new Uint8Array(memory.buffer, pointer, length); - } - - function setBuffer(pointer, buffer) { - const u8 = new Uint8Array(memory.buffer); - u8.set(new Uint8Array(buffer), pointer); - } - - function runTask(task) { - clearTimeout(terminationTimer); - if (task[0].cmd === "INIT") { - return init(task[0]); - } - const ctx = { - vars: [], - out: [] - }; - const u32a = new Uint32Array(memory.buffer, 0, 1); - const oldAlloc = u32a[0]; - for (let i=0; i0) { - terminationTimer = setTimeout( () => { - console.log("Shutting down thread due to inactivity"); - terminate(); - }, terminationTimeout); - } - } - - function terminate() { - clearTimeout(terminationTimer); - instance = null; - memory = null; - if (self) { - console.log("TERMINATE"); - self.postMessage({status: "terminated"}); - self.close(); - } - } - - return runTask; +function getWorkerType() { + return "thread"; } - -/* - Copyright 2019 0KIMS association. - - This file is part of wasmsnark (Web Assembly zkSnark Prover). - - wasmsnark is a free software: you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - wasmsnark is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with wasmsnark. If not, see . -*/ - -// const MEM_SIZE = 1000; // Memory size in 64K Pakes (512Mb) -const MEM_SIZE = 25; // Memory size in 64K Pakes (1600Kb) - -class Deferred { - constructor() { - this.promise = new Promise((resolve, reject)=> { - this.reject = reject; - this.resolve = resolve; - }); - } +function supportsWorkers() { + return true; } - -let workerSource; - -const threadStr = `(${thread.toString()})(self)`; -if(process.browser) { - if(globalThis?.Blob) { - const threadBytes= new TextEncoder().encode(threadStr); - const workerBlob = new Blob([threadBytes], { type: "application/javascript" }) ; - workerSource = URL.createObjectURL(workerBlob); - } else { - workerSource = "data:application/javascript;base64," + globalThis.btoa(threadStr); - } -} else { - workerSource = "data:application/javascript;base64," + Buffer.from(threadStr).toString("base64"); +function getWorkerSource() { + if (typeof __dirname !== "undefined") return (0, path.resolve)(__dirname, "threadman_worker.cjs"); + return (0, url.fileURLToPath)(new URL("data:text/javascript;base64,LyoqCiAqIFN0YW5kYWxvbmUgd29ya2VyIGVudHJ5LXBvaW50IGZvciBOb2RlLmpzICh3b3JrZXJfdGhyZWFkcykuCiAqCiAqIFRoaXMgZmlsZSBpcyBjb21waWxlZCBieSByb2xsdXAgaW50byBidWlsZC90aHJlYWRtYW5fd29ya2VyLmNqcyBhbmQgbG9hZGVkCiAqIGJ5IHdvcmtlcnBvb2wgd2hlbiBydW5uaW5nIGluIE5vZGUuanMgbXVsdGktdGhyZWFkIG1vZGUuCiAqCiAqIHdvcmtlcnBvb2wgZGV0ZWN0cyB0aGF0IGl0IGlzIGluc2lkZSBhIHdvcmtlcl90aHJlYWRzIHdvcmtlciB2aWEgcGFyZW50UG9ydAogKiBhbmQgY2FsbHMgd29ya2VyLnJlZ2lzdGVyKCkgdG8gZXhwb3NlIHRoZSBtZXRob2RzIHRvIHRoZSBwb29sLgogKi8KaW1wb3J0IHdvcmtlcnBvb2wgZnJvbSAid29ya2VycG9vbCI7CmltcG9ydCB0aHJlYWQgZnJvbSAiLi90aHJlYWRtYW5fdGhyZWFkLmpzIjsKCmNvbnN0IHJ1blRhc2tGbiA9IHRocmVhZCgpOwoKd29ya2VycG9vbC53b3JrZXIoewogICAgcnVuVGFzayh0YXNrKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVuVGFza0ZuKHRhc2spOwogICAgICAgIC8vIElOSVQgcGF0aDogcnVuVGFza0ZuIHJldHVybnMgYSBQcm9taXNlIOKAlCBsZXQgd29ya2VycG9vbCBhd2FpdCBpdC4KICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkgcmV0dXJuIHJlc3VsdDsKICAgICAgICAvLyBOb24tSU5JVCBwYXRoOiB0cmFuc2ZlciBvdXRwdXQgVWludDhBcnJheXMgemVyby1jb3B5IHRvIHRoZSBtYWluIHRocmVhZC4KICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHJlc3VsdDsKICAgICAgICByZXR1cm4gbmV3IHdvcmtlcnBvb2wuVHJhbnNmZXIocmVzdWx0LCByZXN1bHQubWFwKGIgPT4gYi5idWZmZXIpKTsKICAgIH0KfSk7Cg==", "" + {}.url)); } - - - +//#endregion +//#region src/threadman.js +var MEM_SIZE = 25; async function buildThreadManager(wasm, singleThread) { - const tm = new ThreadManager(); - - tm.memory = new WebAssembly.Memory({initial:MEM_SIZE}); - tm.u8 = new Uint8Array(tm.memory.buffer); - tm.u32 = new Uint32Array(tm.memory.buffer); - - const wasmModule = await WebAssembly.compile(wasm.code); - - tm.instance = await WebAssembly.instantiate(wasmModule, { - env: { - "memory": tm.memory - } - }); - - if(process.browser && !globalThis?.Worker) { - singleThread = true; - } - - tm.singleThread = singleThread; - tm.initalPFree = tm.u32[0]; // Save the Pointer to free space. - tm.pq = wasm.pq; - tm.pr = wasm.pr; - tm.pG1gen = wasm.pG1gen; - tm.pG1zero = wasm.pG1zero; - tm.pG2gen = wasm.pG2gen; - tm.pG2zero = wasm.pG2zero; - tm.pOneT = wasm.pOneT; - - tm.code = wasm.code; - tm.wasmModule = wasmModule; - - // tm.pTmp0 = tm.alloc(curve.G2.F.n8*3); - // tm.pTmp1 = tm.alloc(curve.G2.F.n8*3); - - if (singleThread) { - tm.taskManager = thread(); - await tm.taskManager([{ - cmd: "INIT", - init: MEM_SIZE, - code: tm.code.slice() - }]); - tm.concurrency = 1; - } else { - tm.workers = []; - tm.pendingDeferreds = []; - tm.working = []; - tm.initialized = []; - tm.initializing = []; - - let concurrency = 2; - if (process.browser) { - if (typeof navigator === "object" && navigator.hardwareConcurrency) { - concurrency = navigator.hardwareConcurrency; - } - } else { - concurrency = os.cpus().length; - } - - if(concurrency === 0){ - concurrency = 2; - } - - //concurrency = 10; // For testing - - // Limit to 64 threads for memory reasons. - if (concurrency>64) concurrency=64; - tm.concurrency = concurrency; - - // for (let i = 0; i<1; i++) { - // - // tm.workers[i] = new Worker(workerSource); - // - // tm.workers[i].addEventListener("message", getOnMsg(i)); - // //tm.workers[i].addEventListener("error", getOnError(i)); - // - // tm.working[i]=false; - // } - // - // const initPromises = []; - // for (let i=0; i { - this.initialized[i] = true; - }); - } - - startSyncOp() { - if (this.oldPFree !== 0) throw new Error("Sync operation in progress"); - this.oldPFree = this.u32[0]; - } - - endSyncOp() { - if (this.oldPFree === 0) throw new Error("No sync operation in progress"); - this.u32[0] = this.oldPFree; - this.oldPFree = 0; - } - - async postAction(workerId, e, transfers, _deferred) { - if (this.working[workerId]) { - throw new Error("Posting a job to a working worker"); - } - this.working[workerId] = true; - - this.pendingDeferreds[workerId] = _deferred ? _deferred : new Deferred(); - await this.workers[workerId].postMessage(e, transfers); - - return this.pendingDeferreds[workerId].promise; - } - - async processWorks() { - for (let i=0; (i 0); i++) { - if (this.workers[i] && this.initialized[i] && !this.working[i]) { - const work = this.actionQueue.shift(); - this.postAction(i, work.data, work.transfers, work.deferred); - } - } - - // Initialize more workers if needed - if (this.actionQueue.length > 0) { - // Find a worker that is not initialized yet - let initializingCount = 0; - for (let i=0; i= this.actionQueue.length) break; - - // Initialize this worker - console.log(`Worker ${i} not initialized yet. Initializing...`); - initializingCount++; - await this.startWorker(i); - //this.startWorker(i); - } - } - } - - queueAction(actionData, transfers) { - const d = new Deferred(); - - if (this.singleThread) { - const res = this.taskManager(actionData); - d.resolve(res); - } else { - this.actionQueue.push({ - data: actionData, - transfers: transfers, - deferred: d - }); - this.processWorks(); - } - return d.promise; - } - - resetMemory() { - this.u32[0] = this.initalPFree; - } - - allocBuff(buff) { - const pointer = this.alloc(buff.byteLength); - this.setBuff(pointer, buff); - return pointer; - } - - getBuff(pointer, length) { - return this.u8.slice(pointer, pointer+ length); - } - - setBuff(pointer, buffer) { - this.u8.set(new Uint8Array(buffer), pointer); - } - - alloc(length) { - while (this.u32[0] & 3) this.u32[0]++; // Return always aligned pointers - const res = this.u32[0]; - this.u32[0] += length; - return res; - } - - async terminate() { - console.log("terminate!!!"); - for (let i=0; i=0; i--) { - if (!G.isZero(res)) { - for (let j=0; jMAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; - if (chunkSize { - if (logger) logger.debug(`Multiexp end: ${logText}: ${i}/${nPoints}`); - return r; - })); - } - - let result = await Promise.all(opPromises); - - let res = G.zero; - for (let i=result.length-1; i>=0; i--) { - res = G.add(res, result[i]); - } - - return res; - } - - G.multiExp = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "jacobian", logger, logText); - }; - G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText) { - return await _multiExp(buffBases, buffScalars, "affine", logger, logText); - }; + const G = curve[groupName]; + const tm = G.tm; + async function _multiExpChunk(buffBases, buffScalars, inType, logger, logText) { + if (!(buffBases instanceof Uint8Array)) { + if (logger) logger.error(`${logText} _multiExpChunk buffBases is not Uint8Array`); + throw new Error(`${logText} _multiExpChunk buffBases is not Uint8Array`); + } + if (!(buffScalars instanceof Uint8Array)) { + if (logger) logger.error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); + throw new Error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); + } + inType = inType || "affine"; + let sGIn; + let fnName; + if (groupName === "G1") if (inType === "affine") { + fnName = "g1m_multiexpAffine"; + sGIn = G.F.n8 * 2; + } else { + fnName = "g1m_multiexp"; + sGIn = G.F.n8 * 3; + } + else if (groupName === "G2") if (inType === "affine") { + fnName = "g2m_multiexpAffine"; + sGIn = G.F.n8 * 2; + } else { + fnName = "g2m_multiexp"; + sGIn = G.F.n8 * 3; + } + else throw new Error("Invalid group"); + const nPoints = Math.floor(buffBases.byteLength / sGIn); + if (nPoints === 0) return G.zero; + const sScalar = Math.floor(buffScalars.byteLength / nPoints); + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error("Scalar size does not match"); + const bitChunkSize = pTSizes[log2(nPoints)]; + const opPromises = []; + const task = [ + { + cmd: "ALLOCSET", + var: 0, + buff: buffBases + }, + { + cmd: "ALLOCSET", + var: 1, + buff: buffScalars + }, + { + cmd: "ALLOC", + var: 2, + len: G.F.n8 * 3 + }, + { + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { var: 1 }, + { val: sScalar }, + { val: nPoints }, + { var: 2 } + ] + }, + { + cmd: "GET", + out: 0, + var: 2, + len: G.F.n8 * 3 + } + ]; + opPromises.push(G.tm.queueAction(task, [buffBases.buffer, buffScalars.buffer])); + const result = await Promise.all(opPromises); + let res = G.zero; + for (let i = result.length - 1; i >= 0; i--) { + if (!G.isZero(res)) for (let j = 0; j < bitChunkSize; j++) res = G.double(res); + res = G.add(res, result[i][0]); + } + return res; + } + async function _multiExp(buffBases, buffScalars, inType, logger, logText) { + const MAX_CHUNK_SIZE = 1 << 22; + const MIN_CHUNK_SIZE = 4096; + let sGIn; + if (groupName === "G1") if (inType === "affine") sGIn = G.F.n8 * 2; + else sGIn = G.F.n8 * 3; + else if (groupName === "G2") if (inType === "affine") sGIn = G.F.n8 * 2; + else sGIn = G.F.n8 * 3; + else throw new Error("Invalid group"); + const nPoints = Math.floor(buffBases.byteLength / sGIn); + if (nPoints === 0) return G.zero; + const sScalar = Math.floor(buffScalars.byteLength / nPoints); + if (sScalar * nPoints !== buffScalars.byteLength) throw new Error("Scalar size does not match"); + const opPromises = []; + const bitChunkSize = pTSizes[log2(nPoints)]; + let nChunks = Math.floor((sScalar * 8 - 1) / bitChunkSize) + 1; + if (groupName === "G2") nChunks *= 2; + let chunkSize; + console.log("nChunks_0", nChunks); + nChunks = (Math.floor((nChunks - 1) / tm.concurrency) + 1) * tm.concurrency; + chunkSize = Math.floor(nPoints / nChunks) + 1; + if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; + if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; + console.log("nChunks", nChunks); + console.log("effective nChunks", nPoints / chunkSize); + for (let i = 0; i < nPoints; i += chunkSize) { + if (logger) logger.debug(`Multiexp start: ${logText}: ${i}/${nPoints}`); + const n = Math.min(nPoints - i, chunkSize); + const buffBasesChunk = buffBases.slice(i * sGIn, (i + n) * sGIn); + const buffScalarsChunk = buffScalars.slice(i * sScalar, (i + n) * sScalar); + opPromises.push(_multiExpChunk(buffBasesChunk, buffScalarsChunk, inType, logger, logText).then((r) => { + if (logger) logger.debug(`Multiexp end: ${logText}: ${i}/${nPoints}`); + return r; + })); + } + const result = await Promise.all(opPromises); + let res = G.zero; + for (let i = result.length - 1; i >= 0; i--) res = G.add(res, result[i]); + return res; + } + G.multiExp = async function multiExpAffine(buffBases, buffScalars, logger, logText) { + return _multiExp(buffBases, buffScalars, "jacobian", logger, logText); + }; + G.multiExpAffine = async function multiExpAffine(buffBases, buffScalars, logger, logText) { + return _multiExp(buffBases, buffScalars, "affine", logger, logText); + }; } - +//#endregion +//#region src/engine_fft.js function buildFFT(curve, groupName) { - const G = curve[groupName]; - const Fr = curve.Fr; - const tm = G.tm; - async function _fft(buff, inverse, inType, outType, logger, loggerTxt) { - - inType = inType || "affine"; - outType = outType || "affine"; - const MAX_BITS_THREAD = 14; - - let sIn, sMid, sOut, fnIn2Mid, fnMid2Out, fnFFTMix, fnFFTJoin, fnFFTFinal, fnReversePermutation; - if (groupName == "G1") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g1m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - sMid = G.F.n8*3; - if (inverse) { - fnFFTFinal = "g1m_fftFinal"; - } - fnFFTJoin = "g1m_fftJoin"; - fnFFTMix = "g1m_fftMix"; - fnReversePermutation = "g1m_reversePermutation"; - - if (outType == "affine") { - sOut = G.F.n8*2; - fnMid2Out = "g1m_batchToAffine"; - } else { - sOut = G.F.n8*3; - } - - } else if (groupName == "G2") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g2m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - sMid = G.F.n8*3; - if (inverse) { - fnFFTFinal = "g2m_fftFinal"; - } - fnFFTJoin = "g2m_fftJoin"; - fnFFTMix = "g2m_fftMix"; - fnReversePermutation = "g2m_reversePermutation"; - if (outType == "affine") { - sOut = G.F.n8*2; - fnMid2Out = "g2m_batchToAffine"; - } else { - sOut = G.F.n8*3; - } - } else if (groupName == "Fr") { - sIn = G.n8; - sMid = G.n8; - sOut = G.n8; - if (inverse) { - fnFFTFinal = "frm_fftFinal"; - } - fnFFTMix = "frm_fftMix"; - fnFFTJoin = "frm_fftJoin"; - fnReversePermutation = "frm_fftReversePermutation"; - } - - - let returnArray = false; - if (Array.isArray(buff)) { - buff = array2buffer(buff, sIn); - returnArray = true; - } else { - buff = buff.slice(0, buff.byteLength); - } - - console.log("FFT input size:", buff.byteLength, " bytes"); - - const nPoints = buff.byteLength / sIn; - const bits = log2(nPoints); - - console.log("FFT points:", nPoints, " bits:", bits); - - if ((1 << bits) != nPoints) { - throw new Error("fft must be multiple of 2" ); - } - - if (bits == Fr.s +1) { - let buffOut; - - if (inverse) { - buffOut = await _fftExtInv(buff, inType, outType, logger, loggerTxt); - } else { - buffOut = await _fftExt(buff, inType, outType, logger, loggerTxt); - } - - if (returnArray) { - return buffer2array(buffOut, sOut); - } else { - return buffOut; - } - } - - let inv; - if (inverse) { - inv = Fr.inv(Fr.e(nPoints)); - } - - let buffOut; - - // TODO: optimize. Move to wasm? - //buffReverseBits(buff, sIn); - - console.log("fnReversePermutation:", fnReversePermutation); - - const task = []; - task.push({cmd: "ALLOC", var: 0, len: buff.byteLength}); - task.push({cmd: "SET", var: 0, buff: buff}); - task.push({cmd: "CALL", fnName: fnReversePermutation, params: [{var:0}, {val: bits}, {var: 0}]}); - task.push({cmd: "GET", out:0, var: 0, len: buff.byteLength}); - const res = await tm.queueAction(task, [buff.buffer]); - - buff.set(res[0]); - - let chunks; - let pointsInChunk = Math.min(1 << MAX_BITS_THREAD, nPoints); - let nChunks = nPoints / pointsInChunk; - - while ((nChunks < tm.concurrency)&&(pointsInChunk>=16)) { - nChunks *= 2; - pointsInChunk /= 2; - } - - const l2Chunk = log2(pointsInChunk); - - const promises = []; - for (let i = 0; i< nChunks; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${i}/${nChunks}`); - const task = []; - task.push({cmd: "ALLOC", var: 0, len: sMid*pointsInChunk}); - const buffChunk = buff.slice( (pointsInChunk * i)*sIn, (pointsInChunk * (i+1))*sIn); - task.push({cmd: "SET", var: 0, buff: buffChunk}); - if (fnIn2Mid) { - task.push({cmd: "CALL", fnName:fnIn2Mid, params: [{var:0}, {val: pointsInChunk}, {var: 0}]}); - } - for (let j=1; j<=l2Chunk;j++) { - task.push({cmd: "CALL", fnName:fnFFTMix, params: [{var:0}, {val: pointsInChunk}, {val: j}]}); - } - - if (l2Chunk==bits) { - if (fnFFTFinal) { - task.push({cmd: "ALLOCSET", var: 1, buff: inv}); - task.push({cmd: "CALL", fnName: fnFFTFinal, params:[ - {var: 0}, - {val: pointsInChunk}, - {var: 1}, - ]}); - } - if (fnMid2Out) { - task.push({cmd: "CALL", fnName:fnMid2Out, params: [{var:0}, {val: pointsInChunk}, {var: 0}]}); - } - task.push({cmd: "GET", out: 0, var: 0, len: pointsInChunk*sOut}); - } else { - task.push({cmd: "GET", out:0, var: 0, len: sMid*pointsInChunk}); - } - promises.push(tm.queueAction(task, [buffChunk.buffer]).then( (r) => { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${i}/${nChunks}`); - return r; - })); - } - - chunks = await Promise.all(promises); - for (let i = 0; i< nChunks; i++) chunks[i] = chunks[i][0]; - - for (let i = l2Chunk+1; i<=bits; i++) { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); - const nGroups = 1 << (bits - i); - const nChunksPerGroup = nChunks / nGroups; - const opPromises = []; - for (let j=0; j { - if (logger) logger.debug(`${loggerTxt}: fft ${bits} join ${i}/${bits} ${j+1}/${nGroups} ${k}/${nChunksPerGroup/2}`); - return r; - })); - } - } - - const res = await Promise.all(opPromises); - for (let j=0; j0; i--) { - buffOut.set(chunks[i], p); - p += pointsInChunk*sOut; - delete chunks[i]; // Liberate mem - } - buffOut.set(chunks[0].slice(0, (pointsInChunk-1)*sOut), p); - delete chunks[0]; - } else { - for (let i=0; i (1<<28)) { - buffOut = new BigBuffer(res1[0].byteLength*2); - } else { - buffOut = new Uint8Array(res1[0].byteLength*2); - } - - buffOut.set(res1[0]); - buffOut.set(res1[1], res1[0].byteLength); - - return buffOut; - } - - async function _fftExtInv(buff, inType, outType, logger, loggerTxt) { - let b1, b2; - b1 = buff.slice( 0 , buff.byteLength/2); - b2 = buff.slice( buff.byteLength/2, buff.byteLength); - - const promises = []; - - promises.push( _fft(b1, true, inType, "jacobian", logger, loggerTxt)); - promises.push( _fft(b2, true, inType, "jacobian", logger, loggerTxt)); - - [b1, b2] = await Promise.all(promises); - - const res1 = await _fftJoinExt(b1, b2, "fftJoinExtInv", Fr.one, Fr.shiftInv, "jacobian", outType, logger, loggerTxt); - - let buffOut; - if (res1[0].byteLength > (1<<28)) { - buffOut = new BigBuffer(res1[0].byteLength*2); - } else { - buffOut = new Uint8Array(res1[0].byteLength*2); - } - - buffOut.set(res1[0]); - buffOut.set(res1[1], res1[0].byteLength); - - return buffOut; - } - - - async function _fftJoinExt(buff1, buff2, fn, first, inc, inType, outType, logger, loggerTxt) { - const MAX_CHUNK_SIZE = 1<<16; - const MIN_CHUNK_SIZE = 1<<4; - - let fnName; - let fnIn2Mid, fnMid2Out; - let sOut, sIn, sMid; - - if (groupName == "G1") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g1m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - sMid = G.F.n8*3; - fnName = "g1m_"+fn; - if (outType == "affine") { - fnMid2Out = "g1m_batchToAffine"; - sOut = G.F.n8*2; - } else { - sOut = G.F.n8*3; - } - } else if (groupName == "G2") { - if (inType == "affine") { - sIn = G.F.n8*2; - fnIn2Mid = "g2m_batchToJacobian"; - } else { - sIn = G.F.n8*3; - } - fnName = "g2m_"+fn; - sMid = G.F.n8*3; - if (outType == "affine") { - fnMid2Out = "g2m_batchToAffine"; - sOut = G.F.n8*2; - } else { - sOut = G.F.n8*3; - } - } else if (groupName == "Fr") { - sIn = Fr.n8; - sOut = Fr.n8; - sMid = Fr.n8; - fnName = "frm_" + fn; - } else { - throw new Error("Invalid group"); - } - - if (buff1.byteLength != buff2.byteLength) { - throw new Error("Invalid buffer size"); - } - const nPoints = Math.floor(buff1.byteLength / sIn); - if (nPoints != 1 << log2(nPoints)) { - throw new Error("Invalid number of points"); - } - - let chunkSize = Math.floor(nPoints /tm.concurrency); - if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; - if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; - - const opPromises = []; - - for (let i=0; i { - if (logger) logger.debug(`${loggerTxt}: fftJoinExt End: ${i}/${nPoints}`); - return r; - }) - ); - } - - const result = await Promise.all(opPromises); - - let fullBuffOut1; - let fullBuffOut2; - if (nPoints * sOut > 1<<28) { - fullBuffOut1 = new BigBuffer(nPoints*sOut); - fullBuffOut2 = new BigBuffer(nPoints*sOut); - } else { - fullBuffOut1 = new Uint8Array(nPoints*sOut); - fullBuffOut2 = new Uint8Array(nPoints*sOut); - } - - let p =0; - for (let i=0; i Fr.s+1) { - if (logger) logger.error("lagrangeEvaluations input too big"); - throw new Error("lagrangeEvaluations input too big"); - } - - let t0 = buff.slice(0, buff.byteLength/2); - let t1 = buff.slice(buff.byteLength/2, buff.byteLength); - - - const shiftToSmallM = Fr.exp(Fr.shift, nPoints/2); - const sConst = Fr.inv( Fr.sub(Fr.one, shiftToSmallM)); - - [t0, t1] = await _fftJoinExt(t0, t1, "prepareLagrangeEvaluation", sConst, Fr.shiftInv, inType, "jacobian", logger, loggerTxt + " prep"); - - const promises = []; - - promises.push( _fft(t0, true, "jacobian", outType, logger, loggerTxt + " t0")); - promises.push( _fft(t1, true, "jacobian", outType, logger, loggerTxt + " t1")); - - [t0, t1] = await Promise.all(promises); - - let buffOut; - if (t0.byteLength > (1<<28)) { - buffOut = new BigBuffer(t0.byteLength*2); - } else { - buffOut = new Uint8Array(t0.byteLength*2); - } - - buffOut.set(t0); - buffOut.set(t1, t0.byteLength); - - return buffOut; - }; - - G.fftMix = async function fftMix(buff) { - const sG = G.F.n8*3; - let fnName, fnFFTJoin; - if (groupName == "G1") { - fnName = "g1m_fftMix"; - fnFFTJoin = "g1m_fftJoin"; - } else if (groupName == "G2") { - fnName = "g2m_fftMix"; - fnFFTJoin = "g2m_fftJoin"; - } else if (groupName == "Fr") { - fnName = "frm_fftMix"; - fnFFTJoin = "frm_fftJoin"; - } else { - throw new Error("Invalid group"); - } - - const nPoints = Math.floor(buff.byteLength / sG); - const power = log2(nPoints); - - let nChunks = 1 << log2(tm.concurrency); - - if (nPoints <= nChunks*2) nChunks = 1; - - const pointsPerChunk = nPoints / nChunks; - - const powerChunk = log2(pointsPerChunk); - - const opPromises = []; - for (let i=0; i=0; i--) { - fullBuffOut.set(result[i][0], p); - p+=result[i][0].byteLength; - } - - return fullBuffOut; - }; + const G = curve[groupName]; + const Fr = curve.Fr; + const tm = G.tm; + async function _fft(buff, inverse, inType, outType, logger, loggerTxt) { + inType = inType || "affine"; + outType = outType || "affine"; + const MAX_BITS_THREAD = 14; + let sIn, sMid, sOut, fnIn2Mid, fnMid2Out, fnFFTMix, fnFFTJoin, fnFFTFinal, fnReversePermutation; + if (groupName == "G1") { + if (inType == "affine") { + sIn = G.F.n8 * 2; + fnIn2Mid = "g1m_batchToJacobian"; + } else sIn = G.F.n8 * 3; + sMid = G.F.n8 * 3; + if (inverse) fnFFTFinal = "g1m_fftFinal"; + fnFFTJoin = "g1m_fftJoin"; + fnFFTMix = "g1m_fftMix"; + fnReversePermutation = "g1m__reversePermutation"; + if (outType == "affine") { + sOut = G.F.n8 * 2; + fnMid2Out = "g1m_batchToAffine"; + } else sOut = G.F.n8 * 3; + } else if (groupName == "G2") { + if (inType == "affine") { + sIn = G.F.n8 * 2; + fnIn2Mid = "g2m_batchToJacobian"; + } else sIn = G.F.n8 * 3; + sMid = G.F.n8 * 3; + if (inverse) fnFFTFinal = "g2m_fftFinal"; + fnFFTJoin = "g2m_fftJoin"; + fnFFTMix = "g2m_fftMix"; + fnReversePermutation = "g2m__reversePermutation"; + if (outType == "affine") { + sOut = G.F.n8 * 2; + fnMid2Out = "g2m_batchToAffine"; + } else sOut = G.F.n8 * 3; + } else if (groupName == "Fr") { + sIn = G.n8; + sMid = G.n8; + sOut = G.n8; + if (inverse) fnFFTFinal = "frm_fftFinal"; + fnFFTMix = "frm_fftMix"; + fnFFTJoin = "frm_fftJoin"; + fnReversePermutation = "frm__reversePermutation"; + } + let returnArray = false; + if (Array.isArray(buff)) { + buff = array2buffer(buff, sIn); + returnArray = true; + } else buff = buff.slice(0, buff.byteLength); + console.log("FFT input size:", buff.byteLength, " bytes"); + const nPoints = buff.byteLength / sIn; + const bits = log2(nPoints); + console.log("FFT points:", nPoints, " bits:", bits); + if (1 << bits != nPoints) throw new Error("fft must be multiple of 2"); + if (bits == Fr.s + 1) { + let buffOut; + if (inverse) buffOut = await _fftExtInv(buff, inType, outType, logger, loggerTxt); + else buffOut = await _fftExt(buff, inType, outType, logger, loggerTxt); + if (returnArray) return buffer2array(buffOut, sOut); + else return buffOut; + } + let inv; + if (inverse) inv = Fr.inv(Fr.e(nPoints)); + let buffOut; + console.log("fnReversePermutation:", fnReversePermutation); + const task = []; + task.push({ + cmd: "ALLOCSET", + var: 0, + buff + }); + task.push({ + cmd: "CALL", + fnName: fnReversePermutation, + params: [{ var: 0 }, { val: bits }] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: nPoints * sIn + }); + buff = (await tm.queueAction(task, [buff.buffer]))[0]; + let chunks; + let pointsInChunk = Math.min(1 << MAX_BITS_THREAD, nPoints); + let nChunks = nPoints / pointsInChunk; + while (nChunks < tm.concurrency && pointsInChunk >= 16) { + nChunks *= 2; + pointsInChunk /= 2; + } + const l2Chunk = log2(pointsInChunk); + const promises = []; + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix start: ${nChunks}`); + for (let i = 0; i < nChunks; i++) { + const task = []; + task.push({ + cmd: "ALLOC", + var: 0, + len: sMid * pointsInChunk + }); + const buffChunk = buff.slice(pointsInChunk * i * sIn, pointsInChunk * (i + 1) * sIn); + task.push({ + cmd: "SET", + var: 0, + buff: buffChunk + }); + if (fnIn2Mid) task.push({ + cmd: "CALL", + fnName: fnIn2Mid, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 0 } + ] + }); + for (let j = 1; j <= l2Chunk; j++) task.push({ + cmd: "CALL", + fnName: fnFFTMix, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { val: j } + ] + }); + if (l2Chunk == bits) { + if (fnFFTFinal) { + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: inv + }); + task.push({ + cmd: "CALL", + fnName: fnFFTFinal, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 1 } + ] + }); + } + if (fnMid2Out) task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 0 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsInChunk * sOut + }); + } else task.push({ + cmd: "GET", + out: 0, + var: 0, + len: sMid * pointsInChunk + }); + promises.push(tm.queueAction(task, [buffChunk.buffer])); + } + chunks = await Promise.all(promises); + if (logger) logger.debug(`${loggerTxt}: fft ${bits} mix end: ${nChunks}`); + for (let i = 0; i < nChunks; i++) chunks[i] = chunks[i][0]; + for (let i = l2Chunk + 1; i <= bits; i++) { + if (logger) logger.debug(`${loggerTxt}: fft ${bits} join: ${i}/${bits}`); + const nGroups = 1 << bits - i; + const nChunksPerGroup = nChunks / nGroups; + const opPromises = []; + for (let j = 0; j < nGroups; j++) for (let k = 0; k < nChunksPerGroup / 2; k++) { + const first = Fr.exp(Fr.w[i], k * pointsInChunk); + const inc = Fr.w[i]; + const o1 = j * nChunksPerGroup + k; + const o2 = j * nChunksPerGroup + k + nChunksPerGroup / 2; + const task = []; + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: chunks[o1] + }); + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: chunks[o2] + }); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: first + }); + task.push({ + cmd: "ALLOCSET", + var: 3, + buff: inc + }); + task.push({ + cmd: "CALL", + fnName: fnFFTJoin, + params: [ + { var: 0 }, + { var: 1 }, + { val: pointsInChunk }, + { var: 2 }, + { var: 3 } + ] + }); + if (i == bits) { + if (fnFFTFinal) { + task.push({ + cmd: "ALLOCSET", + var: 4, + buff: inv + }); + task.push({ + cmd: "CALL", + fnName: fnFFTFinal, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 4 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnFFTFinal, + params: [ + { var: 1 }, + { val: pointsInChunk }, + { var: 4 } + ] + }); + } + if (fnMid2Out) { + task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 0 }, + { val: pointsInChunk }, + { var: 0 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 1 }, + { val: pointsInChunk }, + { var: 1 } + ] + }); + } + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsInChunk * sOut + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: pointsInChunk * sOut + }); + } else { + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsInChunk * sMid + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: pointsInChunk * sMid + }); + } + opPromises.push(tm.queueAction(task, [ + chunks[o1].buffer, + chunks[o2].buffer, + first.buffer + ])); + } + const res = await Promise.all(opPromises); + for (let j = 0; j < nGroups; j++) for (let k = 0; k < nChunksPerGroup / 2; k++) { + const o1 = j * nChunksPerGroup + k; + const o2 = j * nChunksPerGroup + k + nChunksPerGroup / 2; + const resChunk = res.shift(); + chunks[o1] = resChunk[0]; + chunks[o2] = resChunk[1]; + } + } + if (buff instanceof BigBuffer) buffOut = new BigBuffer(nPoints * sOut); + else buffOut = new Uint8Array(nPoints * sOut); + if (inverse) { + buffOut.set(chunks[0].slice((pointsInChunk - 1) * sOut)); + let p = sOut; + for (let i = nChunks - 1; i > 0; i--) { + buffOut.set(chunks[i], p); + p += pointsInChunk * sOut; + delete chunks[i]; + } + buffOut.set(chunks[0].slice(0, (pointsInChunk - 1) * sOut), p); + delete chunks[0]; + } else for (let i = 0; i < nChunks; i++) { + buffOut.set(chunks[i], pointsInChunk * sOut * i); + delete chunks[i]; + } + if (returnArray) return buffer2array(buffOut, sOut); + else return buffOut; + } + async function _fftExt(buff, inType, outType, logger, loggerTxt) { + let b1, b2; + b1 = buff.slice(0, buff.byteLength / 2); + b2 = buff.slice(buff.byteLength / 2, buff.byteLength); + const promises = []; + [b1, b2] = await _fftJoinExt(b1, b2, "fftJoinExt", Fr.one, Fr.shift, inType, "jacobian", logger, loggerTxt); + promises.push(_fft(b1, false, "jacobian", outType, logger, loggerTxt)); + promises.push(_fft(b2, false, "jacobian", outType, logger, loggerTxt)); + const res1 = await Promise.all(promises); + let buffOut; + if (res1[0].byteLength > 1 << 28) buffOut = new BigBuffer(res1[0].byteLength * 2); + else buffOut = new Uint8Array(res1[0].byteLength * 2); + buffOut.set(res1[0]); + buffOut.set(res1[1], res1[0].byteLength); + return buffOut; + } + async function _fftExtInv(buff, inType, outType, logger, loggerTxt) { + let b1, b2; + b1 = buff.slice(0, buff.byteLength / 2); + b2 = buff.slice(buff.byteLength / 2, buff.byteLength); + const promises = []; + promises.push(_fft(b1, true, inType, "jacobian", logger, loggerTxt)); + promises.push(_fft(b2, true, inType, "jacobian", logger, loggerTxt)); + [b1, b2] = await Promise.all(promises); + const res1 = await _fftJoinExt(b1, b2, "fftJoinExtInv", Fr.one, Fr.shiftInv, "jacobian", outType, logger, loggerTxt); + let buffOut; + if (res1[0].byteLength > 1 << 28) buffOut = new BigBuffer(res1[0].byteLength * 2); + else buffOut = new Uint8Array(res1[0].byteLength * 2); + buffOut.set(res1[0]); + buffOut.set(res1[1], res1[0].byteLength); + return buffOut; + } + async function _fftJoinExt(buff1, buff2, fn, first, inc, inType, outType, logger, loggerTxt) { + const MAX_CHUNK_SIZE = 65536; + const MIN_CHUNK_SIZE = 16; + let fnName; + let fnIn2Mid, fnMid2Out; + let sOut, sIn, sMid; + if (groupName == "G1") { + if (inType == "affine") { + sIn = G.F.n8 * 2; + fnIn2Mid = "g1m_batchToJacobian"; + } else sIn = G.F.n8 * 3; + sMid = G.F.n8 * 3; + fnName = "g1m_" + fn; + if (outType == "affine") { + fnMid2Out = "g1m_batchToAffine"; + sOut = G.F.n8 * 2; + } else sOut = G.F.n8 * 3; + } else if (groupName == "G2") { + if (inType == "affine") { + sIn = G.F.n8 * 2; + fnIn2Mid = "g2m_batchToJacobian"; + } else sIn = G.F.n8 * 3; + fnName = "g2m_" + fn; + sMid = G.F.n8 * 3; + if (outType == "affine") { + fnMid2Out = "g2m_batchToAffine"; + sOut = G.F.n8 * 2; + } else sOut = G.F.n8 * 3; + } else if (groupName == "Fr") { + sIn = Fr.n8; + sOut = Fr.n8; + sMid = Fr.n8; + fnName = "frm_" + fn; + } else throw new Error("Invalid group"); + if (buff1.byteLength != buff2.byteLength) throw new Error("Invalid buffer size"); + const nPoints = Math.floor(buff1.byteLength / sIn); + if (nPoints != 1 << log2(nPoints)) throw new Error("Invalid number of points"); + let chunkSize = Math.floor(nPoints / tm.concurrency); + if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; + if (chunkSize > MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; + const opPromises = []; + for (let i = 0; i < nPoints; i += chunkSize) { + if (logger) logger.debug(`${loggerTxt}: fftJoinExt Start: ${i}/${nPoints}`); + const n = Math.min(nPoints - i, chunkSize); + const firstChunk = Fr.mul(first, Fr.exp(inc, i)); + const task = []; + const b1 = buff1.slice(i * sIn, (i + n) * sIn); + const b2 = buff2.slice(i * sIn, (i + n) * sIn); + task.push({ + cmd: "ALLOC", + var: 0, + len: sMid * n + }); + task.push({ + cmd: "SET", + var: 0, + buff: b1 + }); + task.push({ + cmd: "ALLOC", + var: 1, + len: sMid * n + }); + task.push({ + cmd: "SET", + var: 1, + buff: b2 + }); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: firstChunk + }); + task.push({ + cmd: "ALLOCSET", + var: 3, + buff: inc + }); + if (fnIn2Mid) { + task.push({ + cmd: "CALL", + fnName: fnIn2Mid, + params: [ + { var: 0 }, + { val: n }, + { var: 0 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnIn2Mid, + params: [ + { var: 1 }, + { val: n }, + { var: 1 } + ] + }); + } + task.push({ + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { var: 1 }, + { val: n }, + { var: 2 }, + { var: 3 }, + { val: Fr.s } + ] + }); + if (fnMid2Out) { + task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 0 }, + { val: n }, + { var: 0 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnMid2Out, + params: [ + { var: 1 }, + { val: n }, + { var: 1 } + ] + }); + } + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: n * sOut + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: n * sOut + }); + opPromises.push(tm.queueAction(task, [ + b1.buffer, + b2.buffer, + firstChunk.buffer + ]).then((r) => { + if (logger) logger.debug(`${loggerTxt}: fftJoinExt End: ${i}/${nPoints}`); + return r; + })); + } + const result = await Promise.all(opPromises); + let fullBuffOut1; + let fullBuffOut2; + if (nPoints * sOut > 1 << 28) { + fullBuffOut1 = new BigBuffer(nPoints * sOut); + fullBuffOut2 = new BigBuffer(nPoints * sOut); + } else { + fullBuffOut1 = new Uint8Array(nPoints * sOut); + fullBuffOut2 = new Uint8Array(nPoints * sOut); + } + let p = 0; + for (let i = 0; i < result.length; i++) { + fullBuffOut1.set(result[i][0], p); + fullBuffOut2.set(result[i][1], p); + p += result[i][0].byteLength; + } + return [fullBuffOut1, fullBuffOut2]; + } + G.fft = async function(buff, inType, outType, logger, loggerTxt) { + return await _fft(buff, false, inType, outType, logger, loggerTxt); + }; + G.ifft = async function(buff, inType, outType, logger, loggerTxt) { + return await _fft(buff, true, inType, outType, logger, loggerTxt); + }; + G.lagrangeEvaluations = async function(buff, inType, outType, logger, loggerTxt) { + inType = inType || "affine"; + outType = outType || "affine"; + let sIn; + if (groupName == "G1") if (inType == "affine") sIn = G.F.n8 * 2; + else sIn = G.F.n8 * 3; + else if (groupName == "G2") if (inType == "affine") sIn = G.F.n8 * 2; + else sIn = G.F.n8 * 3; + else if (groupName == "Fr") sIn = Fr.n8; + else throw new Error("Invalid group"); + const nPoints = buff.byteLength / sIn; + const bits = log2(nPoints); + if (2 ** bits * sIn != buff.byteLength) { + if (logger) logger.error("lagrangeEvaluations iinvalid input size"); + throw new Error("lagrangeEvaluations invalid Input size"); + } + if (bits <= Fr.s) return await G.ifft(buff, inType, outType, logger, loggerTxt); + if (bits > Fr.s + 1) { + if (logger) logger.error("lagrangeEvaluations input too big"); + throw new Error("lagrangeEvaluations input too big"); + } + let t0 = buff.slice(0, buff.byteLength / 2); + let t1 = buff.slice(buff.byteLength / 2, buff.byteLength); + const shiftToSmallM = Fr.exp(Fr.shift, nPoints / 2); + const sConst = Fr.inv(Fr.sub(Fr.one, shiftToSmallM)); + [t0, t1] = await _fftJoinExt(t0, t1, "prepareLagrangeEvaluation", sConst, Fr.shiftInv, inType, "jacobian", logger, loggerTxt + " prep"); + const promises = []; + promises.push(_fft(t0, true, "jacobian", outType, logger, loggerTxt + " t0")); + promises.push(_fft(t1, true, "jacobian", outType, logger, loggerTxt + " t1")); + [t0, t1] = await Promise.all(promises); + let buffOut; + if (t0.byteLength > 1 << 28) buffOut = new BigBuffer(t0.byteLength * 2); + else buffOut = new Uint8Array(t0.byteLength * 2); + buffOut.set(t0); + buffOut.set(t1, t0.byteLength); + return buffOut; + }; + G.fftMix = async function fftMix(buff) { + const sG = G.F.n8 * 3; + let fnName, fnFFTJoin; + if (groupName == "G1") { + fnName = "g1m_fftMix"; + fnFFTJoin = "g1m_fftJoin"; + } else if (groupName == "G2") { + fnName = "g2m_fftMix"; + fnFFTJoin = "g2m_fftJoin"; + } else if (groupName == "Fr") { + fnName = "frm_fftMix"; + fnFFTJoin = "frm_fftJoin"; + } else throw new Error("Invalid group"); + const nPoints = Math.floor(buff.byteLength / sG); + const power = log2(nPoints); + let nChunks = 1 << log2(tm.concurrency); + if (nPoints <= nChunks * 2) nChunks = 1; + const pointsPerChunk = nPoints / nChunks; + const powerChunk = log2(pointsPerChunk); + const opPromises = []; + for (let i = 0; i < nChunks; i++) { + const task = []; + const b = buff.slice(i * pointsPerChunk * sG, (i + 1) * pointsPerChunk * sG); + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: b + }); + for (let j = 1; j <= powerChunk; j++) task.push({ + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { val: pointsPerChunk }, + { val: j } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsPerChunk * sG + }); + opPromises.push(tm.queueAction(task, [b.buffer])); + } + const result = await Promise.all(opPromises); + const chunks = []; + for (let i = 0; i < result.length; i++) chunks[i] = result[i][0]; + for (let i = powerChunk + 1; i <= power; i++) { + const nGroups = 1 << power - i; + const nChunksPerGroup = nChunks / nGroups; + const opPromises = []; + for (let j = 0; j < nGroups; j++) for (let k = 0; k < nChunksPerGroup / 2; k++) { + const first = Fr.exp(Fr.w[i], k * pointsPerChunk); + const inc = Fr.w[i]; + const o1 = j * nChunksPerGroup + k; + const o2 = j * nChunksPerGroup + k + nChunksPerGroup / 2; + const task = []; + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: chunks[o1] + }); + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: chunks[o2] + }); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: first + }); + task.push({ + cmd: "ALLOCSET", + var: 3, + buff: inc + }); + task.push({ + cmd: "CALL", + fnName: fnFFTJoin, + params: [ + { var: 0 }, + { var: 1 }, + { val: pointsPerChunk }, + { var: 2 }, + { var: 3 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsPerChunk * sG + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: pointsPerChunk * sG + }); + opPromises.push(tm.queueAction(task, [ + chunks[o1].buffer, + chunks[o2].buffer, + first.buffer + ])); + } + const res = await Promise.all(opPromises); + for (let j = 0; j < nGroups; j++) for (let k = 0; k < nChunksPerGroup / 2; k++) { + const o1 = j * nChunksPerGroup + k; + const o2 = j * nChunksPerGroup + k + nChunksPerGroup / 2; + const resChunk = res.shift(); + chunks[o1] = resChunk[0]; + chunks[o2] = resChunk[1]; + } + } + let fullBuffOut; + if (buff instanceof BigBuffer) fullBuffOut = new BigBuffer(nPoints * sG); + else fullBuffOut = new Uint8Array(nPoints * sG); + let p = 0; + for (let i = 0; i < nChunks; i++) { + fullBuffOut.set(chunks[i], p); + p += chunks[i].byteLength; + } + return fullBuffOut; + }; + G.fftJoin = async function fftJoin(buff1, buff2, first, inc) { + const sG = G.F.n8 * 3; + let fnName; + if (groupName == "G1") fnName = "g1m_fftJoin"; + else if (groupName == "G2") fnName = "g2m_fftJoin"; + else if (groupName == "Fr") fnName = "frm_fftJoin"; + else throw new Error("Invalid group"); + if (buff1.byteLength != buff2.byteLength) throw new Error("Invalid buffer size"); + const nPoints = Math.floor(buff1.byteLength / sG); + if (nPoints != 1 << log2(nPoints)) throw new Error("Invalid number of points"); + let nChunks = 1 << log2(tm.concurrency); + if (nPoints <= nChunks * 2) nChunks = 1; + const pointsPerChunk = nPoints / nChunks; + const opPromises = []; + for (let i = 0; i < nChunks; i++) { + const task = []; + const firstChunk = Fr.mul(first, Fr.exp(inc, i * pointsPerChunk)); + const b1 = buff1.slice(i * pointsPerChunk * sG, (i + 1) * pointsPerChunk * sG); + const b2 = buff2.slice(i * pointsPerChunk * sG, (i + 1) * pointsPerChunk * sG); + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: b1 + }); + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: b2 + }); + task.push({ + cmd: "ALLOCSET", + var: 2, + buff: firstChunk + }); + task.push({ + cmd: "ALLOCSET", + var: 3, + buff: inc + }); + task.push({ + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { var: 1 }, + { val: pointsPerChunk }, + { var: 2 }, + { var: 3 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: pointsPerChunk * sG + }); + task.push({ + cmd: "GET", + out: 1, + var: 1, + len: pointsPerChunk * sG + }); + opPromises.push(tm.queueAction(task, [ + b1.buffer, + b2.buffer, + firstChunk.buffer + ])); + } + const result = await Promise.all(opPromises); + let fullBuffOut1; + let fullBuffOut2; + if (buff1 instanceof BigBuffer) { + fullBuffOut1 = new BigBuffer(nPoints * sG); + fullBuffOut2 = new BigBuffer(nPoints * sG); + } else { + fullBuffOut1 = new Uint8Array(nPoints * sG); + fullBuffOut2 = new Uint8Array(nPoints * sG); + } + let p = 0; + for (let i = 0; i < result.length; i++) { + fullBuffOut1.set(result[i][0], p); + fullBuffOut2.set(result[i][1], p); + p += result[i][0].byteLength; + } + return [fullBuffOut1, fullBuffOut2]; + }; + G.fftFinal = async function fftFinal(buff, factor) { + const sG = G.F.n8 * 3; + const sGout = G.F.n8 * 2; + let fnName, fnToAffine; + if (groupName == "G1") { + fnName = "g1m_fftFinal"; + fnToAffine = "g1m_batchToAffine"; + } else if (groupName == "G2") { + fnName = "g2m_fftFinal"; + fnToAffine = "g2m_batchToAffine"; + } else throw new Error("Invalid group"); + const nPoints = Math.floor(buff.byteLength / sG); + if (nPoints != 1 << log2(nPoints)) throw new Error("Invalid number of points"); + const pointsPerChunk = Math.floor(nPoints / tm.concurrency); + const opPromises = []; + for (let i = 0; i < tm.concurrency; i++) { + let n; + if (i < tm.concurrency - 1) n = pointsPerChunk; + else n = nPoints - i * pointsPerChunk; + if (n == 0) continue; + const task = []; + const b = buff.slice(i * pointsPerChunk * sG, (i * pointsPerChunk + n) * sG); + task.push({ + cmd: "ALLOCSET", + var: 0, + buff: b + }); + task.push({ + cmd: "ALLOCSET", + var: 1, + buff: factor + }); + task.push({ + cmd: "CALL", + fnName, + params: [ + { var: 0 }, + { val: n }, + { var: 1 } + ] + }); + task.push({ + cmd: "CALL", + fnName: fnToAffine, + params: [ + { var: 0 }, + { val: n }, + { var: 0 } + ] + }); + task.push({ + cmd: "GET", + out: 0, + var: 0, + len: n * sGout + }); + opPromises.push(tm.queueAction(task, [b.buffer])); + } + const result = await Promise.all(opPromises); + let fullBuffOut; + if (buff instanceof BigBuffer) fullBuffOut = new BigBuffer(nPoints * sGout); + else fullBuffOut = new Uint8Array(nPoints * sGout); + let p = 0; + for (let i = result.length - 1; i >= 0; i--) { + fullBuffOut.set(result[i][0], p); + p += result[i][0].byteLength; + } + return fullBuffOut; + }; } - +//#endregion +//#region src/engine.js async function buildEngine(params) { - - const tm = await buildThreadManager(params.wasm, params.singleThread); - - - const curve = {}; - - curve.q = e(params.wasm.q.toString()); - curve.r = e(params.wasm.r.toString()); - curve.name = params.name; - curve.tm = tm; - curve.prePSize = params.wasm.prePSize; - curve.preQSize = params.wasm.preQSize; - curve.Fr = new WasmField1(tm, "frm", params.n8r, params.r); - curve.F1 = new WasmField1(tm, "f1m", params.n8q, params.q); - curve.F2 = new WasmField2(tm, "f2m", curve.F1); - curve.G1 = new WasmCurve(tm, "g1m", curve.F1, params.wasm.pG1gen, params.wasm.pG1b, params.cofactorG1); - curve.G2 = new WasmCurve(tm, "g2m", curve.F2, params.wasm.pG2gen, params.wasm.pG2b, params.cofactorG2); - curve.F6 = new WasmField3(tm, "f6m", curve.F2); - curve.F12 = new WasmField2(tm, "ftm", curve.F6); - - curve.Gt = curve.F12; - - buildBatchApplyKey(curve, "G1"); - buildBatchApplyKey(curve, "G2"); - buildBatchApplyKey(curve, "Fr"); - - buildMultiexp(curve, "G1"); - buildMultiexp(curve, "G2"); - - buildFFT(curve, "G1"); - buildFFT(curve, "G2"); - buildFFT(curve, "Fr"); - - buildPairing(curve); - - curve.array2buffer = function(arr, sG) { - const buff = new Uint8Array(sG*arr.length); - - for (let i=0; i c.charCodeAt(0)); + const blob = new Blob([compressedCode]); + const ds = new DecompressionStream("gzip"); + const decompressedStream = blob.stream().pipeThrough(ds); + bn128wasm.code = await new Response(decompressedStream).bytes(); + } else { + const { ModuleBuilder } = await import("wasmbuilder"); + const { buildBn128: buildBn128wasm } = await import("wasmcurves"); + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBn128wasm(moduleBuilder); + if (plugins) plugins(moduleBuilder); + bn128wasm.code = moduleBuilder.build(); + bn128wasm.pq = moduleBuilder.modules.f1m.pq; + bn128wasm.pr = moduleBuilder.modules.frm.pq; + bn128wasm.pG1gen = moduleBuilder.modules.bn128.pG1gen; + bn128wasm.pG1zero = moduleBuilder.modules.bn128.pG1zero; + bn128wasm.pG1b = moduleBuilder.modules.bn128.pG1b; + bn128wasm.pG2gen = moduleBuilder.modules.bn128.pG2gen; + bn128wasm.pG2zero = moduleBuilder.modules.bn128.pG2zero; + bn128wasm.pG2b = moduleBuilder.modules.bn128.pG2b; + bn128wasm.pOneT = moduleBuilder.modules.bn128.pOneT; + bn128wasm.prePSize = moduleBuilder.modules.bn128.prePSize; + bn128wasm.preQSize = moduleBuilder.modules.bn128.preQSize; + bn128wasm.n8q = 32; + bn128wasm.n8r = 32; + bn128wasm.q = moduleBuilder.modules.bn128.q; + bn128wasm.r = moduleBuilder.modules.bn128.r; + } + const params = { + name: "bn128", + wasm: bn128wasm, + q: e("21888242871839275222246405745257275088696311157297823662689037894645226208583"), + r: e("21888242871839275222246405745257275088548364400416034343698204186575808495617"), + n8q: 32, + n8r: 32, + cofactorG2: e("30644e72e131a029b85045b68181585e06ceecda572a2489345f2299c0f9fa8d", 16), + singleThread: singleThread ? true : false + }; + const curve = await buildEngine(params); + curve.terminate = async function() { + if (!params.singleThread) { + globalThis.curve_bn128 = null; + await this.tm.terminate(); + } + }; + if (!singleThread) globalThis.curve_bn128 = curve; + return curve; } - +//#endregion +//#region src/bls12381.js globalThis.curve_bls12381 = null; - async function buildBls12381(singleThread, plugins) { - if ((!singleThread) && (globalThis.curve_bls12381)) return globalThis.curve_bls12381; - - const { ModuleBuilder } = await import('wasmbuilder'); - const { buildBls12381: buildBls12381wasm } = await import('wasmcurves'); - - const moduleBuilder = new ModuleBuilder(); - moduleBuilder.setMemory(25); - buildBls12381wasm(moduleBuilder); - - if (plugins) plugins(moduleBuilder); - - const bls12381wasm = {}; - - bls12381wasm.code = moduleBuilder.build(); - bls12381wasm.pq = moduleBuilder.modules.f1m.pq; - bls12381wasm.pr = moduleBuilder.modules.frm.pq; - bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen; - bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero; - bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b; - bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen; - bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero; - bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b; - bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT; - bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize; - bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize; - bls12381wasm.n8q = 48; - bls12381wasm.n8r = 32; - bls12381wasm.q = moduleBuilder.modules.bls12381.q; - bls12381wasm.r = moduleBuilder.modules.bls12381.r; - - - const params = { - name: "bls12381", - wasm: bls12381wasm, - q: e("1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab", 16), - r: e("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", 16), - n8q: 48, - n8r: 32, - cofactorG1: e("0x396c8c005555e1568c00aaab0000aaab", 16), - cofactorG2: e("0x5d543a95414e7f1091d50792876a202cd91de4547085abaa68a205b2e5a7ddfa628f1cb4d9e82ef21537e293a6691ae1616ec6e786f0c70cf1c38e31c7238e5", 16), - singleThread: singleThread ? true : false - }; - - const curve = await buildEngine(params); - curve.terminate = async function () { - if (!params.singleThread) { - globalThis.curve_bls12381 = null; - await this.tm.terminate(); - } - }; - - if (!singleThread) { - globalThis.curve_bls12381 = curve; - } - - return curve; + if (!singleThread && globalThis.curve_bls12381) return globalThis.curve_bls12381; + const { ModuleBuilder } = await import("wasmbuilder"); + const { buildBls12381: buildBls12381wasm } = await import("wasmcurves"); + const moduleBuilder = new ModuleBuilder(); + moduleBuilder.setMemory(25); + buildBls12381wasm(moduleBuilder); + if (plugins) plugins(moduleBuilder); + const bls12381wasm = {}; + bls12381wasm.code = moduleBuilder.build(); + bls12381wasm.pq = moduleBuilder.modules.f1m.pq; + bls12381wasm.pr = moduleBuilder.modules.frm.pq; + bls12381wasm.pG1gen = moduleBuilder.modules.bls12381.pG1gen; + bls12381wasm.pG1zero = moduleBuilder.modules.bls12381.pG1zero; + bls12381wasm.pG1b = moduleBuilder.modules.bls12381.pG1b; + bls12381wasm.pG2gen = moduleBuilder.modules.bls12381.pG2gen; + bls12381wasm.pG2zero = moduleBuilder.modules.bls12381.pG2zero; + bls12381wasm.pG2b = moduleBuilder.modules.bls12381.pG2b; + bls12381wasm.pOneT = moduleBuilder.modules.bls12381.pOneT; + bls12381wasm.prePSize = moduleBuilder.modules.bls12381.prePSize; + bls12381wasm.preQSize = moduleBuilder.modules.bls12381.preQSize; + bls12381wasm.n8q = 48; + bls12381wasm.n8r = 32; + bls12381wasm.q = moduleBuilder.modules.bls12381.q; + bls12381wasm.r = moduleBuilder.modules.bls12381.r; + const params = { + name: "bls12381", + wasm: bls12381wasm, + q: e("1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab", 16), + r: e("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", 16), + n8q: 48, + n8r: 32, + cofactorG1: e("0x396c8c005555e1568c00aaab0000aaab", 16), + cofactorG2: e("0x5d543a95414e7f1091d50792876a202cd91de4547085abaa68a205b2e5a7ddfa628f1cb4d9e82ef21537e293a6691ae1616ec6e786f0c70cf1c38e31c7238e5", 16), + singleThread: singleThread ? true : false + }; + const curve = await buildEngine(params); + curve.terminate = async function() { + if (!params.singleThread) { + globalThis.curve_bls12381 = null; + await this.tm.terminate(); + } + }; + if (!singleThread) globalThis.curve_bls12381 = curve; + return curve; } - -const bls12381r = e("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", 16); -const bn128r = e("21888242871839275222246405745257275088548364400416034343698204186575808495617"); - -const bls12381q = e("1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab", 16); -const bn128q = e("21888242871839275222246405745257275088696311157297823662689037894645226208583"); - +//#endregion +//#region src/curves.js +var bls12381r = e("73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001", 16); +var bn128r = e("21888242871839275222246405745257275088548364400416034343698204186575808495617"); +var bls12381q = e("1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab", 16); +var bn128q = e("21888242871839275222246405745257275088696311157297823662689037894645226208583"); async function getCurveFromR(r, singleThread, plugins) { - let curve; - if (eq(r, bn128r)) { - curve = await buildBn128(singleThread, plugins); - } else if (eq(r, bls12381r)) { - curve = await buildBls12381(singleThread, plugins); - } else { - throw new Error(`Curve not supported: ${toString(r)}`); - } - return curve; + let curve; + if (eq(r, bn128r)) curve = await buildBn128(singleThread, plugins); + else if (eq(r, bls12381r)) curve = await buildBls12381(singleThread, plugins); + else throw new Error(`Curve not supported: ${toString(r)}`); + return curve; } - async function getCurveFromQ(q, singleThread, plugins) { - let curve; - if (eq(q, bn128q)) { - curve = await buildBn128(singleThread, plugins); - } else if (eq(q, bls12381q)) { - curve = await buildBls12381(singleThread, plugins); - } else { - throw new Error(`Curve not supported: ${toString(q, 16)}`); - } - return curve; + let curve; + if (eq(q, bn128q)) curve = await buildBn128(singleThread, plugins); + else if (eq(q, bls12381q)) curve = await buildBls12381(singleThread, plugins); + else throw new Error(`Curve not supported: ${toString(q, 16)}`); + return curve; } - async function getCurveFromName(name, singleThread, plugins) { - let curve; - const normName = normalizeName(name); - if (["BN128", "BN254", "ALTBN128"].indexOf(normName) >= 0) { - curve = await buildBn128(singleThread, plugins); - } else if (["BLS12381"].indexOf(normName) >= 0) { - curve = await buildBls12381(singleThread, plugins); - } else { - throw new Error(`Curve not supported: ${name}`); - } - return curve; - - function normalizeName(n) { - return n.toUpperCase().match(/[A-Za-z0-9]+/g).join(""); - } - + let curve; + const normName = normalizeName(name); + if ([ + "BN128", + "BN254", + "ALTBN128" + ].indexOf(normName) >= 0) curve = await buildBn128(singleThread, plugins); + else if (["BLS12381"].indexOf(normName) >= 0) curve = await buildBls12381(singleThread, plugins); + else throw new Error(`Curve not supported: ${name}`); + return curve; + function normalizeName(n) { + return n.toUpperCase().match(/[A-Za-z0-9]+/g).join(""); + } } - -const Scalar=_Scalar; -const utils = _utils; - +//#endregion +//#region main.js +var Scalar = scalar_exports; +var utils = utils_exports; +//#endregion exports.BigBuffer = BigBuffer; exports.ChaCha = ChaCha; exports.EC = EC; diff --git a/build/threadman_thread.cjs b/build/threadman_thread.cjs new file mode 100644 index 0000000..544e5e4 --- /dev/null +++ b/build/threadman_thread.cjs @@ -0,0 +1,153 @@ +console.log("node cjs"); +//#region \0rolldown/runtime.js +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __exportAll = (all, no_symbols) => { + let target = {}; + for (var name in all) __defProp(target, name, { + get: all[name], + enumerable: true + }); + if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" }); + return target; +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) { + key = keys[i]; + if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { + get: ((k) => from[k]).bind(null, key), + enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable + }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { + value: mod, + enumerable: true +}) : target, mod)); +//#endregion +//#region src/threadman_thread.js +/** +* Worker task logic used by workerpool. +* +* This module exports a plain function that encapsulates all wasm helper +* utilities (alloc, runTask, init). The function can be: +* 1. Called directly in single-thread mode (returns the runTask function). +* 2. Stringified and embedded into a workerpool worker script for +* multi-thread mode (browser or Node.js). +* +* The exported function accepts no arguments when used as factory and returns +* the runTask function, which can then be registered with workerpool.worker(). +*/ +function thread() { + const MAXMEM = 32767; + let instance; + let memory; + let _u32 = null; + let _u8 = null; + function getU32() { + if (_u32 === null || _u32.buffer !== memory.buffer) _u32 = new Uint32Array(memory.buffer, 0, 1); + return _u32; + } + function getU8() { + if (_u8 === null || _u8.buffer !== memory.buffer) _u8 = new Uint8Array(memory.buffer); + return _u8; + } + async function init(data) { + let wasmModule; + if (data.code instanceof WebAssembly.Module) wasmModule = data.code; + else wasmModule = await WebAssembly.compile(new Uint8Array(data.code)); + memory = new WebAssembly.Memory({ + initial: data.init, + maximum: MAXMEM + }); + _u32 = null; + _u8 = null; + instance = await WebAssembly.instantiate(wasmModule, { env: { memory } }); + } + function alloc(length) { + const u32 = getU32(); + u32[0] = u32[0] + 3 & -4; + const res = u32[0]; + u32[0] += length; + if (u32[0] + length > memory.buffer.byteLength) { + const currentPages = memory.buffer.byteLength / 65536; + let requiredPages = Math.floor((u32[0] + length) / 65536) + 1; + if (requiredPages > MAXMEM) requiredPages = MAXMEM; + memory.grow(requiredPages - currentPages); + } + return res; + } + function allocBuffer(buffer) { + const src = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer); + const p = alloc(src.byteLength); + getU8().set(src, p); + return p; + } + function getBuffer(pointer, length) { + return new Uint8Array(memory.buffer, pointer, length); + } + function setBuffer(pointer, buffer) { + getU8().set(buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer), pointer); + } + function runTask(task) { + if (task[0].cmd === "INIT") return init(task[0]); + const vars = []; + const out = []; + const oldAlloc = getU32()[0]; + for (let i = 0; i < task.length; i++) { + const step = task[i]; + switch (step.cmd) { + case "ALLOCSET": + vars[step.var] = allocBuffer(step.buff); + break; + case "ALLOC": + vars[step.var] = alloc(step.len); + break; + case "SET": + setBuffer(vars[step.var], step.buff); + break; + case "CALL": { + const paramDefs = step.params; + const params = new Array(paramDefs.length); + for (let j = 0; j < paramDefs.length; j++) { + const p = paramDefs[j]; + params[j] = p.var !== void 0 ? vars[p.var] + (p.offset || 0) : p.val; + } + instance.exports[step.fnName](...params); + break; + } + case "GET": + out[step.out] = getBuffer(vars[step.var], step.len).slice(); + break; + default: throw new Error("Invalid cmd: " + step.cmd); + } + } + getU32()[0] = oldAlloc; + return out; + } + return runTask; +} +//#endregion +Object.defineProperty(exports, "__exportAll", { + enumerable: true, + get: function() { + return __exportAll; + } +}); +Object.defineProperty(exports, "__toESM", { + enumerable: true, + get: function() { + return __toESM; + } +}); +Object.defineProperty(exports, "thread", { + enumerable: true, + get: function() { + return thread; + } +}); diff --git a/build/threadman_worker.cjs b/build/threadman_worker.cjs new file mode 100644 index 0000000..0c627b2 --- /dev/null +++ b/build/threadman_worker.cjs @@ -0,0 +1,22 @@ +console.log("node cjs"); +const require_threadman_thread = require("./threadman_thread.cjs"); +let workerpool = require("workerpool"); +workerpool = require_threadman_thread.__toESM(workerpool); +//#region src/threadman_worker.js +/** +* Standalone worker entry-point for Node.js (worker_threads). +* +* This file is compiled by rollup into build/threadman_worker.cjs and loaded +* by workerpool when running in Node.js multi-thread mode. +* +* workerpool detects that it is inside a worker_threads worker via parentPort +* and calls worker.register() to expose the methods to the pool. +*/ +var runTaskFn = require_threadman_thread.thread(); +workerpool.default.worker({ runTask(task) { + const result = runTaskFn(task); + if (result instanceof Promise) return result; + if (result.length === 0) return result; + return new workerpool.default.Transfer(result, result.map((b) => b.buffer)); +} }); +//#endregion diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..3cc3406 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,33 @@ +import js from "@eslint/js"; +import globals from "globals"; + +export default [ + { ignores: ["build/**"] }, + js.configs.recommended, + { + languageOptions: { + ecmaVersion: "latest", + sourceType: "module", + globals: { + ...globals.node, + ...globals.browser, + // vitest globals (enabled via globals:true in vite.config.js) + describe: "readonly", + it: "readonly", + test: "readonly", + expect: "readonly", + beforeAll: "readonly", + afterAll: "readonly", + beforeEach: "readonly", + afterEach: "readonly", + vi: "readonly", + }, + }, + rules: { + indent: ["error", 4], + "linebreak-style": ["warn", "unix"], + quotes: ["error", "double"], + semi: ["error", "always"], + }, + }, +]; diff --git a/package-lock.json b/package-lock.json index 977eaa4..de98867 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,58 +10,99 @@ "license": "GPL-3.0", "dependencies": { "wasmbuilder": "0.0.16", - "wasmcurves": "file:../wasmcurves", - "web-worker": "1.5.0" + "wasmcurves": "https://github.com/iden3/wasmcurves.git#feat/esm-migration", + "workerpool": "10.0.1" }, "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.4", - "@rollup/plugin-node-resolve": "^15.2.1", - "@rollup/plugin-replace": "^5.0.3", - "chai": "^5.1.1", - "eslint": "^9.12.0", - "mocha": "^10.7.3", - "rollup": "^3.29.4" + "@eslint/js": "^10.0.1", + "@vitest/browser": "^4.1.1", + "@vitest/browser-playwright": "^4.1.1", + "eslint": "^10.1.0", + "globals": "^17.4.0", + "playwright": "^1.58.2", + "vite": "^8.0.2", + "vitest": "^4.1.1" } }, - "../wasmcurves": { - "version": "0.2.2", - "license": "GPL-3.0", + "node_modules/@blazediff/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", + "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.1.tgz", + "integrity": "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "wasmbuilder": "0.0.16" - }, - "devDependencies": { - "eslint": "^8.17.0", - "mocha": "^10.0.0" + "@emnapi/wasi-threads": "1.2.0", + "tslib": "^2.4.0" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "node_modules/@emnapi/runtime": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.1.tgz", + "integrity": "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.0.tgz", + "integrity": "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz", - "integrity": "sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -69,105 +110,95 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.4", + "@eslint/object-schema": "^3.0.3", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^10.2.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", - "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz", - "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.13.0", + "@eslint/core": "^1.1.1", "levn": "^0.4.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz", - "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, "node_modules/@humanfs/core": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", - "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -175,14 +206,14 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", - "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.0", - "@humanwhocodes/retry": "^0.3.0" + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" @@ -193,6 +224,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -202,9 +234,9 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -216,428 +248,618 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", - "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/@rollup/plugin-replace": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz", - "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.2.tgz", + "integrity": "sha512-sNXv5oLJ7ob93xkZ1XnxisYhGYXfaG9f65/ZgYuAu3qt7b3NadcOEhLvx28hv31PgX8SZJRYrAIPQilQmFpLVw==", "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.30.3" + "@tybys/wasm-util": "^0.10.1" }, - "engines": { - "node": ">=14.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" } }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "node_modules/@oxc-project/types": { + "version": "0.122.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.122.0.tgz", + "integrity": "sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==", "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" } }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true, "license": "MIT" }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.4.0" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.12.tgz", + "integrity": "sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.12.tgz", + "integrity": "sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==", + "cpu": [ + "arm" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==", + "cpu": [ + "s390x" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.12.tgz", + "integrity": "sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.12.tgz", + "integrity": "sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.12.tgz", + "integrity": "sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.12.tgz", + "integrity": "sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==", + "cpu": [ + "wasm32" + ], "dev": true, "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^1.1.1" + }, "engines": { - "node": ">=6" + "node": ">=14.0.0" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==", + "cpu": [ + "arm64" + ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.12.tgz", + "integrity": "sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.12.tgz", + "integrity": "sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitest/browser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.2.tgz", + "integrity": "sha512-CwdIf90LNf1Zitgqy63ciMAzmyb4oIGs8WZ40VGYrWkssQKeEKr32EzO8MKUrDPPcPVHFI9oQ5ni2Hp24NaNRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@blazediff/core": "1.9.1", + "@vitest/mocker": "4.1.2", + "@vitest/utils": "4.1.2", + "magic-string": "^0.30.21", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.1.0", + "ws": "^8.19.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.2" } }, - "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "node_modules/@vitest/browser-playwright": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.2.tgz", + "integrity": "sha512-N0Z2HzMLvMR6k/tWPTS6Q/DaRscrkax/f2f9DIbNQr+Cd1l4W4wTf/I6S983PAMr0tNqqoTL+xNkLh9M5vbkLg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "@vitest/browser": "4.1.2", + "@vitest/mocker": "4.1.2", + "tinyrainbow": "^3.1.0" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "4.1.2" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": false + } } }, - "node_modules/chalk": { + "node_modules/@vitest/expect": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.2.tgz", + "integrity": "sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.2.tgz", + "integrity": "sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.2", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "node_modules/@vitest/pretty-format": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.2.tgz", + "integrity": "sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 16" + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "node_modules/@vitest/runner": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.2.tgz", + "integrity": "sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "@vitest/utils": "4.1.2", + "pathe": "^2.0.3" }, - "engines": { - "node": ">= 8.10.0" + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.2.tgz", + "integrity": "sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.2", + "@vitest/utils": "4.1.2", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.2.tgz", + "integrity": "sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@vitest/utils": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.2.tgz", + "integrity": "sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "@vitest/pretty-format": "4.1.2", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 6" + "node": ">=0.4.0" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/color-convert": { + "node_modules/assertion-error": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=7.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -655,9 +877,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -672,73 +894,36 @@ } } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, - "license": "BSD-3-Clause", + "license": "Apache-2.0", "engines": { - "node": ">=0.3.1" + "node": ">=8" } }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/es-module-lexer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz", + "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -747,34 +932,31 @@ } }, "node_modules/eslint": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", - "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.1.0.tgz", + "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.12.0", - "@eslint/plugin-kit": "^0.2.0", - "@humanfs/node": "^0.16.5", + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.3", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.1.0", - "eslint-visitor-keys": "^4.1.0", - "espree": "^10.2.0", - "esquery": "^1.5.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -784,17 +966,15 @@ "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^10.2.4", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://eslint.org/donate" @@ -809,83 +989,61 @@ } }, "node_modules/eslint-scope": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", - "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", - "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.12.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "eslint-visitor-keys": "^5.0.1" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", - "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", - "dev": true, - "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -911,15 +1069,20 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/esutils": { "version": "2.0.3", @@ -931,6 +1094,16 @@ "node": ">=0.10.0" } }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -949,7 +1122,26 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } }, "node_modules/file-entry-cache": { "version": "8.0.0", @@ -964,24 +1156,12 @@ "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -993,15 +1173,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", @@ -1017,24 +1188,19 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -1043,48 +1209,12 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -1092,31 +1222,10 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", "dev": true, "license": "MIT", "engines": { @@ -1126,36 +1235,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -1166,110 +1245,32 @@ "node": ">= 4" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -1277,69 +1278,12 @@ "node": ">=0.10.0" } }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } + "license": "ISC" }, "node_modules/json-buffer": { "version": "3.0.1", @@ -1359,7 +1303,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/keyv": { "version": "4.5.4", @@ -1376,6 +1321,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -1384,192 +1330,376 @@ "node": ">= 0.8.0" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "dev": true, + "license": "MPL-2.0", "dependencies": { - "p-locate": "^5.0.0" + "detect-libc": "^2.0.3" }, "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=12" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/mocha": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", - "integrity": "sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==", + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.3", - "browser-stdout": "^1.3.1", - "chokidar": "^3.5.3", - "debug": "^4.3.5", - "diff": "^5.2.0", - "escape-string-regexp": "^4.0.0", - "find-up": "^5.0.0", - "glob": "^8.1.0", - "he": "^1.2.0", - "js-yaml": "^4.1.0", - "log-symbols": "^4.1.0", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "serialize-javascript": "^6.0.2", - "strip-json-comments": "^3.1.1", - "supports-color": "^8.1.1", - "workerpool": "^6.5.1", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9", - "yargs-unparser": "^2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 14.0.0" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "wrappy": "1" + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/obug": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", + "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT" + }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, + "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -1580,6 +1710,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -1595,6 +1726,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -1605,24 +1737,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -1632,162 +1752,163 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } + "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, "engines": { - "node": ">=6" + "node": ">=18" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "node": ">=14.19.0" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">=8.10.0" + "node": "^10 || ^12 || >=14" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8.0" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/rollup": { - "version": "3.29.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", - "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "node_modules/rolldown": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.12.tgz", + "integrity": "sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==", "dev": true, "license": "MIT", - "peer": true, + "dependencies": { + "@oxc-project/types": "=0.122.0", + "@rolldown/pluginutils": "1.0.0-rc.12" + }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "@rolldown/binding-android-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-arm64": "1.0.0-rc.12", + "@rolldown/binding-darwin-x64": "1.0.0-rc.12", + "@rolldown/binding-freebsd-x64": "1.0.0-rc.12", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.12", + "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.12", + "@rolldown/binding-linux-x64-musl": "1.0.0-rc.12", + "@rolldown/binding-openharmony-arm64": "1.0.0-rc.12", + "@rolldown/binding-wasm32-wasi": "1.0.0-rc.12", + "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.12", + "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.12" } }, "node_modules/shebang-command": { @@ -1795,6 +1916,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -1807,96 +1929,125 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz", + "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.4.tgz", + "integrity": "sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { - "node": ">=8" + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/tinyrainbow": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", + "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.0.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, "engines": { - "node": ">=8.0" + "node": ">=6" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -1914,116 +2065,265 @@ "punycode": "^2.1.0" } }, - "node_modules/wasmbuilder": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", - "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" - }, - "node_modules/wasmcurves": { - "resolved": "../wasmcurves", - "link": true - }, - "node_modules/web-worker": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.5.0.tgz", - "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", - "license": "Apache-2.0" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/vite": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.3.tgz", + "integrity": "sha512-B9ifbFudT1TFhfltfaIPgjo9Z3mDynBTJSUYxTjOQruf/zHH+ezCQKcoqO+h7a9Pw9Nm/OtlXAiGT1axBgwqrQ==", "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.8", + "rolldown": "1.0.0-rc.12", + "tinyglobby": "^0.2.15" }, "bin": { - "node-which": "bin/node-which" + "vite": "bin/vite.js" }, "engines": { - "node": ">= 8" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.0", + "esbuild": "^0.27.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "license": "Apache-2.0" + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/vitest": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.2.tgz", + "integrity": "sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@vitest/expect": "4.1.2", + "@vitest/mocker": "4.1.2", + "@vitest/pretty-format": "4.1.2", + "@vitest/runner": "4.1.2", + "@vitest/snapshot": "4.1.2", + "@vitest/spy": "4.1.2", + "@vitest/utils": "4.1.2", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" }, "engines": { - "node": ">=10" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.2", + "@vitest/browser-preview": "4.1.2", + "@vitest/browser-webdriverio": "4.1.2", + "@vitest/ui": "4.1.2", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==", + "license": "GPL-3.0" + }, + "node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "git+ssh://git@github.com/iden3/wasmcurves.git#6601f20df1059e29f98ea595ca12e35545c321f1", + "license": "GPL-3.0", + "dependencies": { + "wasmbuilder": "0.0.16" + } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=10" + "node": ">= 8" } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "node_modules/workerpool": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-10.0.1.tgz", + "integrity": "sha512-NAnKwZJxWlj/U1cp6ZkEtPE+GQY1S6KtOS3AlCiPfPFLxV3m64giSp7g2LsNJxzYCocDT7TSl+7T0sgrDp3KoQ==", + "license": "Apache-2.0" + }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/yocto-queue": { @@ -2031,6 +2331,7 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 358c4e9..32a2401 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,37 @@ "import": "./main.js", "require": "./build/main.cjs" }, - "browser": "./build/browser.esm.js" + "browser": { + "import": "./build/browser/browser.esm.js", + "default": "./build/browser/browser.iife.js" + }, + "default": "./main.js" + }, + "./threadman-platform": { + "node": "./src/threadman.node.js", + "browser": "./src/threadman.browser.js", + "default": "./src/threadman.node.js" + } + }, + "imports": { + "#threadman-platform": { + "node": "./src/threadman.node.js", + "browser": "./src/threadman.browser.js", + "default": "./src/threadman.node.js" } }, "scripts": { - "test": "mocha", - "build:node": "rollup -c rollup.cjs.config.js", - "build:browser": "rollup -c rollup.browser.esm.config.js", - "build": "npm run build:node && npm run build:browser" + "lint": "eslint .", + "clean": "rm -rf build", + "pretest": "npm run lint", + "test": "vitest run", + "test:node": "vitest run --project node-esm", + "test:browser": "vitest run --project browser", + "test:watch": "vitest --project node-esm", + "build:node": "vite build", + "build:browser": "vite build --mode browser", + "build:browser:iife": "vite build --mode browser-iife", + "build": "npm run clean && npm run build:node && npm run build:browser && npm run build:browser:iife" }, "repository": { "type": "git", @@ -40,16 +63,17 @@ "homepage": "https://github.com/iden3/ffjavascript", "dependencies": { "wasmbuilder": "0.0.16", - "wasmcurves": "file:../wasmcurves", - "web-worker": "1.5.0" + "wasmcurves": "https://github.com/iden3/wasmcurves.git#feat/esm-migration", + "workerpool": "10.0.1" }, "devDependencies": { - "@rollup/plugin-commonjs": "^25.0.4", - "@rollup/plugin-node-resolve": "^15.2.1", - "@rollup/plugin-replace": "^5.0.3", - "chai": "^5.1.1", - "eslint": "^9.12.0", - "mocha": "^10.7.3", - "rollup": "^3.29.4" + "@eslint/js": "^10.0.1", + "@vitest/browser": "^4.1.1", + "@vitest/browser-playwright": "^4.1.1", + "eslint": "^10.1.0", + "globals": "^17.4.0", + "playwright": "^1.58.2", + "vite": "^8.0.2", + "vitest": "^4.1.1" } } diff --git a/rollup.browser.esm.config.js b/rollup.browser.esm.config.js deleted file mode 100644 index bc07d5d..0000000 --- a/rollup.browser.esm.config.js +++ /dev/null @@ -1,42 +0,0 @@ -import commonJS from "@rollup/plugin-commonjs"; -import replace from "@rollup/plugin-replace"; -import { nodeResolve } from "@rollup/plugin-node-resolve"; -import thread from "./src/threadman_thread.js"; - -export default [ - { - input: "main.js", - output: [ - { - format: "es", - file: "build/browser.esm.js", - inlineDynamicImports: true, - }, - ], - plugins: [ - replace({ - preventAssignment: true, - changed: "replaced", - delimiters: ["", ""], - /* - * The following variable replaces to true in the build in the similar way as snarkjs does. - * https://github.com/iden3/snarkjs/blob/ef9042451f98f254b520b8ce9b9544a849e90a5d/config/rollup.iife.config.js - */ - "process.browser": true, - "import Worker from \"web-worker\"": "", - /* - Because of some frontend frameworks uses monkey patching to track UI changes or other purposes (including Angular, AngularJS, Ember.js, JQuery...), it's important to make sure that the thread function is not modified by the framework and passing in the web worker as it is. - */ - "thread.toString()": JSON.stringify(thread.toString()), - }), - commonJS(), - nodeResolve({ - browser: true, - }), - ], - treeshake: { - // remove unused imports from the build - preset: "smallest", - }, - }, -]; diff --git a/rollup.cjs.config.js b/rollup.cjs.config.js deleted file mode 100644 index f15b538..0000000 --- a/rollup.cjs.config.js +++ /dev/null @@ -1,16 +0,0 @@ -import fs from "fs"; -import { builtinModules as builtin } from "module"; - -const pkg = JSON.parse(fs.readFileSync("./package.json")); - -export default { - input: "main.js", - output: { - file: "build/main.cjs", - format: "cjs", - }, - external: [ - ...Object.keys(pkg.dependencies), - ...builtin, - ] -}; diff --git a/src/bn128.js b/src/bn128.js index 371d286..907ce15 100644 --- a/src/bn128.js +++ b/src/bn128.js @@ -15,7 +15,7 @@ export default async function buildBn128(singleThread, plugins) { //import { bn128_wasm_gzip as bn128wasmPrebuilt } from "wasmcurves"; //const { bn128_wasm_gzip: bn128wasmPrebuilt } = await import("wasmcurves"); - const { default: bn128wasmPrebuilt } = await import("wasmcurves/build/bn128_wasm_gzip.js"); + const bn128wasmPrebuilt = await import("wasmcurves/build/bn128_wasm_gzip.js"); //console.log(bn128wasmPrebuilt); bn128wasm.pq = bn128wasmPrebuilt.pq; @@ -34,7 +34,7 @@ export default async function buildBn128(singleThread, plugins) { bn128wasm.q = bn128wasmPrebuilt.q; bn128wasm.r = bn128wasmPrebuilt.r; - const compressedCode = new Uint8Array(Buffer.from(bn128wasmPrebuilt.gzipCode, "base64")); + const compressedCode = Uint8Array.from(atob(bn128wasmPrebuilt.gzipCode), c => c.charCodeAt(0)); const blob = new Blob([compressedCode]); const ds = new DecompressionStream("gzip"); diff --git a/src/engine_fft.js b/src/engine_fft.js index 2a862df..43f7a7c 100644 --- a/src/engine_fft.js +++ b/src/engine_fft.js @@ -1,4 +1,4 @@ -import {log2, buffReverseBits, array2buffer, buffer2array} from "./utils.js"; +import { log2, array2buffer, buffer2array } from "./utils.js"; import BigBuffer from "./bigbuffer.js"; @@ -110,24 +110,13 @@ export default function buildFFT(curve, groupName) { let buffOut; - // TODO: optimize. Move to wasm - // buffReverseBits(buff, sIn); - console.log("fnReversePermutation:", fnReversePermutation); - // TODO: try to do reversing for each batch separately and inside of the task const task = []; task.push({cmd: "ALLOCSET", var: 0, buff: buff}); task.push({cmd: "CALL", fnName: fnReversePermutation, params: [{var:0}, {val: bits}]}); - task.push({cmd: "GET", out:0, var: 0, len: nPoints*sOut}); + task.push({ cmd: "GET", out: 0, var: 0, len: nPoints * sIn }); const reversedBuff = await tm.queueAction(task, [buff.buffer]); - //const reversedBuff = await tm.queueAction(task, []); - - //console.log("wasm buffReverseBits:", reversedBuff[0]); - //buffReverseBits(buff, sIn); - //console.log("js buffReverseBits:", buff); - - //exit(1); buff = reversedBuff[0]; diff --git a/src/engine_multiexp.js b/src/engine_multiexp.js index 96d52f4..7ea87dd 100644 --- a/src/engine_multiexp.js +++ b/src/engine_multiexp.js @@ -1,10 +1,10 @@ import { log2 } from "./utils.js"; const pTSizes = [ - 1 , 1, 1, 1, 2, 3, 4, 5, - 6 , 7, 7, 8, 9, 10, 11, 12, - 13, 13, 14, 15, 16, 16, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17 + 1, 1, 1, 1, 2, 3, 4, 5, + 6, 7, 7, 8, 9, 10, 11, 12, + 13, 13, 14, 15, 16, 16, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17 ]; export default function buildMultiexp(curve, groupName) { @@ -12,11 +12,11 @@ export default function buildMultiexp(curve, groupName) { const tm = G.tm; async function _multiExpChunk(buffBases, buffScalars, inType, logger, logText) { - if ( ! (buffBases instanceof Uint8Array) ) { + if (!(buffBases instanceof Uint8Array)) { if (logger) logger.error(`${logText} _multiExpChunk buffBases is not Uint8Array`); throw new Error(`${logText} _multiExpChunk buffBases is not Uint8Array`); } - if ( ! (buffScalars instanceof Uint8Array) ) { + if (!(buffScalars instanceof Uint8Array)) { if (logger) logger.error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); throw new Error(`${logText} _multiExpChunk buffScalars is not Uint8Array`); } @@ -27,18 +27,18 @@ export default function buildMultiexp(curve, groupName) { if (groupName === "G1") { if (inType === "affine") { fnName = "g1m_multiexpAffine"; - sGIn = G.F.n8*2; + sGIn = G.F.n8 * 2; } else { fnName = "g1m_multiexp"; - sGIn = G.F.n8*3; + sGIn = G.F.n8 * 3; } } else if (groupName === "G2") { if (inType === "affine") { fnName = "g2m_multiexpAffine"; - sGIn = G.F.n8*2; + sGIn = G.F.n8 * 2; } else { fnName = "g2m_multiexp"; - sGIn = G.F.n8*3; + sGIn = G.F.n8 * 3; } } else { throw new Error("Invalid group"); @@ -47,7 +47,7 @@ export default function buildMultiexp(curve, groupName) { if (nPoints === 0) return G.zero; const sScalar = Math.floor(buffScalars.byteLength / nPoints); - if( sScalar * nPoints !== buffScalars.byteLength) { + if (sScalar * nPoints !== buffScalars.byteLength) { throw new Error("Scalar size does not match"); } @@ -56,17 +56,19 @@ export default function buildMultiexp(curve, groupName) { const opPromises = []; const task = [ - {cmd: "ALLOCSET", var: 0, buff: buffBases}, - {cmd: "ALLOCSET", var: 1, buff: buffScalars}, - {cmd: "ALLOC", var: 2, len: G.F.n8*3}, - {cmd: "CALL", fnName: fnName, params: [ - {var: 0}, //pBases - {var: 1}, // pScalars - {val: sScalar}, // scalarSize - {val: nPoints}, // nPoints - {var: 2} // pr - ]}, - {cmd: "GET", out: 0, var: 2, len: G.F.n8*3} + { cmd: "ALLOCSET", var: 0, buff: buffBases }, + { cmd: "ALLOCSET", var: 1, buff: buffScalars }, + { cmd: "ALLOC", var: 2, len: G.F.n8 * 3 }, + { + cmd: "CALL", fnName: fnName, params: [ + { var: 0 }, //pBases + { var: 1 }, // pScalars + { val: sScalar }, // scalarSize + { val: nPoints }, // nPoints + { var: 2 } // pr + ] + }, + { cmd: "GET", out: 0, var: 2, len: G.F.n8 * 3 } ]; opPromises.push( // transfer ownership of the buffers to the worker thread @@ -76,9 +78,9 @@ export default function buildMultiexp(curve, groupName) { const result = await Promise.all(opPromises); let res = G.zero; - for (let i=result.length-1; i>=0; i--) { + for (let i = result.length - 1; i >= 0; i--) { if (!G.isZero(res)) { - for (let j=0; jMAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; - if (chunkSize MAX_CHUNK_SIZE) chunkSize = MAX_CHUNK_SIZE; + if (chunkSize < MIN_CHUNK_SIZE) chunkSize = MIN_CHUNK_SIZE; console.log("nChunks", nChunks); console.log("effective nChunks", nPoints / chunkSize); - for (let i=0; i { if (logger) logger.debug(`Multiexp end: ${logText}: ${i}/${nPoints}`); @@ -152,10 +153,10 @@ export default function buildMultiexp(curve, groupName) { })); } - result = await Promise.all(opPromises); + const result = await Promise.all(opPromises); let res = G.zero; - for (let i=result.length-1; i>=0; i--) { + for (let i = result.length - 1; i >= 0; i--) { res = G.add(res, result[i]); } diff --git a/src/f1field.js b/src/f1field.js index 5a93b4e..7f17aff 100644 --- a/src/f1field.js +++ b/src/f1field.js @@ -1,4 +1,3 @@ -/* global BigInt */ import * as Scalar from "./scalar.js"; import * as futils from "./futils.js"; import buildSqrt from "./fsqrt.js"; diff --git a/src/polfield.js b/src/polfield.js index 467645f..a27756c 100644 --- a/src/polfield.js +++ b/src/polfield.js @@ -47,7 +47,7 @@ export default class PolField { this.roots = []; -/* for (let i=0; i<16; i++) { + /* for (let i=0; i<16; i++) { let r = this.F.one; n = 1 << i; const rootsi = new Array(n); diff --git a/src/random.js b/src/random.js index 4637b61..d992235 100644 --- a/src/random.js +++ b/src/random.js @@ -1,19 +1,14 @@ import ChaCha from "./chacha.js"; -import crypto from "crypto"; export function getRandomBytes(n) { let array = new Uint8Array(n); - if (process.browser) { // Browser - if (typeof globalThis.crypto !== "undefined") { // Supported - globalThis.crypto.getRandomValues(array); - } else { // fallback - for (let i=0; i>>0; - } - } - } - else { // NodeJS - crypto.randomFillSync(array); + if (typeof globalThis.crypto !== "undefined") { + globalThis.crypto.getRandomValues(array); + } else if (typeof require === "function") { + // Node.js <18: globalThis.crypto not available; use the built-in module. + require("crypto").randomFillSync(array); + } else { + throw new Error("No cryptographically secure random source available."); } return array; } @@ -22,7 +17,7 @@ export function getRandomSeed() { const arr = getRandomBytes(32); const arrV = new Uint32Array(arr.buffer); const seed = []; - for (let i=0; i<8; i++) { + for (let i = 0; i < 8; i++) { seed.push(arrV[i]); } return seed; diff --git a/src/scalar.js b/src/scalar.js index 8f3a3c3..f07bf83 100644 --- a/src/scalar.js +++ b/src/scalar.js @@ -1,5 +1,4 @@ -/* global BigInt */ const hexLen = [ 0, 1, 2, 2, 3, 3, 3, 3, 4 ,4 ,4 ,4 ,4 ,4 ,4 ,4]; export function fromString(s, radix) { diff --git a/src/threadman.browser.js b/src/threadman.browser.js new file mode 100644 index 0000000..b3a6851 --- /dev/null +++ b/src/threadman.browser.js @@ -0,0 +1,30 @@ +// The complete worker script is computed at build time by workerScriptPlugin +// in vite.config.js and inlined here as a string constant. Nothing in this +// module depends on runtime function serialisation (thread.toString()) or on +// workerpool's generated embeddedWorker import — both of those happen once +// during the build, immune to any monkey-patching by zone.js or other libs. +import workerScript from "virtual:worker-script"; + +export function getConcurrency() { + return (typeof navigator === "object" && navigator.hardwareConcurrency) || 2; +} + +export function getWorkerType() { + return "web"; +} + +// Workers are not available in headless/SSR browser contexts. +export function supportsWorkers() { + return typeof Worker !== "undefined"; +} + +// Lazily created so Blob/URL are only accessed when a pool is first needed. +let _workerSource = null; + +export function getWorkerSource() { + if (_workerSource) return _workerSource; + + const blob = new Blob([workerScript], { type: "application/javascript" }); + _workerSource = (globalThis.URL ? globalThis.URL : globalThis.webkitURL).createObjectURL(blob); + return _workerSource; +} diff --git a/src/threadman.js b/src/threadman.js index 60bbf09..be02af6 100644 --- a/src/threadman.js +++ b/src/threadman.js @@ -17,48 +17,23 @@ along with wasmsnark. If not, see . */ -// const MEM_SIZE = 1000; // Memory size in 64K Pakes (512Mb) -const MEM_SIZE = 25; // Memory size in 64K Pakes (1600Kb) - +// const MEM_SIZE = 1000; // Memory size in 64K Pages (512Mb) +const MEM_SIZE = 25; // Memory size in 64K Pages (1600Kb) import thread from "./threadman_thread.js"; -import os from "os"; -import Worker from "web-worker"; - -class Deferred { - constructor() { - this.promise = new Promise((resolve, reject)=> { - this.reject = reject; - this.resolve = resolve; - }); - } -} - -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} - -let workerSource; - -const threadStr = `(${thread.toString()})(self)`; -if(process.browser) { - if(globalThis?.Blob) { - const threadBytes= new TextEncoder().encode(threadStr); - const workerBlob = new Blob([threadBytes], { type: "application/javascript" }) ; - workerSource = URL.createObjectURL(workerBlob); - } else { - workerSource = "data:application/javascript;base64," + globalThis.btoa(threadStr); - } -} else { - workerSource = "data:application/javascript;base64," + Buffer.from(threadStr).toString("base64"); -} - +import workerpool from "workerpool"; +import { + getConcurrency, + getWorkerType, + supportsWorkers, + getWorkerSource, +} from "#threadman-platform"; export default async function buildThreadManager(wasm, singleThread) { const tm = new ThreadManager(); - tm.memory = new WebAssembly.Memory({initial:MEM_SIZE}); + tm.memory = new WebAssembly.Memory({ initial: MEM_SIZE }); tm.u8 = new Uint8Array(tm.memory.buffer); tm.u32 = new Uint32Array(tm.memory.buffer); @@ -69,11 +44,11 @@ export default async function buildThreadManager(wasm, singleThread) { "memory": tm.memory } }); - - if(process.browser && !globalThis?.Worker) { + + if (!supportsWorkers()) { singleThread = true; } - + tm.singleThread = singleThread; tm.initalPFree = tm.u32[0]; // Save the Pointer to free space. tm.pq = wasm.pq; @@ -87,9 +62,6 @@ export default async function buildThreadManager(wasm, singleThread) { tm.code = wasm.code; tm.wasmModule = wasmModule; - // tm.pTmp0 = tm.alloc(curve.G2.F.n8*3); - // tm.pTmp1 = tm.alloc(curve.G2.F.n8*3); - if (singleThread) { tm.taskManager = thread(); await tm.taskManager([{ @@ -97,176 +69,43 @@ export default async function buildThreadManager(wasm, singleThread) { init: MEM_SIZE, code: tm.code.slice() }]); - tm.concurrency = 1; + tm.concurrency = 1; } else { - tm.workers = []; - tm.pendingDeferreds = []; - tm.working = []; - tm.initialized = []; - tm.initializing = []; - tm.terminating = []; - - let concurrency = 2; - if (process.browser) { - if (typeof navigator === "object" && navigator.hardwareConcurrency) { - concurrency = navigator.hardwareConcurrency; - } - } else { - concurrency = os.cpus().length; - } - - if(concurrency === 0){ - concurrency = 2; - } - - //concurrency = 10; // For testing + const rawConcurrency = getConcurrency(); + const concurrency = Math.min(Math.max(rawConcurrency, 2), 64); - // Limit to 64 threads for memory reasons. - if (concurrency>64) concurrency=64; tm.concurrency = concurrency; - // for (let i = 0; i<1; i++) { - // - // tm.workers[i] = new Worker(workerSource); - // - // tm.workers[i].addEventListener("message", getOnMsg(i)); - // //tm.workers[i].addEventListener("error", getOnError(i)); - // - // tm.working[i]=false; - // } - // - // const initPromises = []; - // for (let i=0; i { - this.initialized[i] = true; - }); - } - startSyncOp() { if (this.oldPFree !== 0) throw new Error("Sync operation in progress"); this.oldPFree = this.u32[0]; @@ -278,67 +117,14 @@ export class ThreadManager { this.oldPFree = 0; } - async postAction(workerId, e, transfers, _deferred) { - if (this.working[workerId]) { - throw new Error("Posting a job to a working worker"); - } - this.working[workerId] = true; - - this.pendingDeferreds[workerId] = _deferred ? _deferred : new Deferred(); - await this.workers[workerId].postMessage(e, transfers); - - return this.pendingDeferreds[workerId].promise; - } - - async processWorks() { - - //console.log("this.actionQueue.length:", this.actionQueue.length); - - for (let i=0; (i 0); i++) { - if (this.workers[i] && this.initialized[i] && !this.working[i]) { - const work = this.actionQueue.shift(); - await this.postAction(i, work.data, work.transfers, work.deferred); - } - } - - // Initialize more workers if needed - if (this.actionQueue.length > 0) { - // Find a worker that is not initialized yet - let initializingCount = 0; - for (let i=0; i= this.actionQueue.length) break; - - // Initialize this worker - console.log(`Worker ${i} not initialized yet. Initializing...`); - initializingCount++; - await this.startWorker(i); - //this.startWorker(i); - } - } - } - async queueAction(actionData, transfers) { - const d = new Deferred(); - if (this.singleThread) { - const res = this.taskManager(actionData); - d.resolve(res); - } else { - // Wait if queue is too large - // while (this.actionQueue.length >= this.concurrency * 2) { - // await sleep(10); - // } - this.actionQueue.push({ - data: actionData, - transfers: transfers, - deferred: d - }); - await this.processWorks(); + return this.taskManager(actionData); } - return d.promise; + + // Callers pass only consumed input buffers in `transfers`; those + // ArrayBuffers are transferred zero-copy to the worker thread. + return this.pool.exec("runTask", [actionData], { transfer: transfers }); } resetMemory() { @@ -352,7 +138,7 @@ export class ThreadManager { } getBuff(pointer, length) { - return this.u8.slice(pointer, pointer+ length); + return this.u8.slice(pointer, pointer + length); } setBuff(pointer, buffer) { @@ -360,19 +146,16 @@ export class ThreadManager { } alloc(length) { - while (this.u32[0] & 3) this.u32[0]++; // Return always aligned pointers + // Branchless 4-byte alignment: same result as the alignment loop. + this.u32[0] = (this.u32[0] + 3) & ~3; const res = this.u32[0]; this.u32[0] += length; return res; } async terminate() { - //console.log("terminate!!!"); - for (let i=0; i memory.buffer.byteLength) { const currentPages = memory.buffer.byteLength / 0x10000; - let requiredPages = Math.floor((u32[0] + length) / 0x10000)+1; - if (requiredPages>MAXMEM) requiredPages=MAXMEM; - memory.grow(requiredPages-currentPages); - console.log("Growing memory to", memory.buffer.byteLength / 1024 / 1024, "MB"); + let requiredPages = Math.floor((u32[0] + length) / 0x10000) + 1; + if (requiredPages > MAXMEM) requiredPages = MAXMEM; + memory.grow(requiredPages - currentPages); + // memory.buffer changed — cached views are now stale. } return res; } function allocBuffer(buffer) { - const p = alloc(buffer.byteLength); - setBuffer(p, buffer); + const src = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer); + const p = alloc(src.byteLength); + // getU8() handles re-creation if alloc() triggered a grow. + getU8().set(src, p); return p; } function getBuffer(pointer, length) { - // const u8 = new Uint8Array(memory.buffer); - // return new Uint8Array(u8.buffer, u8.byteOffset + pointer, length); return new Uint8Array(memory.buffer, pointer, length); } function setBuffer(pointer, buffer) { - const u8 = new Uint8Array(memory.buffer); - u8.set(new Uint8Array(buffer), pointer); + getU8().set(buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer), pointer); } function runTask(task) { - clearTimeout(terminationTimer); if (task[0].cmd === "INIT") { + // INIT is the only async path — return a Promise so workerpool + // can await it; all other tasks execute synchronously to prevent + // concurrent execution of tasks within the same worker. return init(task[0]); } - const ctx = { - vars: [], - out: [] - }; - const u32a = new Uint32Array(memory.buffer, 0, 1); - const oldAlloc = u32a[0]; - for (let i=0; i 25) { - console.log("tasks", task); - console.trace(); - } - ctx.vars[task[i].var] = allocBuffer(task[i].buff); + vars[step.var] = allocBuffer(step.buff); break; case "ALLOC": - if (task[i].len / 1024 / 1024 > 25) { - console.log("tasks", task); - console.trace(); - } - ctx.vars[task[i].var] = alloc(task[i].len); + vars[step.var] = alloc(step.len); break; case "SET": - setBuffer(ctx.vars[task[i].var], task[i].buff); + setBuffer(vars[step.var], step.buff); break; case "CALL": { - const params = []; - for (let j=0; j0) { - terminationTimer = setTimeout( () => { - console.log("Shutting down thread due to inactivity"); - terminate(); - }, terminationTimeout); - } - } - - function terminate() { - clearTimeout(terminationTimer); - //instance = null; - //memory = null; - if (self) { - console.log("TERMINATE"); - self.postMessage({status: "terminated"}); - self.close(); - } + // Reclaim task-local allocations. getU32() handles a post-grow buffer. + getU32()[0] = oldAlloc; + return out; } return runTask; diff --git a/src/threadman_worker.js b/src/threadman_worker.js new file mode 100644 index 0000000..8c07e5c --- /dev/null +++ b/src/threadman_worker.js @@ -0,0 +1,24 @@ +/** + * Standalone worker entry-point for Node.js (worker_threads). + * + * This file is compiled by rollup into build/threadman_worker.cjs and loaded + * by workerpool when running in Node.js multi-thread mode. + * + * workerpool detects that it is inside a worker_threads worker via parentPort + * and calls worker.register() to expose the methods to the pool. + */ +import workerpool from "workerpool"; +import thread from "./threadman_thread.js"; + +const runTaskFn = thread(); + +workerpool.worker({ + runTask(task) { + const result = runTaskFn(task); + // INIT path: runTaskFn returns a Promise — let workerpool await it. + if (result instanceof Promise) return result; + // Non-INIT path: transfer output Uint8Arrays zero-copy to the main thread. + if (result.length === 0) return result; + return new workerpool.Transfer(result, result.map(b => b.buffer)); + } +}); diff --git a/src/utils.js b/src/utils.js index f1eb893..8e69bd0 100644 --- a/src/utils.js +++ b/src/utils.js @@ -1,4 +1,3 @@ -/* global BigInt */ import * as Scalar from "./scalar.js"; export function stringifyBigInts(o) { diff --git a/test/algebra.js b/test/algebra.js index d401dd5..619ec5b 100644 --- a/test/algebra.js +++ b/test/algebra.js @@ -17,23 +17,20 @@ zksnark JavaScript library. If not, see . */ -import * as chai from "chai"; import * as Scalar from "../src/scalar.js"; import buildBn128 from "../src/bn128.js"; import F1Field from "../src/f1field.js"; +import { describe, it, beforeAll, afterAll, assert } from "vitest"; -const assert = chai.assert; - -describe("F1 testing", function() { - this.timeout(0); +describe("F1 testing", function () { let bn128; - before( async() => { + beforeAll(async () => { bn128 = await buildBn128(); }); - after( async() => { + afterAll(async () => { bn128.terminate(); }); @@ -47,8 +44,8 @@ describe("F1 testing", function() { it("Should multiply and divide in F1", () => { const a = bn128.F1.e("1"); const b = bn128.F1.e("-1"); - const c = bn128.F1.mul(a,b); - const d = bn128.F1.div(c,b); + const c = bn128.F1.mul(a, b); + const d = bn128.F1.div(c, b); assert(bn128.F1.eq(a, d)); }); @@ -64,7 +61,7 @@ describe("F1 testing", function() { it("Should compute sqrt of 100 random numbers", () => { const F = new F1Field(bn128.r); - for (let j=0;j<100; j++) { + for (let j = 0; j < 100; j++) { let a = F.random(); let s = F.sqrt(a); if (s != null) { @@ -74,14 +71,13 @@ describe("F1 testing", function() { }); }); -describe("Curve G1 Test", function() { - this.timeout(0); +describe("Curve G1 Test", function () { let bn128; - before( async() => { + beforeAll(async () => { bn128 = await buildBn128(); }); - after( async() => { + afterAll(async () => { bn128.terminate(); }); @@ -107,18 +103,17 @@ describe("Curve G1 Test", function() { }); }); -describe("Curve G2 Test", function() { - this.timeout(0); +describe("Curve G2 Test", function () { let bn128; - before( async() => { + beforeAll(async () => { bn128 = await buildBn128(); }); - after( async() => { + afterAll(async () => { bn128.terminate(); }); - it ("r*one == 0", () => { + it("r*one == 0", () => { const res = bn128.G2.timesScalar(bn128.G2.g, bn128.r); assert(bn128.G2.eq(res, bn128.G2.zero), "G2 does not have range r"); @@ -144,14 +139,13 @@ describe("Curve G2 Test", function() { }); }); -describe("F6 testing", function() { - this.timeout(0); +describe("F6 testing", function () { let bn128; - before( async() => { + beforeAll(async () => { bn128 = await buildBn128(); }); - after( async() => { + afterAll(async () => { bn128.terminate(); }); @@ -167,21 +161,20 @@ describe("F6 testing", function() { [Scalar.e("10"), Scalar.e("9")], [Scalar.e("8"), Scalar.e("7")] ]); - const c = bn128.F6.mul(a,b); - const d = bn128.F6.div(c,b); + const c = bn128.F6.mul(a, b); + const d = bn128.F6.div(c, b); assert(bn128.F6.eq(a, d)); }); }); -describe("F12 testing", function() { - this.timeout(0); +describe("F12 testing", function () { let bn128; - before( async() => { + beforeAll(async () => { bn128 = await buildBn128(); }); - after( async() => { + afterAll(async () => { bn128.terminate(); }); @@ -210,21 +203,20 @@ describe("F12 testing", function() { [Scalar.e("2"), Scalar.e("1")] ] ]); - const c = bn128.F12.mul(a,b); - const d = bn128.F12.div(c,b); + const c = bn128.F12.mul(a, b); + const d = bn128.F12.div(c, b); assert(bn128.F12.eq(a, d)); }); }); -describe("Pairing", function() { - this.timeout(0); +describe("Pairing", function () { let bn128; - before( async() => { + beforeAll(async () => { bn128 = await buildBn128(); }); - after( async() => { + afterAll(async () => { bn128.terminate(); }); @@ -256,7 +248,7 @@ describe("Pairing", function() { }) */ it("Should generate another pairing pairing", () => { - for (let i=0; i<1; i++) { + for (let i = 0; i < 1; i++) { const g1a = bn128.G1.timesScalar(bn128.G1.g, 10); const g2a = bn128.G2.timesScalar(bn128.G2.g, 1); @@ -298,26 +290,25 @@ describe("Pairing", function() { }); }); -describe("Compressed Form", function() { - this.timeout(0); +describe("Compressed Form", function () { let bn128; - before( async() => { + beforeAll(async () => { bn128 = await buildBn128(); }); - after( async() => { + afterAll(async () => { bn128.terminate(); }); it("Should test rpr of G2", () => { const P1 = bn128.G2.fromObject([ [ - Scalar.e("1b2327ce7815d3358fe89fd8e5695305ed23682db29569f549ab8f48cae1f1c4",16), - Scalar.e("1ed41ca6b3edc06237af648f845c270ff83bcde333f17863c1b71a43b271b46d",16) + Scalar.e("1b2327ce7815d3358fe89fd8e5695305ed23682db29569f549ab8f48cae1f1c4", 16), + Scalar.e("1ed41ca6b3edc06237af648f845c270ff83bcde333f17863c1b71a43b271b46d", 16) ], [ - Scalar.e("122057912ab892abcf2e729f0f342baea3fe1b484840eb97c7d78cd7530f4ab5",16), - Scalar.e("2cb317fd40d56eeb17b0c1ff9443661a42ec00cea060012873b3f643f1a5bff8",16) + Scalar.e("122057912ab892abcf2e729f0f342baea3fe1b484840eb97c7d78cd7530f4ab5", 16), + Scalar.e("2cb317fd40d56eeb17b0c1ff9443661a42ec00cea060012873b3f643f1a5bff8", 16) ], [ Scalar.one, @@ -334,6 +325,6 @@ describe("Compressed Form", function() { console.log(bn128.G2.toString(P2, 16)); */ - assert(bn128.G2.eq(P1,P2)); + assert(bn128.G2.eq(P1, P2)); }); }); diff --git a/test/bn128.js b/test/bn128.js index c6c6291..383a8e1 100644 --- a/test/bn128.js +++ b/test/bn128.js @@ -1,26 +1,24 @@ -import * as chai from "chai"; import buildBn128 from "../src/bn128.js"; -import {log2} from "../src/utils.js"; +import { log2 } from "../src/utils.js"; import BigBuffer from "../src/bigbuffer.js"; +import { describe, it, beforeAll, afterAll, assert } from "vitest"; -const assert = chai.assert; -describe("bn128", async function () { - this.timeout(0); +describe("bn128", function () { const logger = { - error: (msg) => { console.log("ERROR: "+msg); }, - warning: (msg) => { console.log("WARNING: "+msg); }, - info: (msg) => { console.log("INFO: "+msg); }, - debug: (msg) => { console.log("DEBUG: "+msg); }, + error: (msg) => { console.log("ERROR: " + msg); }, + warning: (msg) => { console.log("WARNING: " + msg); }, + info: (msg) => { console.log("INFO: " + msg); }, + debug: (msg) => { console.log("DEBUG: " + msg); }, }; let bn128; - before( async() => { + beforeAll(async () => { bn128 = await buildBn128(); console.log(bn128.Fr.toString(bn128.Fr.w[28])); }); - after( async() => { + afterAll(async () => { bn128.terminate(); }); @@ -29,20 +27,20 @@ describe("bn128", async function () { const G1 = bn128.G1; const a = []; - for (let i=0; i<8; i++) a[i] = Fr.e(i+1); + for (let i = 0; i < 8; i++) a[i] = Fr.e(i + 1); const aG_expected = []; - for (let i=0; i<8; i++) aG_expected[i] = G1.timesFr(G1.g, a[i]); + for (let i = 0; i < 8; i++) aG_expected[i] = G1.timesFr(G1.g, a[i]); const A = await bn128.Fr.fft(a); const AG = []; - for (let i=0; i<8; i++) AG[i] = G1.timesFr(G1.g, A[i]); + for (let i = 0; i < 8; i++) AG[i] = G1.timesFr(G1.g, A[i]); const aG_calculated = await G1.ifft(AG, "jacobian", "jacobian"); - for (let i=0; i<8; i++) { + for (let i = 0; i < 8; i++) { assert(G1.eq(aG_calculated[i], aG_expected[i])); } }); @@ -51,23 +49,23 @@ describe("bn128", async function () { it("It shoud do a big FFT/IFFT in Fr", async () => { const Fr = bn128.Fr; - const N = 1<<10; + const N = 1 << 10; - const a = new BigBuffer(N*bn128.Fr.n8); - for (let i=0; i { const Fr = bn128.Fr; - const N = 8192*16; + const N = 8192 * 16; const a = []; - for (let i=0; i { const Fr = bn128.Fr; const G1 = bn128.G1; - const N = 1<<13; + const N = 1 << 13; const oldS = Fr.s; - Fr.s = log2(N)-1; + Fr.s = log2(N) - 1; const a = []; - for (let i=0; i. */ -import * as chai from "chai"; import * as Scalar from "../src/scalar.js"; import PolField from "../src/polfield.js"; import ZqField from "../src/f1field.js"; +import { describe, it, assert } from "vitest"; -const assert = chai.assert; const r = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617"); @@ -124,7 +123,7 @@ describe("Polynomial field", () => { const d = PF.div(c,b); assert(PF.eq(a, d)); - }).timeout(10000); + }); it("Should evaluate and zero", () => { const PF = new PolField(new ZqField(r)); const p = [PF.F.neg(PF.F.e(2)), PF.F.e(1)]; diff --git a/test/ratzqfield.js b/test/ratzqfield.js index 3e04c22..521e67e 100644 --- a/test/ratzqfield.js +++ b/test/ratzqfield.js @@ -17,73 +17,73 @@ zksnark JavaScript library. If not, see . */ -import * as chai from "chai"; import * as Scalar from "../src/scalar.js"; import ZqField from "../src/f1field.js"; import RatField from "../src/ratfield.js"; +import { describe, it, assert } from "vitest"; -const q = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617"); +const q = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617"); const Z = new ZqField(q); const R = new RatField(Z); -const assert = chai.assert; -function r(a,b) { + +function r(a, b) { return [Z.e(a), Z.e(b)]; } describe("Rational zq Field", () => { it("Should compare correctly", () => { - assert( R.eq(r(3,5), r(6,10))); - assert(!R.eq(r(3,5), r(6,11))); + assert(R.eq(r(3, 5), r(6, 10))); + assert(!R.eq(r(3, 5), r(6, 11))); }); it("Should add correctly", () => { - const a = r(7,4); - const b = r(5,12); + const a = r(7, 4); + const b = r(5, 12); - assert(R.eq( R.add(a,b), r(13, 6))); + assert(R.eq(R.add(a, b), r(13, 6))); }); it("Should substract", () => { - const a = r(7,4); - const b = r(5,12); + const a = r(7, 4); + const b = r(5, 12); - assert(R.eq( R.sub(a,b), r(4, 3))); + assert(R.eq(R.sub(a, b), r(4, 3))); }); it("Should multiply", () => { - const a = r(7,4); - const b = r(5,12); + const a = r(7, 4); + const b = r(5, 12); - assert(R.eq( R.mul(a,b), r(35, 48))); + assert(R.eq(R.mul(a, b), r(35, 48))); }); it("Should div", () => { - const a = r(7,4); - const b = r(5,12); + const a = r(7, 4); + const b = r(5, 12); - assert(R.eq( R.div(a,b), r(7*12, 5*4))); + assert(R.eq(R.div(a, b), r(7 * 12, 5 * 4))); }); it("Should square", () => { - const a = r(7,4); + const a = r(7, 4); - assert(R.eq( R.square(a), r(49, 16))); + assert(R.eq(R.square(a), r(49, 16))); }); it("Should affine", () => { - const a = r(12,4); + const a = r(12, 4); const aa = R.affine(a); - assert(Z.eq( aa[0], Z.e(3))); - assert(Z.eq( aa[1], Z.one)); + assert(Z.eq(aa[0], Z.e(3))); + assert(Z.eq(aa[1], Z.one)); }); it("Should convert from Z to R", () => { const vz = Z.e(34); const vr = R.fromF(vz); - assert(R.eq( vr, r(34,1))); + assert(R.eq(vr, r(34, 1))); }); it("Should convert from R to Z", () => { const vr = r(32, 2); const vz = R.toF(vr); - assert(Z.eq( vz, Z.e(16))); + assert(Z.eq(vz, Z.e(16))); }); }); diff --git a/test/scalar.js b/test/scalar.js index ec8046e..d6d0438 100644 --- a/test/scalar.js +++ b/test/scalar.js @@ -1,10 +1,9 @@ -import * as chai from "chai"; import * as Scalar from "../src/scalar.js"; +import { describe, it, assert } from "vitest"; -const assert = chai.assert; -describe("Basic scalar convertions", () => { - it("Should convertion Native", () => { +describe("Basic scalar conversions", () => { + it("Should conversion Native", () => { assert(Scalar.eq(Scalar.e("0x12"), 18)); assert(Scalar.eq(Scalar.e("0x12", 16), 18)); assert(Scalar.eq(Scalar.e("12", 16), 18)); diff --git a/test/sqrt.js b/test/sqrt.js index e5c62c6..5d65bf0 100644 --- a/test/sqrt.js +++ b/test/sqrt.js @@ -17,21 +17,20 @@ zksnark JavaScript library. If not, see . */ -import * as chai from "chai"; import * as Scalar from "../src/scalar.js"; import buildBn128 from "../src/bn128.js"; import F1Field from "../src/f1field.js"; +import { describe, it, beforeAll, afterAll, assert } from "vitest"; -const assert = chai.assert; describe("Sqrt testing", () => { let bn128; - before( async() => { + beforeAll(async () => { bn128 = await buildBn128(); }); - after( async() => { + afterAll(async () => { bn128.terminate(); }); @@ -54,11 +53,11 @@ describe("Sqrt testing", () => { it("Should compute sqrt p%4 = 1", () => { const F = new F1Field(bn128.r); const e = Scalar.div(Scalar.pow(F.p, F.m), 2); - for (let i=0; i<100; i++) { + for (let i = 0; i < 100; i++) { const x2 = F.random(); const x = F.sqrt(x2); - if (x==null) { - assert(F.eq( F.pow(x2, e), F.negone)); + if (x == null) { + assert(F.eq(F.pow(x2, e), F.negone)); } else { assert(F.eq(F.square(x), x2)); } @@ -67,11 +66,11 @@ describe("Sqrt testing", () => { it("Should compute sqrt p%4 = 3", () => { const F = new F1Field(bn128.q); const e = Scalar.div(Scalar.pow(F.p, F.m), 2); - for (let i=0; i<100; i++) { + for (let i = 0; i < 100; i++) { const x2 = F.random(); const x = F.sqrt(x2); - if (x==null) { - assert(F.eq( F.pow(x2, e), F.negone)); + if (x == null) { + assert(F.eq(F.pow(x2, e), F.negone)); } else { assert(F.eq(F.square(x), x2)); } @@ -80,10 +79,10 @@ describe("Sqrt testing", () => { it("Should compute sqrt m=2 p%4 = 3", () => { const F = bn128.F2; const e = Scalar.div(Scalar.exp(F.F.p, F.m), 2); - for (let i=0; i<100; i++) { + for (let i = 0; i < 100; i++) { const x2 = F.random(); if (!F.isSquare(x2)) { - assert(F.eq( F.exp(x2, e), F.negone)); + assert(F.eq(F.exp(x2, e), F.negone)); } else { const x = F.sqrt(x2); assert(F.eq(F.square(x), x2)); diff --git a/test/utils.js b/test/utils.js index 8ff0af1..e8cea35 100644 --- a/test/utils.js +++ b/test/utils.js @@ -1,8 +1,7 @@ -import * as chai from "chai"; import * as ScalarN from "../src/scalar.js"; import * as utilsN from "../src/utils.js"; +import { describe, it, assert } from "vitest"; -const assert = chai.assert; describe("Utils native", () => { const num = ScalarN.e("21888242871839275222246405745257275088614511777268538073601725287587578984328"); @@ -31,18 +30,18 @@ describe("Utils native", () => { it("Should generate buffer little-endian without trailing non-zero element", () => { for (let i = 1; i < 33; i++) { let buff = utilsN.leInt2Buff(BigInt(42), i); - for (let t = 1; t < buff.length; t++){ + for (let t = 1; t < buff.length; t++) { assert(buff[t] === 0, true); } - } + } }); it("Should generate buffer big-endian without trailing non-zero element", () => { for (let i = 1; i < 33; i++) { let buff = utilsN.beInt2Buff(BigInt(42), i); - for (let t = 0; t < buff.length - 1; t++){ + for (let t = 0; t < buff.length - 1; t++) { assert(buff[t] === 0, true); } - } + } }); -}); \ No newline at end of file +}); diff --git a/test/zqfield.js b/test/zqfield.js index e5ebb7f..a4067eb 100644 --- a/test/zqfield.js +++ b/test/zqfield.js @@ -1,7 +1,6 @@ import ZqField from "../src/f1field.js"; import * as Scalar from "../src/scalar.js"; -import * as chai from "chai"; -const assert = chai.assert; +import { describe, it, assert } from "vitest"; const q = Scalar.fromString("21888242871839275222246405745257275088696311157297823662689037894645226208583"); const r = Scalar.fromString("21888242871839275222246405745257275088548364400416034343698204186575808495617"); diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..aca1268 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,296 @@ +import { defineConfig } from "vite"; +import { builtinModules, createRequire } from "module"; +import { fileURLToPath } from "url"; +import { resolve } from "path"; +import { readFileSync, rmSync } from "fs"; +import { playwright } from "@vitest/browser-playwright"; +import path from "path"; + +const __dirname = fileURLToPath(new URL(".", import.meta.url)); +const abs = (...p) => resolve(__dirname, ...p); +const pkg = JSON.parse(readFileSync(resolve(__dirname, "package.json"), "utf-8")); + +/** + * Removes stale CJS node-build artifacts before each build so that + * main.cjs and threadman_thread.cjs are ALWAYS produced together in the + * same Vite/rolldown run and therefore always have consistent exports. + * + * We cannot use emptyOutDir:true because build/ also contains build/browser/ + * which is produced by the separate build:browser step. + */ +const cleanNodeBuildPlugin = { + name: "clean-node-build", + buildStart() { + for (const f of ["main.cjs", "threadman_thread.cjs", "threadman_worker.cjs"]) { + rmSync(abs("build", f), { force: true }); + } + }, +}; + +/** + * Swap the Node.js platform adapter for the browser one in production builds. + * + * For tests and dev, #imports in package.json handles this via resolve.conditions. + * This plugin is a build-time fallback for environments that don't resolve + * subpath imports natively. + */ +const browserPlatformPlugin = { + name: "browser-platform-adapter", + resolveId(source) { + if (source.endsWith("threadman.node.js")) { + return abs("src/threadman.browser.js"); + } + }, +}; + +/** + * Build-time worker script inliner. + * + * Resolves the virtual import `virtual:worker-script` to a string constant + * containing the complete, self-contained browser worker script. + * + * The script is assembled once in `buildStart` by: + * 1. Reading threadman_thread.js synchronously with readFileSync and + * slicing out the function declaration (everything after "export default "). + * 2. Requiring workerpool's pre-built embeddedWorker string (the workerpool + * runtime that runs inside the worker). + * 3. Wrapping them into a self-invoking IIFE and baking the result into the + * bundle as a JSON string literal. + * + * Because the entire script is a compile-time constant there is nothing left + * for zone.js or any other monkey-patching library to intercept at runtime. + */ +let _workerScript = null; + +const workerScriptPlugin = { + name: "worker-script-inline", + + buildStart() { + if (_workerScript) return; + + const raw = readFileSync(abs("src/threadman_thread.js"), "utf-8"); + const fnSrc = raw.slice(raw.indexOf("export default ") + "export default ".length).trim(); + + // workerpool's pre-built, minified worker runtime (CJS string export). + const require = createRequire(import.meta.url); + const embeddedWorker = require("workerpool/src/generated/embeddedWorker"); + + // Strip the trailing sourceMappingURL comment that workerpool bakes + // into its minified worker string. The comment is harmless in the + // original file but inside a Blob worker it triggers a stray 404 for + // a .map file that has no meaningful URL relative to blob:. + const runtime = embeddedWorker.replace(/\/\/# sourceMappingURL=\S+\s*$/, ""); + + _workerScript = runtime + `\n;(function(){\nvar runTask=(${fnSrc})();\nworker.add({runTask:runTask});\n})();`; + }, + + resolveId(id) { + if (id === "virtual:worker-script") return "\0virtual:worker-script"; + }, + + load(id) { + if (id === "\0virtual:worker-script") { + return `export default ${JSON.stringify(_workerScript)};`; + } + }, + + // workerpool bundles two sourceMappingURL references into its dist files: + // • "//# sourceMappingURL=worker.min.js.map" — inside the embeddedWorker + // string literal; ends up as raw text in the output bundle. + // • "//# sourceMappingURL=workerpool.js.map" — end-of-file comment on + // the workerpool bundle itself. + // Neither map file exists in our output directory, so any consumer dev + // server (Vite, webpack-dev-server…) that scans the bundle for source map + // hints produces a stray 404 for each. Strip only these two specific + // references so the IIFE build's own "//# sourceMappingURL=browser.iife.js.map" + // is left intact. + renderChunk(code) { + const cleaned = code + .replace(/\/\/# sourceMappingURL=worker\.min\.js\.map/g, "") + .replace(/\/\/# sourceMappingURL=workerpool\.js\.map/g, ""); + if (cleaned !== code) return { code: cleaned, map: null }; + }, +}; + +/** + * Suppress the expected Vite warnings about Node.js built-ins being + * externalized in the browser build. These come from workerpool's browser + * bundle (dist/workerpool.js) which has conditional Node.js requires that + * are never reached when running in a browser. + */ + +function suppressNodeExternalWarnings(warning, defaultHandler) { + if ( + (warning.plugin === "vite:resolve" || warning.plugin === "rolldown:vite-resolve") && + warning.message.includes("has been externalized for browser compatibility") + ) return; + defaultHandler(warning); +} + +export default defineConfig(({ mode }) => { + const isBrowser = mode === "browser" || mode === "browser-iife"; + + const isIife = mode === "browser-iife"; + + if (isBrowser || isIife) { + if (isIife) { + // Self-contained IIFE for direct